Sunteți pe pagina 1din 22

Logică computaţională - Prolog

Prolog

1. Sintaxa
2. Raţionamente în Prolog explicaţii simplificate
- Raţionamente deductive prin potrivire (unificare)
- Diferenţa faţă de limbajele imperative
3. Folosirea operatorilor
4. Reguli recurente
5. Folosirea listelor
Logică computaţională - Prolog
Raţionament în Prolog - sau găsirea răspunsului la
întrebări - explicaţii simplificate

o Prolog caută în ce conditii (valori ale variabilelor) predicatele din


întrebare sunt adevărate (îndeplinite)
= demonstraţie/ execuţie scop

Dacă intrebarea are mai multe predicate, fiecare predicat din


întrebare este un subscop.
Toate predicatele din întrebare trebuie îndeplinite
pentru aceleaşi valori ale variabilelor.
? - parent(X, greta), parent(X, fred) – aceeasi valoare a lui X

Fiecare întrebare este rezolvată separat, nu se reţin valori ale


variabilelor obţinute la întrebări anterioare.
Logică computaţională - Prolog
Raţionament în Prolog - sau găsirea răspunsului la
întrebări - explicaţii simplificate

Se caută potriviri:
ana cu ana
Doi termeni se potrivesc dacă parent cu parent
o sunt identici sau
ana cu fred

o pot deveni identici pentru anumite valori ale unor variabile:


parent(X,ana) cu
potrivirile la predicate încep de la nume şi aritate. parent(fred,ana)
o variabila se poate potrivi cu o constanta
X cu fred
o variabila se poate potrivi cu un predicat care nu depinde de ea
X cu parent(Z,ana)

parent(X,ana) cu
parent(X,fred)
Logică computaţională - Prolog
Raţionament în Prolog - sau găsirea răspunsului la
întrebări - explicaţii simplificate

Potrivirile sunt căutate de sus in jos, de la stânga la dreapta.

Se afişează mereu prima potrivire găsită.

Se revine (backtracking) în punctul precedentei potriviri.

Exemplu
oras(ro, iasi). 1: nu
oras(uk, londra). 2: nu Răspuns:
oras(fr, paris). 3: da MORE X= paris more
oras(fr, lyon). 4: da MORE X= lyon

oras(ro, cluj). 5: nu

întrebare ?- oras(fr,X).
Logică computaţională - Prolog
Raţionament în Prolog - sau găsirea răspunsului la
întrebări - explicaţii simplificate
oras(ro, cluj).
oras(ro, iasi).
oras(uk, londra).
oras(fr, paris).
oras(fr, lyon).
fapte şi locuitorOras(iasi, ana).
reguli locuitorOras(iasi, mihai).
locuitorOras(cluj, marius).
locuitorTara(X,Y):-locuitorOras(Z,Y), oras(X,Z).

?- locuitorTara(Y,ana).
întrebare

Explicaţie răspuns:
locuitorTara(Y,ana):-locuitorOras(Z,ana), oras(Y,Z).
-locuitorOras(iasi,ana), oras(Y,iasi)
oras(ro,iasi)
Y=ro
Logică computaţională - Prolog
Raţionament în Prolog - explicaţii simplificate

Exemple pentru căutarea potrivirilor

p(X, 2, 2) = p(1,Y,X)
?- p(X, 2, 2) = p(1, Y, X).
No (0.00s cpu)

p(_, 2, 2) = p(1, Y, _)
?- p(_65, 2, 2) = p(1, Y, _85).
Y = 2
Yes (0.00s cpu)
Logică computaţională - Prolog
Raţionament în Prolog- explicaţii simplificate

Exemple pentru căutarea potrivirilor

f(a,g(X,Y))=f(X,Z), Z=g(W,h(X))
?- f(a, g(X, Y)) = f(X, Z), Z = g(W, h(X)).
X = a
Y = h(a)
Z = g(a, h(a))
W = a
Yes (0.00s cpu)
X = my_functor(Y)
?- X = myfunctor(Y).
X = myfunctor(Y)
Y = Y
Yes (0.00s pu)
Logică computaţională - Prolog
Raţionament în Prolog - explicaţii simplificate

Exerciţii
[Ulle Endriss, Lecture Notes An Introduction to Prolog Programming, Institute
for Logic, Language and Computation, Univ. Amsterdam, 2016]

