
(* SAC List Processing definition module. *)

DEFINITION MODULE SACLIST;
 

FROM MASSTOR IMPORT LIST;


PROCEDURE ADV2(L: LIST; VAR AL,BL,LP: LIST);
(*Advance 2.  L is a list of length two or more.  a=FIRST(L),
b=SECOND(L) and LP=RED(RED(L)).*)


PROCEDURE ADV3(L: LIST; VAR AL1,AL2,AL3,LP: LIST);
(*Advance 3.  L is a list of length 3 or more.  a1, a2 and a3 are
the first three elements of L.  LP is the third reductum of L.*)


PROCEDURE ADV4(L: LIST; VAR AL1,AL2,AL3,AL4,LP: LIST);
(*Advance 4.  L is a list of length 4 or more.  a1, a2, a3, and a4
are the first 4 elements of L.  LP is the fourth reductum of L.*)


PROCEDURE AREAD(): LIST;
(*Atom read.  An atom A is read from the input stream.  Any preceding
blanks are skipped.*)


PROCEDURE AWRITE(A: LIST);
(*Atom write.  The atom A is written in the output stream.*)


PROCEDURE CCONC(L1,L2: LIST): LIST;
(*Constructive concatenation.  L1 and L2 are lists.  L is the
concatenation of L1 and L2.  The list L is constructed.*)


PROCEDURE CINV(L: LIST): LIST;
(*Constructive inverse.  L is a list.  M=INV(L).  M is constructed
using comp.*)


PROCEDURE CLOUT(L: LIST);
(*Character list out.  The input is a character list L=(C(1),C(2),...,
C(n)).  The C(i) are sequentially transmitted to the output stream 
using CWRITE.*)


PROCEDURE COMP2(AL,BL,L: LIST): LIST;
(*Composition 2.  a and b are objects.  L is a list.
M=COMP(a,COMP(b,L)).*)


PROCEDURE COMP3(AL1,AL2,AL3,L: LIST): LIST;
(*Composition 3.  a1, a2 and a3 are objects.  L is a list.
M=COMP(a1,COMP(a2,COMP(a3,L))).*)


PROCEDURE COMP4(AL1,AL2,AL3,AL4,L: LIST): LIST;
(*Composition 4.  a1, a2, a3 and a4 are objects.  L is a list.
M=COMP(a1,COMP(a2,COMP(a3,COMP(a4,l)))).*)


PROCEDURE CONC(L1,L2: LIST): LIST;
(*Concatenation.  L1 and L2 are lists.  L=CONC(L1,L2).  The list L1 is
modified.*)


PROCEDURE EQUAL(AL,BL: LIST): LIST;
(*Equal.  a and b are objects.  t=1 if a and b are equal and
otherwise t=0.*)


PROCEDURE EXTENT(AL: LIST): LIST;
(*Extent.  a is an object.  n=EXTENT(a).*)


PROCEDURE FIRST2(L: LIST; VAR AL,BL: LIST);
(*First 2.  L is a list of length 2 or more.  a=FIRST(L) and
b=SECOND(L).*)


PROCEDURE FIRST3(L: LIST; VAR AL1,AL2,AL3: LIST);
(*First 3.  L is a list of length 3 or more.  a1=FIRST(L),
a2=SECOND(L) and a3=THIRD(L).*)


PROCEDURE FIRST4(L: LIST; VAR AL1,AL2,AL3,AL4: LIST);
(*First 4.  L is a list of length 4 or more.  a1=FIRST(L),
a2=SECOND(L), a3=THIRD(L) and a4=FOURTH(L).*)


PROCEDURE FOURTH(L: LIST): LIST;
(*Fourth.  L is a list of length 4 or more.  a is the fourth element
of L.*)


PROCEDURE LAST(L: LIST): LIST;
(*Last.  L is a non-null list.  LP is the location of the last cell
of L.*)


PROCEDURE LEINST(A,IL,AL: LIST): LIST;
(*List element insertion.  A is the list (a(1), ...,a(n)) of objects.
i is a beta-integer, 0 le i le n.  a is an object.  If i=0, then
L=(a,a(1), ...,a(n)).  If i=n, then L=(a(1), ...,a(n),a).
otherwise, L=(a(1), ...,a(i),a,a(i+1), ...,a(n)).  A is modified.*)


PROCEDURE LELT(A,IL: LIST): LIST;
(*List element.  A is a list.  1 le i le LENGTH(A).  a is the i-th
element of A.*)


PROCEDURE LEROT(L,IL,JL: LIST): LIST;
(*List element rotation.  L is a list (a(1), ...,a(n)) of objects, n
gt 0.  i and j, 1 le i le j le n, are beta-integers.  If i=j
then M=L.  Otherwise M=(a(1), ...,a(i-1),a(j),a(i), ...,a(j-1),
a(j+1), ...,a(n)).  L is modified.*)


