Documente Academic
Documente Profesional
Documente Cultură
L1 = [a],
L2 = [b];
L1 = [a, b],
L2 = [ ];
No
Dar este posibilă şi întrebarea “Ce liste din care se elimina a dau ca rezultat lista
[b, c]?”:
?- elim(a, L, [b, c]).
PRELUCRAREA LISTELOR ÎN PROLOG 49
L = [a, b, c];
L = [b, a, c];
L = [b, c, a];
No
Incluziunea listelor. Fie un predicat, care este adevărat, dacă o listă este
sublista alteia.
De exemplu,
sublist([c, d, e], [a, b, c, d, e, f]) este adevărat, iar
sublist([b, c, e], [a, b, c, d, e, f]) este fals. Ne putem folosi de predicatul
deja scris append. O listă S este sublistă a listei L, dacă:
1) Există o descompunere a lui L în L1 şi L2 şi
2) Există o descompunere a lui L2 în S si L3.
Implementare:
% sublist(+SubLista,+Lista)
sublist(S, L) :- append(L1, L2, L), append(S, L3, L2).
Această implementare are un mic defect: afişează lista vidă de mai multe ori.
Încercaţi să aflaţi de ce. O variantă care elimină acest defect este subset:
subset([], _).
subset([X | Rest], L) :- member(X, L), subset(Rest, L).
In plus, pentru subset nu conteaza ordinea elementelor din L.
?- test.
[bucuresti, brasov, cheia, sinaia]
[sinaia, ploiesti, bucuresti]
[bucuresti, brasov, cheia, sinaia, ploiesti]
[ploiesti, bucuresti]
Nu exista traseu.
Yes
?- sortcresc([1, 2, 3, 4]).
Yes
52 CAPITOLUL 3
?- sortcresc([1, 3, 5, 4]).
No
?- sortcresc([ ]).
Yes
din definiţia predicatului sortcresc, comportarea lui pentru liste diferite de lista
vidă rămânând aceeaşi.