ConceptePredicate predefinite pe liste

Predicate predefinite pe liste

Lista de predicate din biblioteca standard SWI-Prolog pe care o folosim zilnic: member, append, select, nth0, length, reverse, permutation, predsort, union, numlist.

7 exerciții folosesc acest concept recursivitate-pe-listefindall-bagof-setof

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 elementelor
  • zip/3 — perechi poziționate
  • max/2 — maximul (breviar-style, cu cut)
  • remove_duplicates/2 — elimină duplicatele

A se vedea breviarul pentru definițiile.

Exerciții care folosesc acest concept