a proceduralnie byłoby: prefix(P, L)
P=[]
OR // rozejście, nie xor!
X=<pierwszy L>
R=< reszta L> prefix(Pl, R)
P=<dodaj X do P>
Operacja podlisty:
Deklaratywnie:
sublist(S, L) :- prefix(S,L). sublist (S, [X|R]) :- sublist (S, R).
8. Wykład 8:
A jeszcze bardziej deklaratywnie? Tak:
- S ma być sufiksem dowolnego prefiksu. Wykorzystamy do tego conc: sublist(S.L) :- conc(P,Sf,L), conc(PP, S, P). // Sjest podlistą L wtedy, gdy P jest prefixem L a Sf jest sufiksem (zachodzi związek, że [P|Sf]==L. I : prefix P składa się z pewnej listy PP, w przypadku granicznym pustej, oraz listy S. Czyli jak w definicji: podlistą jest sufiksem dowolnego prefiksu L.
Do generowania wszystkich podlist: S niezwiązane, L związane, np. [a,b,c],
A co będzie, jeżeli przestawimy kolejność sublist? Nic nie jest związane dla pierwszego wyrażenia:
sublist(S.L) :- conc(PP, S, P), conc(P, Sf, L).
Wiemy, że:
conc([], L, L).
conc([X|R], L2, [X|RN]) :-conc(R,L2,RN).
Jak to się będzie rozwijało drzewo? Powstanie generator szablonów:
conc(L,M,N)
L<-[]
M<-N
L=[], M=_G32, N=_G32
L<-[X1|R1]
M<-I_Z1
N<-[X1|RN1]
conc (Rl, LZ1, RN1)
Rl<-[]