(* ----------------------------------------------------------------------------
* $Id: SACEXT3.mi,v 1.3 1992/10/15 16:28:56 kredel Exp $
* ----------------------------------------------------------------------------
* This file is part of MAS.
* ----------------------------------------------------------------------------
* Copyright (c) 1989 - 1992 Universitaet Passau
* ----------------------------------------------------------------------------
* $Log: SACEXT3.mi,v $
* Revision 1.3 1992/10/15 16:28:56 kredel
* Changed rcsid variable
*
* Revision 1.2 1992/02/12 17:34:48 pesch
* Moved CONST definition to the right place
*
* Revision 1.1 1992/01/22 15:15:56 kredel
* Initial revision
*
* ----------------------------------------------------------------------------
*)
IMPLEMENTATION MODULE SACEXT3;
(* SAC Extensions 3 Implementation Module. *)
(* Import lists and declarations. *)
FROM MASSTOR IMPORT LIST, SIL, BETA,
INV, COMP, SRED, SFIRST, ADV, FIRST, RED;
FROM SACLIST IMPORT CONC, FIRST2, RED2, LAST;
CONST rcsidi = "$Id: SACEXT3.mi,v 1.3 1992/10/15 16:28:56 kredel Exp $";
CONST copyrighti = "Copyright (c) 1989 - 1992 Universitaet Passau";
PROCEDURE CPLEXN(L: LIST; VAR I,M: LIST);
(*Cartesian product, lexicographically next. L eq (L sub 1 , L sub 2
, ..., L sub 2n ), n ge 1, is a list such that L sub 2i is a
non-null list, and L sub 2i-1 is a non-null reductum of L sub 2i,
for 1 le i le n. I is the element (first(L sub 1 ), first(L sub 3 )
, ..., first(L sub 2n-1 )) of the cartesian product of L sub 2 ,
L sub 4 , ..., L sub 2n. If I is not the last element
(in the inverse lexicographic ordering)
of this cartesian product, then M is a list (M sub 1 ,
M sub 2 , ..., M sub 2n ), with M sub 2i eq L sub 2i,
M sub 2i-1 a non-null reductum of M sub 2i, for 1 le i le n,
and (first(M sub 1 ), first(M sub 3 ) , ..., first(M sub 2n-1 ))
the lexicographically next element. If I is the
last element, then M eq (). the list L is modified.*)
VAR A, L1, L2, LP, TL: LIST;
BEGIN
(*1*) TL:=1; I:=BETA; LP:=L;
REPEAT FIRST2(LP, L1,L2);
IF TL = 1 THEN ADV(L1, A,L1);
IF L1 <> SIL THEN SFIRST(LP,L1); TL:=0; ELSE
SFIRST(LP,L2); END;
ELSE A:=FIRST(L1); END;
I:=COMP(A,I); LP:=RED2(LP);
UNTIL (LP = SIL);
I:=INV(I);
IF TL = 0 THEN M:=L; ELSE M:=BETA; END;
RETURN;
(*4*) END CPLEXN;
PROCEDURE PERMCY(P: LIST): LIST;
(*Permutation, cyclic. P is a list (P sub 1 , P sub 2 , ...,
P sub n ), n ge 0. PP eq (P sub 2 , P sub 3 , ..., P sub n ,
P sub 1 ).*)
VAR PL, PL1, PP, PS: LIST;
BEGIN
(*1*) PP:=BETA;
IF P = SIL THEN RETURN(PP); END;
ADV(P, PL1,PS);
WHILE PS <> SIL DO ADV(PS, PL,PS); PP:=COMP(PL,PP); END;
PP:=COMP(PL1,PP); PP:=INV(PP); RETURN(PP);
(*4*) END PERMCY;
END SACEXT3.
(* -EOF- *)