Documente Academic
Documente Profesional
Documente Cultură
2/57
Liste
Sunt structuri care se folosesc pentru reprezentarea unei secvene ordonate de termeni Prolog. [doar, un, exemplu] [] [a, b, c, d, e] [1, 21, 4, -17] [4, [6], c, [-1, 12]] Virgula folosit n construcia listelor este doar un separator de argumente. Listele sunt secvene ordonate de termeni Prolog, deci lista [a,b,c] nu este aceeai cu lista [a, c, b].
3/57
X=a Y = [b, c, d]
4/57
Primul element din list, a, se numete i capul listei (HEAD). Lista format prin tergerea capului reprezint coada listei iniiale (TAIL): [b, c, d]. Ea poate fi mai departe prelucrat si este referita prin variabila Y.
5/57
6/57
7/57
8/57
Unificarea la liste
[a, b, c] = [c, a, b]
ntoarce No pentru c ordinea termenilor conteaz
[X] = [a, b, c]
ntoarce No pentru c cele dou liste au lungimi diferite
9/57
Unificarea la liste
[X,Y|Z] = [a, b, c, d]
ntoarce Yes i X = a, Y = b, Z = [c, d]
[X|Y] = []
ntoarce No pentru c lista vid nu poate fi descompus
[X|Y] = [a]
ntoarce Yes i X = a, Y = []
10/57
Unificarea la liste
[a, b | X] = [A, B, c] [a, b] = [b, a] [a | [b, c]] = [a, b, c] [a, [b, c]] = [a, b, c]
[a, X] = [X, b]
11/57
Unificarea la liste
[a | []] = [X] [a, b, X, c] = [A, B, Y] [H | T] = [[a, b], [c, d]] [[X],Y] = [a, b]
12/57
13/57
14/57
Vom defini predicatul apartine/2, unde primul argument reprezint elementul pentru care verificm apartenena, iar al doilea este lista. X aparine listei dac este capul listei sau dac aparine coadei acesteia.
15/57
16/57
17/57
18/57
X=3
19/57
20/57
21/57
22/57
23/57
ultim([X | []], X). ultim([_ | Rest], X) :- ultim(Rest, X). ?- ultim([1, 2, 3], X).
X=3
24/57
Parcurgem restul listei; daca gasim un element (capul listei curente) mai mare decat maximul, acesta va deveni noul maxim.
Altfel, mergem mai departe in restul listei. Recursivitatea se incheie cand ajung la lista vida si afisez argumentul corespunzator maximului.
25/57
26/57
27/57
28/57
29/57
in
restul
listei,
Recursivitatea se incheie cand ajung la lista vida si afisez argumentul corespunzator pozitiei pe care se afla maximul.
30/57
31/57
32/57
33/57
34/57
35/57
36/57
37/57
38/57
39/57
40/57
41/57
42/57
43/57
44/57
45/57
L1
46/57
9 0 3 2 4 5 6 7
Se d o list: s se obin dou liste din aceasta astfel nct prima din ele s conin elementele de pe poziiile pare iar a doua pe cele de pe poziiile impare.
Vom avea asadar o singura lista ca argument de intrare si doua liste ca argumente de iesire.
Tratam intai situatia in care lista data contine un singur element, apoi cand lista are doua elemente.
47/57
9 0 3 2 4 5 6 7
parimpar([X], [], [X]). parimpar([X, Y],[Y], [X]). parimpar([X, Y|R], [Y|R1], [X|R2]) :- parimpar(R, R1, R2). In cea de a treia clauza, mutam primul element X din lista data in lista a treia, iar pe cel de-al doilea, Y, in a doua lista. Interogare:
? pare([ion, marius, mananca, invata, mere, prolog], P, I).
P = [marius, invata, prolog] I = [ion, mananca, mere]
48/57
9 0 3 2 4 5 6 7
parimpar([X], [], [X]). parimpar([X, Y],[Y], [X]). parimpar([X, Y|R], [Y|R1], [X|R2]) :- parimpar(R, R1, R2).
49/57
Avem doua argumente de intrare, o lista si un numar care da pozitia care ne intereseaza.
Cum rezolvam problema: scadem i-ul cu cate o unitate si, in acelasi timp, scoatem cate un element din lista. Cand i-ul este 1, primul element din lista este cel cautat.
50/57
51/57
1 4 6 7 8 9 0 3 2 4 5 6 7
Avnd date o list i un element care aparine acestei liste, s se specifice pe ce poziie este situat elementul n lista dat.
Vom mai construi un predicat care sa contina si o variabila contor care este initial 1.
52/57
1 4 6 7 8 9 0 3 2 4 5 6 7
Predicatul pozx cu 4 argumente este vazut ca unul diferit de cel cu acelasi nume dar cu 3 argumente. Conditia de oprire: primul element din lista corespunde cu elementul dat.
In acest moment, contorul se unifica cu variabila aflata pe pozitia patru.
In concluzie, ideea este ca se scot elemente din lista pana cand pe prima pozitie se afla chiar ceea ce cautam.
53/57
1 4 6 7 8 9 0 3 2 4 5 6 7
pozx(L, X, P):- pozx(L, X, 1, P). pozx([X|_], X, P, P). pozx([_|R], X, C, P) :- C1 is C + 1, pozx(R, X, C1, P).
Interogarea:
? pozx([ion, petre, marin, olivia], marin, P).
P=3
54/57
55/57
56/57
Eliminarea duplicatelor
Enunt problema:
Scriei un predicat Prolog care s realizeze eliminarea duplicatelor dintr-o list dat.
Argument de intrare:
O lista data
Argument de iesire:
Lista rezultata prin eliminarea duplicatelor din lista data.
57/57
Eliminarea duplicatelor
duplicate([], []). duplicate([X|R1], L) :- apartine(X, R1), duplicate(R1, L). duplicate([X|R1], [X|R2]) :- duplicate(R1, R2). Luam fiecare element din prima lista si verificam daca apartine restului listei (adica daca mai apare in lista).
Daca nu mai apare, atunci il adaugam in lista rezultat Altfel, nu il adaugam.
Interogare
? duplicate([7, 9, 7, 11, 11], L).
L = [9, 7, 11]
58/57
Pe saptamana viitoare!