?- f(a, b) = f(X, Y).

?- friend(mary, john) = friend(John, Mary).

a(B, B).
?- a(1, X), a(X, Y), a(Y, Z), a(Z, 100).

?- myFunctor(1, 2) = X, X = myFunctor(Y, Y).

?- f(a, _, c, d) = f(a, X, Y, _).

?- write('One '), X = write('Two ').


Logică computaţională - Prolog
Raţionament în Prolog - explicaţii simplificate
Ordinea instrucţiunilor
Raţionamentul parcurge instrucţiunile de sus în jos, de la stânga la
dreapta

Recomandări:

Începe cu faptele, grupând faptele corespunzătoarea aceluiaşi


predicat

Atenţie la ordinea regulilor şi a predicatelor dintr-o regula:

• Predicatul dintr-o regula îndeplinit pentru mai multe


instanţieri - primul
• Apar diferenţe legate de timp execuţie şi memorie
consumată – vezi recursivitate (evitat bucle infinite)
Logică computaţională - Prolog
Raţionament în Prolog - explicaţii simplificate
Ordinea instrucţiunilor - Exemplu

father(a,b).
% a este tatal lui b (1) 1 CALL grandparent(X, c)
mother(b,c). (2) 2 CALL parent(X, _1412)
(3) 3 CALL mother(X, _1412)
%b este mama lui c (3) 3 EXIT mother(b, c)
(2) 2 *EXIT parent(b, c) 21 pasi
grandparent(X,Y):-parent(X,Z), (4) 2 CALL parent(c, c)
(5) 3 CALL mother(c, c)
parent(Z,Y). (5) 3 FAIL mother(..., ...)
%X este bunicul lui Y (4) 2 NEXT parent(c, c)
(6) 3 CALL father(c, c)
(6) 3 FAIL father(..., ...)
parent(X,Y):-mother(X,Y). (4) 2 FAIL parent(..., ...) 13 pasi
(2) 2 REDO parent(X, _1412) (1) 1 CALL grandparent(a, X)
parent(X,Y):-father(X,Y). (7) 3 CALL father(X, _1412) (2) 2 CALL parent(a, _604)
(7) 3 EXIT father(a, b) (3) 3 CALL mother(a, _604)
(2) 2 EXIT parent(a, b) (3) 3 FAIL mother(..., ...)
(8) 2 CALL parent(b, c) (2) 2 NEXT parent(a, _604)
?- grandparent(X,c) (9) 3 CALL mother(b, c) (4) 3 CALL father(a, _604)
(9) 3 EXIT mother(b, c) (4) 3 EXIT father(a, b)
(8) 2 *EXIT parent(b, c) (2) 2 EXIT parent(a, b)
+(1) 1 *EXIT grandparent(a, c) (5) 2 CALL parent(b, X)
?- grandparent(a,X) (6) 3 CALL mother(b, X)
(6) 3 EXIT mother(b, c)
(5) 2 *EXIT parent(b, c)
(1) 1 *EXIT grandparent(a, c)
Logică computaţională - Prolog
Raţionament în Prolog - explicaţii simplificate
Ordinea instrucţiunilor - Exemplu

father(a,b). (1) 1 CALL grandparent(X, c)


% a este tatal lui b (2) 2 CALL parent(X, _802)
mother(b,c). (3) 3 CALL father(X, _802)
%b este mama lui c (3) 3 EXIT father(a, b) 13 pasi
(2) 2 *EXIT parent(a, b)
grandparent(X,Y):-parent(X,Z), (4) 2 CALL parent(b, c)
parent(Z,Y). (5) 3 CALL father(b, c)
%X este bunicul lui Y (5) 3 FAIL father(..., ...)
(4) 2 NEXT parent(b, c)
parent(X,Y):-father(X,Y). (6) 3 CALL mother(b, c)
parent(X,Y):-mother(X,Y). (6) 3 EXIT mother(b, c)
(4) 2 EXIT parent(b, c)
(1) 1 *EXIT grandparent(a, c)
?- grandparent(X,c)
Logică computaţională - Prolog
Raţionament în Prolog - explicaţii simplificate
Ordinea instrucţiunilor - Exemplu

grandparent(X,Y):-parent(X,Z), (1) 1 CALL grandparent(X, c)


