(* ---------------------------------------------------------------------------- * $Id: SACEXT1.mi,v 1.3 1992/10/15 16:28:54 kredel Exp $ * ---------------------------------------------------------------------------- * This file is part of MAS. * ---------------------------------------------------------------------------- * Copyright (c) 1989 - 1992 Universitaet Passau * ---------------------------------------------------------------------------- * $Log: SACEXT1.mi,v $ * Revision 1.3 1992/10/15 16:28:54 kredel * Changed rcsid variable * * Revision 1.2 1992/02/12 17:34:46 pesch * Moved CONST definition to the right place * * Revision 1.1 1992/01/22 15:15:52 kredel * Initial revision * * ---------------------------------------------------------------------------- *) IMPLEMENTATION MODULE SACEXT1; (* SAC Extensions 1 Implementation Module. *) (* Import lists and declarations. *) FROM MASSTOR IMPORT LIST, SIL, BETA, COMP, SRED, ADV, FIRST, RED; FROM SACLIST IMPORT CONC, MEMBER, EQUAL, FIRST2, LAST; FROM SACI IMPORT IDP2, IMP2, IORD2; CONST rcsidi = "$Id: SACEXT1.mi,v 1.3 1992/10/15 16:28:54 kredel Exp $"; CONST copyrighti = "Copyright (c) 1989 - 1992 Universitaet Passau"; PROCEDURE LCONC(L: LIST): LIST; (*List concatenation. L is a list (L sub 1 , ..., L sub n ), n ge 0, such that each L sub i is a list. M eq CONC(L sub 1 , ..., L sub n ). The lists L sub 1 , ..., L sub n are modified.*) VAR L1, L2, LP, LP1, M: LIST; BEGIN (*1*) IF L = SIL THEN M:=BETA; RETURN(M); END; (*2*) LP:=L; REPEAT ADV(LP, M,LP); UNTIL (M <> SIL) OR (LP = SIL); L1:=M; WHILE LP <> SIL DO ADV(LP, L2,LP); IF L2 <> SIL THEN LP1:=LAST(L1); SRED(LP1,L2); L1:=L2; END; END; RETURN(M); (*5*) END LCONC; PROCEDURE LEQUAL(A,B: LIST): LIST; (*List equality. A eq (A sub 1 , ..., A sub m ), m ge 0, and B eq (B sub 1 , ..., B sub n ), n ge 0, are two lists. b eq 1 if for each a sub i there is at least one B sub j such that A sub i eq B sub j, and for each B sub j there is at least one A sub i with B sub j eq a sub i. otherwise b eq 0.*) VAR A1, AP, B1, BL, BP: LIST; BEGIN (*1*) BL:=1; AP:=A; WHILE AP <> SIL DO ADV(AP, A1,AP); BL:=MEMBER(A1,B); IF BL = 0 THEN RETURN(BL); END; END; BP:=B; WHILE BP <> SIL DO ADV(BP, B1,BP); BL:=MEMBER(B1,A); IF BL = 0 THEN RETURN(BL); END; END; RETURN(BL); (*4*) END LEQUAL; PROCEDURE LMERGE(A,B: LIST): LIST; (*List merge. A and B are lists of objects. C is the result of merging A and B.*) VAR AL, AP, BL, BP, C, SL: LIST; BEGIN (*1*) C:=A; BP:=B; WHILE BP <> SIL DO ADV(BP, BL,BP); AP:=A; SL:=0; WHILE (AP <> SIL) AND (SL = 0) DO ADV(AP, AL,AP); SL:=EQUAL(AL,BL); END; IF SL = 0 THEN C:=COMP(BL,C); END; END; RETURN(C); (*4*) END LMERGE; END SACEXT1. (* -EOF- *)