DOMAINS
r=real
lr=r*
PREDICATES
run
lcount(lr,r) % (i,o)
lcount2(lr,r) % (i,o)
lcount2(lr,r,r) % (i,a,o)
mkln(r,lr) % (i,o)
mkln(r,lr,lr) % (i,a,o)
spprod(lr,r) %(i,o)
factrl(r,r) % (i,o)
lsum(lr,r) % (i,o)
lsum2(lr,r) % (i,o)
lsum2(lr,r,r) % (i,a,o)
lconcat(lr,lr,lr) % (i,i,o)
lrev(lr,lr) % (i,o)
lrev(lr,lr,lr) % (i,a,o)
lconcat2(lr,lr,lr) % (i,i,o)
lconcat3(lr,lr,lr) % (i,a,o)
CLAUSES
%(i,o)
lcount([],0).
lcount([_|T],R):-lcount(T,Ri),R=Ri+1.
lcount2(L,R):-lcount2(L,0,R).
lcount2([],Ri,Ri). %(i,i,o)
lcount2([_|T],Ri,R):-Ria=Ri+1,lcount2(T,Ria,R).
mkln(N,R):-N>0,mkln(N,[],R).
mkln(0,Ri,Ri). % (i,i,o)
mkln(Ni,Ri,R):-Ni>0,Nia=Ni-1,mkln(Nia,[Ni|Ri],R).
spprod([X],X).
spprod([X,Y|T],R):-Z=X*Y,spprod([Z|T],R).
factrl(N,R):-N<=170,mkln(N,L),spprod(L,R).
lsum([X],X).
lsum([H|T],R):-lsum(T,Ri),R=H+Ri.
lsum2(L,R):-lsum2(L,0,R).
lsum2([],Ri,Ri). %(i,i,o)
lsum2([H|T],Ri,R):-Ria=H+Ri,lsum2(T,Ria,R).
lconcat([],L,L).
lconcat([H|T],L,[H|R]):-lconcat(T,L,R).
lrev(L,R):-lrev(L,[],R).
lrev([],Ri,Ri). % (i,i,o)
lrev([H|T],Ri,R):-lrev(T,[H|Ri],R).
% numai (i,i,o):
lconcat2(A,B,R):-lrev(A,A2),lconcat3(A2,B,R).
lconcat3([],L,L). % (i,i,o)
lconcat3([H|T],L,R):-lconcat3(T,[H|L],R).
% exemple de handlere catre elementele si sublistele unei liste
run:-
write("______"),nl,nl,
X=[1,2],
X=[H|Tail],
write("H: "),
write(H),
nl,nl,
write("Tail: "),
write(Tail),
nl,nl,
X=[A,B|T],
write("[A,B]: "),AB=[A,B],
write(AB),
nl,nl,
write("T: "),
write(T),
nl,nl,
X=[_,C|D],
write("C: "),
write(C),
nl,nl,
write("D: "),
write(D),
nl,nl,
L=[3,4,5,6,7],
L=[_,_|TT],
write("TT: "),
write(TT),
nl,nl,
L=[_,_|[E,F|TA]],
write("E: "),
write(E),
nl,nl,
write("F: "),
write(F),
nl,nl,
write("TA: "),
write(TA),
nl,
write("______"),
nl.