parent(Z,Y). (2) 2 CALL parent(X, _869)
%X este bunicul lui Y (3) 3 CALL father(X, _869)
(3) 3 EXIT father(a, b) 13 pasi
parent(X,Y):-father(X,Y). (2) 2 *EXIT parent(a, b)
parent(X,Y):-mother(X,Y). (4) 2 CALL parent(b, c)
(5) 3 CALL father(b, c)
father(a,b). (5) 3 FAIL father(..., ...)
% a este tatal lui b (4) 2 NEXT parent(b, c)
mother(b,c). (6) 3 CALL mother(b, c)
%b este mama lui c (6) 3 EXIT mother(b, c)
(4) 2 EXIT parent(b, c)
(1) 1 *EXIT grandparent(a, c)
?- grandparent(X,c)
Logică computaţională - Prolog
Raţionament în Prolog - explicaţii simplificate
Ordinea instrucţiunilor - Exemplu
(1) 1 CALL grandparent(X, c)
(2) 2 CALL parent(X, _913)
grandparent(X,Y):-parent(X,Z), (3) 3 CALL mother(X, _913)
parent(Z,Y). (3) 3 EXIT mother(b, c)
%X este bunicul lui Y (2) 2 *EXIT parent(b, c)
(4) 2 CALL parent(c, c)
parent(X,Y):-mother(X,Y). (5) 3 CALL mother(c, c) 21 pasi
parent(X,Y):-father(X,Y). (5) 3 FAIL mother(..., ...)
(4) 2 NEXT parent(c, c)
father(a,b). (6) 3 CALL father(c, c)
% a este tatal lui b (6) 3 FAIL father(..., ...)
mother(b,c). (4) 2 FAIL parent(..., ...)
%b este mama lui c (2) 2 REDO parent(X, _913)
(7) 3 CALL father(X, _913)
(7) 3 EXIT father(a, b)
?- grandparent(X,c)
(2) 2 EXIT parent(a, b)
(8) 2 CALL parent(b, c)
(9) 3 CALL mother(b, c)
(9) 3 EXIT mother(b, c)
(8) 2 *EXIT parent(b, c)
(1) 1 *EXIT grandparent(a, c)
Logică computaţională - Prolog
Raţionament în Prolog - explicaţii simplificate
Ordinea instrucţiunilor - Exemplu

grandparent(X,Y):-parent(X,Z), (1) 1 CALL grandparent(X, c)


(2) 2 CALL parent(X, _913)
parent(Z,Y). (3) 3 CALL mother(X, _913)
(1) 1 CALL grandparent(a, X)
%X este bunicul lui Y (3) 3 EXIT mother(b, c) (2) 2 CALL parent(a, _594)
(2) 2 *EXIT parent(b, c) (3) 3 CALL mother(a, _594)
(4) 2 CALL parent(c, c) (3) 3 FAIL mother(..., ...)
parent(X,Y):-mother(X,Y). (2) 2 NEXT parent(a, _594)
(5) 3 CALL mother(c, c)
parent(X,Y):-father(X,Y). (5) 3 FAIL mother(..., ...) (4) 3 CALL father(a, _594)
(4) 2 NEXT parent(c, c) (4) 3 EXIT father(a, b)
(6) 3 CALL father(c, c) (2) 2 EXIT parent(a, b)
father(a,b). (5) 2 CALL parent(b, X)
(6) 3 FAIL father(..., ...)
% a este tatal lui b (4) 2 FAIL parent(..., ...) (6) 3 CALL mother(b, X)
mother(b,c). (2) 2 REDO parent(X, _913) (6) 3 EXIT mother(b, c)
(7) 3 CALL father(X, _913) (5) 2 *EXIT parent(b, c)
%b este mama lui c (1) 1 *EXIT grandparent(a, c)
(7) 3 EXIT father(a, b)
(2) 2 EXIT parent(a, b)
?- grandparent(X,c) (8) 2 CALL parent(b, c)
13 pasi
(9) 3 CALL mother(b, c)
(9) 3 EXIT mother(b, c)
(8) 2 *EXIT parent(b, c)
?- grandparent(a,X) (1) 1 *EXIT grandparent(a, c)

21 pasi
Logică computaţională - Prolog
Raţionament în Prolog - explicaţii simplificate
Ordinea instrucţiunilor - Exemplu

