This shows you the differences between two versions of the page.
pp:21:laboratoare:prolog:legare-executie [2021/05/10 00:23] bot.pp |
pp:21:laboratoare:prolog:legare-executie [2021/05/10 03:09] (current) bot.pp |
||
---|---|---|---|
Line 19: | Line 19: | ||
<code> | <code> | ||
- | % lungime(+Lista,-Lungime) | + | % lungime(+Lista,-Lungime) |
lungime([],0). | lungime([],0). | ||
lungime([_ | R], N) :- lungime(R, N1), N is N1 + 1. | lungime([_ | R], N) :- lungime(R, N1), N is N1 + 1. | ||
Line 61: | Line 61: | ||
<code> | <code> | ||
- | % remove(+Elem, +Lista, -ListaNoua) | + | % remove(+Elem, +Lista, -ListaNoua) |
- | remove(E, [E | R], R). | + | remove(E, [E | R], R). |
remove(E, [F | R], [F | L]) :- remove(E, R, L). | remove(E, [F | R], [F | L]) :- remove(E, R, L). | ||
</code> | </code> | ||
<code> | <code> | ||
- | % perm(+Lista, -Permutare) | + | % perm(+Lista, -Permutare) |
- | perm([], []). | + | perm([], []). |
perm([F | R], P) :- perm(R, P1), remove(F, P, P1). | perm([F | R], P) :- perm(R, P1), remove(F, P, P1). | ||
Line 105: | Line 105: | ||
<code> | <code> | ||
- | % predicat care verifică că toate elementele din prima listă sunt prezente în a doua | + | % predicat care verifică că toate elementele din prima listă sunt prezente în a doua |
all_members([], _). | all_members([], _). | ||
- | all_members([X | Rest], In) :- member(X, In), all_members(Rest, In). | + | all_members([X | Rest], In) :- member(X, In), all_members(Rest, In). |
% predicat care verifică faptul că țările nu au culori identice cu niciun vecin | % predicat care verifică faptul că țările nu au culori identice cu niciun vecin | ||
Line 157: | Line 157: | ||
</code> | </code> | ||
- | Acest lucru se întâmplă pentru că, în ''%%p2%%'', Prolog nu poate să derive, pe baza negației, legări pentru ''%%X%%''. În Prolog putem folosi negația doar pentru a //verifică// variabile deja legate, sau pentru a exprima faptul că //nu se poate demonstra că predicatul este adevărat//. În ''%%p1%%'', ''%%X%%'' este legat și negația are rolul de a verifica că ''%%lazy%%'' nu este adevărat pentru ''%%X%%''. În ''%%p2%%'', ''%%X%%'' este nelegat, deci putem interpreta rezultatele folosind a doua modalitate: Prolog va încerca să demonstreze că nu există ''%%X%%'' pentru care ''%%lazy%%'' să fie adevărat, ceea ce nu este corect. | + | Acest lucru se întâmplă pentru că, în ''%%p2%%'', Prolog nu poate să derive, pe baza negației, legări pentru ''%%X%%''. În Prolog putem folosi negația doar pentru a //verifica// variabile deja legate, sau pentru a exprima faptul că //nu se poate demonstra că predicatul este adevărat//. În ''%%p1%%'', ''%%X%%'' este legat și negația are rolul de a verifica că ''%%lazy%%'' nu este adevărat pentru ''%%X%%''. În ''%%p2%%'', ''%%X%%'' este nelegat, deci putem interpreta rezultatele folosind a doua modalitate: Prolog va încerca să demonstreze că nu există ''%%X%%'' pentru care ''%%lazy%%'' să fie adevărat, ceea ce nu este corect. |
==== Predicatul false ==== | ==== Predicatul false ==== | ||
Line 174: | Line 174: | ||
?- my_reverse([1,2,3,4],[],Rev). | ?- my_reverse([1,2,3,4],[],Rev). | ||
List:[1,2,3,4], Acc:[] | List:[1,2,3,4], Acc:[] | ||
- | List:[2,3,4], Acc:[1] | + | List:[2,3,4], Acc:[1] |
List:[3,4], Acc:[2,1] | List:[3,4], Acc:[2,1] | ||
List:[4], Acc:[3,2,1] | List:[4], Acc:[3,2,1] | ||
Line 185: | Line 185: | ||
În Prolog, predicatul cut (''%%!%%'') are rolul de a elimina toate punctele de bifurcație create în predicatul curent. La evaluarea predicatului cut într-un predicat ''%%p%%'', se vor realiza două tipuri de efecte: | În Prolog, predicatul cut (''%%!%%'') are rolul de a elimina toate punctele de bifurcație create în predicatul curent. La evaluarea predicatului cut într-un predicat ''%%p%%'', se vor realiza două tipuri de efecte: | ||
- | * nu se vor mai genera soluții (dacă este nevoie, sau dacă soluția curent eșuează) pentru alte reguli ale predicatului ''%%p%%'' | + | * nu se vor mai genera soluții (dacă este nevoie, sau dacă soluția curentă eșuează) pentru alte reguli ale predicatului ''%%p%%'' |
- | * nu se vor mai genera soluții (dacă este nevoie, sau dacă soluția curent eșuează), pentru alte soluții ale condițiilor care apar **în aceeași regulă cu cut**, și înainte de cut. | + | * nu se vor mai genera soluții (dacă este nevoie, sau dacă soluția curentă eșuează), pentru alte soluții ale condițiilor care apar **în aceeași regulă cu cut**, și înainte de cut. |
De exemplu, în programul: | De exemplu, în programul: | ||
<code> | <code> | ||
- | p(a). | + | p(a). |
- | p(b). | + | p(b). |
- | p(A/B) :- q(A), !, t(A/B). | + | p(A/B) :- q(A), !, t(A/B). |
p(d). | p(d). | ||
- | q(a). | + | q(a). |
- | q(b). | + | q(b). |
q(c). | q(c). | ||
- | t(a/a). | + | t(a/a). |
- | t(a/b). | + | t(a/b). |
- | t(b/c). | + | t(b/c). |
- | t(b/d). | + | t(b/d). |
</code> | </code> | ||
Line 266: | Line 266: | ||
<code> | <code> | ||
- | min3(X, Y, Min) :- X < Y, !, X = Min. | + | min3(X, Y, Min) :- X < Y, !, X = Min. |
min3(_, Y, Min) :- Y = Min. | min3(_, Y, Min) :- Y = Min. | ||