Sumar
SWI-Prolog are o bibliotecă bogată de predicate pe liste. Cunoașterea lor scurtează masiv codul — în parțial, a nu le folosi înseamnă a rescrie de la zero lucruri care există deja.
length/2
Returnează lungimea unei liste.
?- length([1, 2, 3], L).
L = 3
member/2
Verifică apartenența unui element la o listă. În mod generator, enumeră elementele.
?- member(b, [a, b, c, d]).
true
?- member(X, [a, b, c]).
X = a ;
X = b ;
X = c.
append/3
Concatenează două liste.
?- append([1, 2, 3], [4, 5], L).
L = [1, 2, 3, 4, 5]
În mod inversat, poate genera împărțiri:
?- append(X, Y, [a, b, c]).
X = [], Y = [a, b, c] ;
X = [a], Y = [b, c] ;
X = [a, b], Y = [c] ;
X = [a, b, c], Y = [].
union/3
Reuniunea a două liste, cu rezultatul o mulțime (elementele distincte).
?- union([1, 2, 3, 2], [1, 4, 3, 2], L).
L = [1, 4, 3, 2]
select/3
Șterge un element dintr-o listă. La backtracking enumeră toate aparițiile.
?- select(2, [1, 2, 3], R).
R = [1, 3].
?- select(2, [1, 2, 3, 2, 4], R).
R = [1, 3, 2, 4] ;
R = [1, 2, 3, 4] ;
false.
nth0/3, nth1/3
Extrage elementul de pe un index dat. nth0 indexează de la 0, nth1 de la 1.
?- nth0(1, [a, b, c, d], Elem).
Elem = b
reverse/2
Inversează o listă.
?- reverse([1, 2, 3], R).
R = [3, 2, 1]
permutation/2
Generează toate permutările unei liste.
?- permutation([1, 2], [X, Y]).
X = 1, Y = 2 ;
X = 2, Y = 1 ;
false.
predsort/3
Sortare cu un predicat de comparație custom. Semnătura: predsort(MyCompare, InputList, SortedList).
Comparatorul primește 3 argumente: ordinea (<, =, >) și cele două elemente.
% descrescător după al doilea element al perechii
my_cmp(X, (_, S1), (_, S2)) :-
compare(X, S2, S1).
?- predsort(my_cmp, [(a, 10), (b, 30), (c, 20)], R).
R = [(b, 30), (c, 20), (a, 10)]
numlist/3
Returnează lista intregilor din intervalul închis [A, B].
?- numlist(-2, 3, R).
R = [-2, -1, 0, 1, 2, 3]
Dacă A > B, eșuează.
string_chars/2
Împarte un sir de caractere într-o listă de caractere.
?- string_chars(prolog, R).
R = [p, r, o, l, o, g]
Predicate utile din breviar (nu predefinite)
Instructorul definește în breviar.pl:
sum/2— suma elementelorzip/3— perechi poziționatemax/2— maximul (breviar-style, cu cut)remove_duplicates/2— elimină duplicatele
A se vedea breviarul pentru definițiile.