father(a,b). (1) 1 CALL grandparent(X, c) (1) 1 CALL grandparent(a, X)


% a este tatal lui b (2) 2 CALL parent(X, _775) (2) 2 CALL parent(a, _968)
mother(b,c). (3) 3 CALL mother(X, _775) (3) 3 CALL mother(a, _968)
(3) 3 EXIT mother(b, c) (3) 3 FAIL mother(..., ...)
%b este mama lui c (2) 2 *EXIT parent(b, c) (2) 2 NEXT parent(a, _968)
(4) 2 CALL parent(c, c) (4) 3 CALL father(a, _968)
parent(X,Y):-mother(X,Y). (5) 3 CALL mother(c, c) (4) 3 EXIT father(a, b)
parent(X,Y):-father(X,Y). (5) 3 FAIL mother(..., ...) (2) 2 EXIT parent(a, b)
(4) 2 NEXT parent(c, c) (5) 2 CALL parent(b, X)
grandparent(X,Y):-parent(X,Z), (6) 3 CALL father(c, c) (6) 3 CALL mother(b, X)
(6) 3 FAIL father(..., ...) (6) 3 EXIT mother(b, c)
parent(Z,Y). (4) 2 FAIL parent(..., ...) (5) 2 *EXIT parent(b, c)
%X este bunicul lui Y (2) 2 REDO parent(X, _775) (1) 1 *EXIT grandparent(a, c)
(7) 3 CALL father(X, _775)
(7) 3 EXIT father(a, b) 13 pasi
(2) 2 EXIT parent(a, b)
(8) 2 CALL parent(b, c)
?- grandparent(X,c) (9) 3 CALL mother(b, c)
(9) 3 EXIT mother(b, c)
(8) 2 *EXIT parent(b, c)
(1) 1 *EXIT grandparent(a, c)
?- grandparent(a,X)
21 pasi
Logică computaţională - Prolog
Raţionament în Prolog - explicaţii simplificate
Ordinea instrucţiunilor - Exemplu

father(a,b). (1) 1 CALL grandparent(X, c) (1) 1 CALL grandparent(a, X)


% a este tatal lui b (2) 2 CALL parent(_641, c) (2) 2 CALL parent(_592, X)
mother(b,c). (3) 3 CALL mother(_641, c) (3) 3 CALL mother(_592, X)
(3) 3 EXIT mother(b, c) (3) 3 EXIT mother(b, c)
%b este mama lui c (2) 2 *EXIT parent(b, c) (2) 2 *EXIT parent(b, c)
(4) 2 CALL parent(X, b) (4) 2 CALL parent(a, b)
parent(X,Y):-mother(X,Y). (5) 3 CALL mother(X, b) (5) 3 CALL mother(a, b)
parent(X,Y):-father(X,Y). (5) 3 FAIL mother(..., ...) (5) 3 FAIL mother(..., ...)
(4) 2 NEXT parent(X, b) (4) 2 NEXT parent(a, b)
grandparent(X,Y):- parent(Z,Y), (6) 3 CALL father(X, b) (6) 3 CALL father(a, b)
(6) 3 EXIT father(a, b) (6) 3 EXIT father(a, b)
parent(X,Z). (4) 2 EXIT parent(a, b) (4) 2 EXIT parent(a, b)
%X este bunicul lui Y (1) 1 *EXIT grandparent(a, c) (1) 1 *EXIT grandparent(a, c)

13 pasi 13 pasi

?- grandparent(X,c)

?- grandparent(a,X)
Logică computaţională - Prolog
Raţionament în Prolog - explicaţii simplificate
Folosirea !
Este un scop îndeplinit implicit, care blochează continuarea găsirii
potrivirilor in regula, cu backtracking
?- voluntariacceptati(X,iasi):-
student(mike). student(mike). student(ann). student(ann).
student(ann). student(ann). student(mike). student(mike).
integralist(ann). integralist(ann). integralist(ann). integralist(ann).
integralist(mike). integralist(mike). integralist(mike). integralist(mike).
locuitor(iasi,ann). locuitor(iasi,ann). locuitor(iasi,ann). locuitor(iasi,ann).
locuitor(pascani,mike). locuitor(pascani,mike). locuitor(pascani,mike). locuitor(iasi,mike).
voluntariacceptati(X,Y):- voluntariacceptati(X,Y):- voluntariacceptati(X,Y):- voluntariacceptati(X,Y):-
student(X), student(X), student(X), student(X),
integralist(X), integralist(X), integralist(X), integralist(X),
locuitor(Y,X) !, !, !,
locuitor(Y,X) locuitor(Y,X) locuitor(Y,X)
X=ann No locuitor(iasi,mike) X=ann X=ann
neindeplinit, revenire o singura potrivire
nepermisa permisa
Logică computaţională - Prolog
Raţionament în Prolog - explicaţii simplificate

