procesarea programelor prolog(18.02.2016)

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 !

Upload: liuda-love

Post on 09-Jul-2016

1 views

Category:

Documents


0 download

DESCRIPTION

prolog

TRANSCRIPT

Page 1: Procesarea Programelor Prolog(18.02.2016)

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,0Goal: 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 -> deterministnumar2 -> 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)

Page 2: Procesarea Programelor Prolog(18.02.2016)

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

clausesf(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:clausesf(X,1):-X>2,!.f(2,0):-!.f(_,-1):-!.

Exemplu 1clausesmax(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)=1F(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

Page 3: Procesarea Programelor Prolog(18.02.2016)

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