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. | ||