PROCEDURE LINS(AL,L: LIST);
(*List insertion.  L is a non-null list (a(1), ...,a(n)).  a is an
object.  a is inserted in L after a(1) (suffixed to L if n=1),
producing a modified list L=(a(1),a,a(2), ...,a(n)).*)


PROCEDURE LINSRT(AL,A: LIST): LIST;
(*List insertion.  A is a list (a(1), ...,a(n)) of beta-integers,
n ge 0, with a(1) lt a(2) lt  ...lt a(n).  If n=0 then B=(a).
If a lt a(1) then B=(a,a(1), ...,a(n)).  If a ge a(n) then
B=(a(1), ...,a(n),a).  Otherwise B=(a(1), ...,a(i),a,a(i+1),
 ...,a(n)) where a(i) le a lt a(i+1).  The list A is modified
to produce B.*)


PROCEDURE LIST10(AL1,AL2,AL3,AL4,AL5,AL6,AL7,AL8,AL9,AL10: LIST): LIST;
(*List, 10 elements.  a1, a2, a3, a4, a5, a6, a7, a8, a9 and a10 are
objects.  L is the list (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10).*)


PROCEDURE LIST2(AL,BL: LIST): LIST;
(*List, 2 elements.  a and b are objects.  L is the list (a,b).*)


PROCEDURE LIST3(AL1,AL2,AL3: LIST): LIST;
(*List, 3 elements.  a1, a2 and a3 are objects.  L=(a1,a2,a3).*)


PROCEDURE LIST4(AL1,AL2,AL3,AL4: LIST): LIST;
(*List, 4 elements.  a1, a2, a3 and a4 are objects.  L is the list
(a1,a2,a3,a4).*)


PROCEDURE LIST5(AL1,AL2,AL3,AL4,AL5: LIST): LIST;
(*List, 5 elements.  a1,a2,a3,a4 and a5 are objects.  L is the list
(a1,a2,a3,a4,a5).*)


PROCEDURE LREAD(): LIST;
(*List read.  The list L is read from the input stream.  Any preceding
blanks are skipped.*)


PROCEDURE LSRCH(AL,A: LIST): LIST;
(*List search.  A is a list of beta-integers, (a(1), ...,a(n)),
n ge 0.  If there is a j such that a=a(j) then i is the least
such j.  Otherwise i=0.*)


PROCEDURE LWRITE(L: LIST);
(*List write.  The input list L is written in the output stream.*)


PROCEDURE MEMBER(AL,L: LIST): LIST;
(*Membership test.  a is an object, L a list.  t=1 if a is a
member of L and otherwise t=0.*)


PROCEDURE ORDER(AL: LIST): LIST;
(*Order.  a is an object.  n=ORDER(a).*)


PROCEDURE OREAD(): LIST;
(*Object read.  The object B is read from the input stream.  Any
preceding blanks are skipped.*)


PROCEDURE OWRITE(B: LIST);
(*Object write.  The input object B is written in the output stream.*)


PROCEDURE PAIR(A,B: LIST): LIST;
(*Pair.  A=(a(1), ...,a(m)) and B=(b(1), ...,b(n)) are lists with
m and n non-negative.  C is the list (a(1),b(1), ...,a(r),b(r))
where r=MIN(m,n).*)


PROCEDURE REDUCT(A,IL: LIST): LIST;
(*Reductum.  A is a list.  i is a non-negative beta-integer not less
than LENGTH(A).  B=A, if i=0.  Otherwise, B is the i-th reductum of
A.*)


PROCEDURE RED2(L: LIST): LIST;
(*Reductum 2.  L is a list of length 2 or more.  LP=RED(RED(L)).*)


PROCEDURE RED3(L: LIST): LIST;
(*Reductum 3.  L is a list of length 3 or more.  M is the third
reductum of L.*)


PROCEDURE RED4(L: LIST): LIST;
(*Reductum 4.  L is a list of length 4 or more.  M is the fourth
reductum of L.*)


PROCEDURE SECOND(L: LIST): LIST;
(*Second.  L is a list of length 2 or more.  a is the second element
of L.*)


PROCEDURE SLELT(A,IL,AL: LIST);
(*Set list element.  A is a list.  1 le i le LENGTH(A).  The i-th
element of A is changed to a.*)


PROCEDURE SUFFIX(L,BL: LIST): LIST;
(*Suffix.  L is a list (a(1), ..., a(n)), n non-negative.  b is an
object.  LP=(a(1), ..., a(n),b).  L is modified.*)


PROCEDURE THIRD(L: LIST): LIST;
(*Third.  L is a list of length 3 or more.  a is the third element
of L.*)


END SACLIST.


