Sunteți pe pagina 1din 3

Cautarea solutiilor se face prin potrivire.

Prologul, incercind sa unifice fiecare


predicat pentru demonstrare cu un predicat declarat ca fapt sau deductibil. Daca nu
se reuseste unificarea(potrivirea), prologul se intoarce si incearca alta legare a
variabilelor pentru ultima clauza, sau alta varianta de evaluare a clauselor.
Exemple:
Domains
i=integer
Predicates
cifra(i)
numar1
numar2(i,i,i)
Clauses
cifra(0).
cifra(1).
numar1:-cifra(A),cifra(B),cifra(C),write(A,B,C),nl
numar2(A,B,C):-cifra(A),cifra(B),cifra(C),write(A,B,C),nl
Goal:
numar1 -> 0,0,0
Goal:
numar2(X,Y,Z) -> 000,001,010,011,100,101,110,111

Scopuri deterministe si nondeterministe


Un scop este determinist daca el ofera o singura solutie, in caz contrar este
nondeterminism.
numar1 -> determinist
numar2 -> nondeterminist
Predicatul CUT taietura(reducere)
cut(!) - se noteaza prin semnul exclamarii.
In program impiedica revenirea. Acest predicat se utilizeaza atunci cind
este necesar sa reducem spatiul de cautare al solutiilor. Predicatul cut se
utilizeaza si atunci cind dorim sa reducem numarul de solutii.
cifra(0). cifra(1).
numar3(X,Y,Z):-cifra(X),!,cifra(Y),cifra(Z),nl 000,001,010,011(s-a facut
taietura dupa X, a mers numai pina la 1). Daca in proccesul de cautare a
solutiilor se trece in dreapta lui CUT ! atunci se cauta toate soolutiile din
dreapta lui, si nu se revine in stinga lui CUT !
Predicatul fail esec/nereusita
Se foloseste pentru a impune un program sa fie nondeterminist. Acest
predicat niciodata nu se acorda cu baza de cunostinte si returneaza valoarea
false. Acest fapt impune sistemul sa revina si sa caute alte solutii, deci
genereaza back-tracking. Solutiile gasite trebuie sa fie folosite inainte de fail.
Dupa fail nu are sens sa urmeze alte predicate.

numar4:-cifra(A),cifra(B),cifra(C),nl,fail (impune sa caute toate solutiile, va


genera toate 8 solutii)
numar5:-cifra(A),cifra(B),cifra(C),nl,fail.
numar5.
In primul caz numar4 va genera toate solutiile si returneaza valoarea false
In al doilea caz numar5 va genera toate solutiile si va returna valoare YES
f(x)={1,daca x>2
{0,x=2
{-1,x<2
clauses
f(X,R):-X>2,R=1. (,!. in caz cind vrem sa se opreasca cu cautarea solutiilor
la primul rind)
f(X,R):-X=2,R=0.
f(X,R):-X<2,R=-1.
Goal: f(7,R) R=1
Varianta 2:
clauses
f(X,1):-X>2,!.
f(2,0):-!.
f(_,-1):-!.

Exemplu 1
clauses
max(X,Y,Z):-X>=Y,Z=X,!. sau max(X,Y,X):-X>=Y,!.
max(X,Y,Z):-X<Y,Z=Y. sau max(X,Y,Y):-X<Y.

Recursivitate - Simulari de cicluri


In prolog ciclurile se stimuleaza utilizind fail, sau prin recursivitate.
Recursia se utilizeaza la interogarea bazelor de date, la prelucrarea listelor.
Un predicat recursiv trebuie sa contina o conditie de limita a recursiei.
X ->-> -> Y -> Z
Stramos(X,Z):-parinte(X,Z).
stramos(X,Z):-parinte(Y,Z),stramos(X,Y).

Factorialul
F(0)=1
F(n)=n*f(n-1)
Fact(N,R):-N=0,R=1,!.
Fact(N,R):-N>0,N1=N-1,fact(N1,R1),R=N*R1.

Fact(3,R):-N1=2,fact(2,R1),R=3*R1
Fact(2,R):-N1=1,fact(1,R1),R=2*R1
Fact(1,R):-N1=0,fact(0,R1),R=1*R1
Fact(0,R)->R=1

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