Documente Academic
Documente Profesional
Documente Cultură
Prolog
Întrebări:
1. Unificarea
2. Backtracking
3. Recursivitate în Prolog
4. Controlul procesului de backtracking:
trace, cut si fail
5. Negaţia in Prolog
1. Unificarea
Unificarea se defineste ca fiind procesul de asociere
între o întrebare si o clauză.
Există 4 cazuri distincte de asociere:
Să încercam un scop
goal : place(paul, Ce).
Prolog va afişa soluţia
Ce=pizza
1 Solution
3. Recursivitate în Prolog
Recursivitatea implică definirea unui predicat în funcţie
de el însuşi.
O definiţie recursivă trebuie să aibă întotdeauna cel
puţin două părţi:
1. condiţie elementară şi
2. o parte recursivă.
Afiseaza(1) :- ! , write(‘unu’).
Afiseaza(2) :- ! , write(‘doi’).
Afiseaza(3) :- ! , write(‘trei’).
Afiseaza(4) :- ! , write(‘patru’).
goal : afiseaza(2)
goal: afiseaza
doi (2)
doi
yes
yes
Controlul procesului de backtracking:
cut
are_obligatii(X, Y) :-
debitor(Y, X). (5)
are_obligatii(X, Y) :-
creditor(X,Y). (6)
Exemplu 2:
Modificăm cele două reguli
anterioare, introducând cut
(5) are_obligatii(X, Y) :-
debitor(Y, X), !.
(6) are_obligatii(X, Y) :-
creditor(X, Y), !.
Astfel in Prolog:
daca_atunci_altfel (Cond, Ac1, Ac2) :- Cond, !, Ac1.
daca_atunci_altfel (Cond, Ac1, Ac2) :- Ac2.
Cut verde si cut roşu
Adăugarea lui cut verde nu schimba semnificaţia
procedurală , indiferent de ordinea în care se scriu clausele.
Utilizarea predicatului cut în definirea predicatului
asociat structurii de control daca_atunci_altfel introduce un
cut roşu deoarece efectul programului este total diferit dacă
se schimbă ordinea clauzelor.
Introducerea unui cut roşu modifică corespondenţa
dintre semnificaţia declarativă şi semnificaţia procedurală a
programelor Prolog. !!!
Exemplu de utilizare a predicatului cut
(verde şi roşu) pentru aflarea minimului
dintre două numere
Cut verde :
min_verde(X,Y,X) :- X <= Y , ! .
min_verde(X,Y,Y) :- X > Y , ! .
Daca schimbam cu locurile aceste doua predicate,sau
excludem ! – variabila X va obtine valoarea min din cele
doua X si Y. Dar ce se va intipmla daca vom aplica aceste
actiuni pentru fragmentul ce urmeaza ?
min_rosu(X,Y,X) :- X <= Y , !.
min_rosu(X,Y,Y).
Ce se intimpla in acest caz ?
Cut rosu
Dacă se schimbă ordinea clauzelor de definire a
predicatului min_roşu:
min2(X, Y, Y).
min2(X, Y, X) :- X =< Y, !.
atunci rezultatul programului va fi evident incorect
pentru valori X < Y.
Un rezultat incorect se va obtine si in cazul
ce urmeaza:
min2(X, Y, X) :- X =< Y.
min2(X, Y, Y). % s-a extras cut-ul
Utilizărea predicatului cut pentru
prelucrare listelor.
Aflarea elementului minim dintr-o listă cu elemente de tip
numeric: predicatul min(X,Y) este adevărat dacă şi numai
dacă Y este egal cu elementul minim din lista X.
min([X,Y],X) :- X <= Y, !.
min([X,Y],Y) :- X > Y, !.
min([H|X],Y) :- min(X,Y) , H >= Y, !.
apartine(X,[X |_ ]) :- ! . %2
apartine(X,[ _ | Y ]) :- apartine(X,Y).
Utilizărea predicatului cut pentru
prelucrare listelor. Exemple.
Atunci pentru acelasi scop
apartine(a,[a,b,c,d,a,a,k,a])
se va obtine o singura solutie :
Yes
Introducerea predicatului cut in definiţia primei clauze a
predicatului apartine aduce la creşterea eficientei
programului. Odata ce s-a descoperit că un element este
membru al unei liste, este inutilă incercarea de resatisfacere
a scopului.
Utilizărea predicatului cut pentru
prelucrare listelor
Cu toate acestea, predicatul cut de mai sus nu este un cut verde,
deoarece el schimba comportarea programului în cazul în care se pun
intrebări în care X este variabila neinstantiată !
?- apartine(X, [a, b, c]).
X = a;
X = b;
X = c;
No
Se obtin trei solutii pentru cazul %1
?- apartine(X, [a, b, c]).
X=a
No
Si o o solutie pentru cazul %2.
Concluzii
Negatia Prolog
Eşuarea scopului poate fi exprimată în Prolog printr-un
predicat predefinit, care are valoarea de adevăr “fals”, şi
anume predicatul fail .
Predicatul fail este utilizat pentru forţarea revenirii pe
urme si este un predicat:
– standard,
– fără argumente,
– care eşuează întotdeauna.
Cu ajutorul predicatului fail se poate programa
negaţia dacă acest predicat se utilizează în
combinaţie cu predicatul ‘!’.
Negatia Prolog