Câteva legături cu Bazele teoretice ale logicii - Prolog


LINK BAZELE TEORETICE

o Raţionament deductiv – de exemplu modus ponens


Dacă
Y locuieste în orasul Z si
Dacă P1 şi P2 şi…Pn, atunci Q. Orasul Z este din tara X
atunci
P1, P2, ..,Pn sunt adevărate Y este locuitor in tara X

locuitorTara(X,Y):-
Q este adevărată locuitorOras(Z,Y),
oras(X,Z).

o Potrivirea asigură şi particularizarea unui enunţ general


locuitorOras(Z,Y)

locuitorOras(iasi,ana) !!!! Alte detalii în capitolul


Bazele teroretice ale logicii
computaţionale
Logică computaţională - Prolog
Raţionament în Prolog - explicaţii simplificate
Diferenţa faţă de limbaje imperative
Limbaj imperative (C, etc.)
Initializez :
tari[N] tablou cu tarile
Limbaj descriptive - Prolog orase[M] tablou cu orasele
oras(ro, cluj). om[K] tablou cu persoanele
oras(ro, iasi).
oras(uk, londra). Stabilesc legaturi intre tablouri:
oras(fr, paris). orasTara[M]:orasTara[i]=j spune ca oras[i]
oras(fr, lyon).
este din tara[j]
locuitorOras(iasi, ana). locOras[K]: locOras[i]=j spune ca om[i]
locuitorOras(iasi, mihai). este din oras[j]
locuitorOras(cluj, marius).

locuitorTara(X,Y):- Pentru i=0:K-1


locuitorOras(Z,Y), Daca orase[i] == numele cautat
oras(X,Z). afla oras: j= locOras[i]
afla tara: p=oras[j], tara[p]
?- locuitorTara(Y,ana). Pentru i=0:N-1,
Daca tari[i]== numele cautat
?- oras(fr,X). Pentru j=0:M-1
Daca orasTara[j]==i, raspuns!
Logică computaţională - Prolog
Raţionament în Prolog - explicaţii simplificate
Diferenţa faţă de limbajele imperative
Comparatie Limbaj descriptiv [Prolog] Limbaj imperativ [C, C++]

Continut Clauze care prezintă ce se Instrucţiuni care modifică


ştie despre problema: fapte si direct conţinutul variabilelor şi
reguli indică explicit cum să fie
rezolvată problema

Programe Compactitate
+ -
Fiecare intrebare rezolvata
separat cu instructiuni in plus
Simplitate în - +
elaborare
Uneori greu de găsit regulile Multe exemple
Logică computaţională - Prolog
Raţionament în Prolog - explicaţii simplificate
Diferenţa faţă de limbajele imperative
Comparaţie Limbaj descriptiv [Prolog] Limbaj imperativ [C, C++]

Încărcare faptelor şi regulilor în Transformarea instrucţiunilor în


Compilare
memoria de lucru a Prolog cod obiect (fisier *.obj)

Interpretor. După linkeditare


Răspunsul se obţine folosind
Se execută un fişier executabil care
Prolog.
poate fi executat de sine-stătător.
Execuţie Răspuns la intrebări –prin potriviri Se urmăreşte secvenţa de paşi
– raţionament specific uman rezultată din instrucţiuni fără alt
raţionament
Limitare la parcurgerea unui
număr mare de fapte şi reguli
Logică computaţională - Prolog
Raţionamente în Prolog - explicaţii simplificate
Repetă
Reguli de potrivire

Diferenţa dintre limbaje imperative şi descriptive


RECAPITULARE

Cum sunt parcurse clauzele?

Întrebări şi exerciţii:

Ce se poate întâmpla schimbând ordinea instrucţiunilor?

Cum se rezolvă întrebările cu mai multe predicate?

S-ar putea să vă placă și