Sunteți pe pagina 1din 10

Inteligen Artificial PROLOG

Lucrarea de laborator nr. 4

Aritmetica, comparaii
Expresii aritmetice Expresiile aritmetice constau din operanzi (constante numerice i variabile), operatori (+, -, *, /, div i mod) i paranteze. Simbolurile din partea dreapt a semnului = ( care este predicatul = ) de mai jos formeaz o expresie aritmetic: A = 1 + 6 / (11 + 3) * Z Valoarea unei expresii poate fi calculat dac toate variabilele sunt legate la momentul evalurii. Calculele se fac ntr-o anumit ordine determinat de prioritatea operatorilor aritmetici: operatorii cu cea mai mare prioritate sunt evaluai primii. Operaii aritmetice Tipul rezultatului unei operaii aritmetice este dat de urmatorul tabel: Operand1 ntreg real ntreg real ntreg,real ntreg ntreg Operator +,-,* +,-,* +,-,* +,-,* / div mod Operand2 ntreg ntreg real real ntreg,real ntreg ntreg Rezultat ntreg real real real real ntreg ntreg

Ordinea evalurii 1. Subexpresiile din paranteze se evalueaz primele. 2. Apoi, se execut nmulirile (*) sau mpririle (/, div, mod), lucrnd de la stnga la dreapta. 3. Apoi se execut adunrile (+) i scderile (-), lucrnd de la stnga la dreapta. Funcii i predicate Funcii X mod Y X div Y abs(X) cos(X), sin(X) , tan(X) arctan(X) exp(X ln(X) log(X) Explicaie restul mpririi lui X la Y ctul mpririi lui X la Y valoarea absolut a lui X funciile trigonometrice cer ca X s fie legat de o valoare reprezentnd unghiul n radiani arctangenta valorii reale de care e legata X e la puterea X logaritm din X, n baza e logaritm din X, n baza 10 1

Inteligen Artificial PROLOG sqrt(X) random(X) random(X, Y) round(X) trunc(X)

Lucrarea de laborator nr. 4

rdcina ptrat a lui X leag X de o valoare real aleatoare, 0 <= X < 1 leag Y de o valoare ntreag aleatoare, 0 <= Y < X ntoarce valoarea rotunjit a lui X ntoarce valoarea trunchiat a lui X

ntrebare: Ce returneaz scopul t(X) ? predicates t(real) clauses t(X):- X = 9.0 / 3.0. Operaii pe bii: Operaii pe bii bitand(X,Y,Z) bitor(X,Y,Z) bitnot(X,Z) bitxor(X,Y,Z) bitleft(X,N,Z) bitright(X,N,Z)= Explicaie "si bit cu bit" intre bitii cuvintelor X si Y "sau bit cu bit" " " "negarea lui X" "sau exclusiv" intre X si Y deplasare cu N pozitii la stanga deplasare cu N pozitii la dreapta

Observaii - rezultatul este ntotdeauna depus n Z care este un ntreg; - n momentul executrii unei operaii pe bii, variabilele X i Y trebuie s fie legate. Comparaii T.Pro. poate compara expresii aritmetice, caractere, string-uri i simboluri. n T.Pro. se folosete notaia nfix, ceea ce nseamn c operatorii sunt plasai ntre operanzi (ex: X < 4) i nu naintea lor (ex: <(X, 4)). Iat operatorii relaionali permii n T.Pro.:

< mai mic <= mai mic sau egal > mai mare <= mai mare sau egal = egal <>, ><diferit (neegal)
2

Inteligen Artificial PROLOG Egalitate i predicatul egal ( = )

Lucrarea de laborator nr. 4

n T.Pro. propoziii precum N = N1 - 2 indic fie o relaie ntre trei obiecte (N, N1, 2) fie o relaie ntre dou obiecte (N i valoarea N1 - 2). Dac N este variabila liber, propoziia este satisfcut legnd pe N de rezultatul evalurii N1 - 2. Aceasta corespunde unei instruciuni de atribuire din limbajele de programare. Dac N este o variabil legat, atunci propoziia este satisfacut dac relaia de egalitate are loc. De remarcat c n ambele situaii variabila N1 trebuie s fie legat. S considerm exemplele urmtoare: 1. predicates plus(integer,integer,integer) minus(integer,integer,integer) less_than(integer,integer) clauses plus(X,7,Z):-Z=X+7. minus(9,Y,W):-W=9-Y. less_than(X,Y):-plus(X,7,Z),minus(9,Y,W),Z<W. Verifcai cazurile: - less_than(10,4) - less_than(1,0) Rspuns: No Rspuns: Yes

2. Un exemplu clasic de utilizare a "aritmeticii" este rezolvarea ecuaiei de gradul II: predicates soluie(real,real,real) unu(real,real,real) doi(real,real,real) radical(real,real) clauses soluie(A,B,C):-A<>0, D=B*B-4*A*C,doi(A,B,D),nl,!. soluie(A,B,C):-unu(A,B,C),nl,!. doi(A,B,D):-D>=0, radical(D,Rad), X1=(-B+Rad)/(2*A), X2=(-B-Rad)/(2*A), write("X1=",X1," X2=",X2). doi(A,B,D):- D1=-D, radical(D1,Rad), X1=-B/(2*A), X2=Rad/(2*A), write("Soluii complex conjugate, Partea Real=", X1,"\n"," Coeficienii Prii Imaginare=",X2),nl,!. unu(_,B,C):-B<>0, X=-C/B, write("Ecuaia este de gradul I. X=",X),nl,!. unu(_,_,C):-C=0, write("Ecuaie nedeterminat!"),nl,!. 3

Inteligen Artificial PROLOG unu(_,_,_):- write("Ecuaie imposibil!"),nl. radical(D,Rad):-Rad=sqrt(D).

Lucrarea de laborator nr. 4

Compararea caracterelor, string-urilor i symbol-urilor


Caractere Cnd T.Pro. compar 'a' < 'b' el convertete aceast expresie la expresia artimetic echivalent 97 < 98, folosind codurile ASCII ale caracterelor de comparat. String-uri Comparaia "antony" > "antonia" se evalueaz la adevrat, deoarece cele dou string-uri difer prima oar la poziia unde primul conine litera y (79 ASCII) iar al doilea conine litera i (69 ASCII). n aceeasi logic, "aa" > "a" este adevrat. Simboluri Simbolurile nu pot fi comparate direct, din motive de sintax. Ele trebuie s fie mai nti legate de variabile: P1 = peter, P2 = sally, P1 > P2 Tema 6 Utiliznd operaiile i funciile aritmetice s se construiasc o problem care simuleaz un joc cu zaruri.

Inteligen Artificial PROLOG

Lucrarea de laborator nr. 4

Backtracking, Predicatele CUT i FAIL


Backtracking Fie programul urmtor: domains child = symbol age = integer predicates player(child, age) clauses player(peter, 9). player(paul, 10). player(chris, 9). player(susan, 9). Dorim s aflm toate perechile de copii n vrst de 9 ani. Adresm urmtoarea ntrebare T.Pro.: player(P1, 9), player(P2, 9), P1 <> P2. Iat mecanismul prin care T.Pro. gsete soluiile: 1. T.Pro. gsete soluie la primul sub-goal, mergnd de sus n jos: P1 va fi legat de peter 2. T.Pro. gsete soluie la al doilea subgoal: P2 va fi legat de peter. 3. T.Pro. ncearc s verifice al treilea subgoal: P1 si P2 sunt ambele legate de peter, deci eec. 4. T.Pro. revine la al doilea subgoal. Urmtoarea soluie: P2 e legat de chris. 5. T.Pro. verific condiia a treia: P1 si P2 sunt diferite, rezult o soluie: P1=peter, P2=chris 6. T.Pro. revine la al doilea subgoal. Urmtoarea soluie: P2 e legat de susan. 7. T.Pro. verific condiia a treia: P1 si P2 sunt diferite, rezult o soluie: P1=peter, P2=susan 8. T.Pro. revine la al doilea subgoal, dar nu mai gsete alte soluii. 9. T.Pro. revine la primul subgoal. Urmtoarea soluie: P1 e legat de chris. 10. T.Pro. trece la al doilea subgoal: P2 va fi legat de peter. 11. T.Pro. verific condiia a treia: P1 si P2 sunt diferite, rezult o soluie: P1=chris, P2=peter .a.m.d. n final, T.Pro. gsete ase soluii: P1=peter, P2=chris P1=peter, P2=susan P1=chris, P2=peter P1=chris, P2=susan P1=susan, P2=peter 5

Inteligen Artificial PROLOG P1=susan, P2=chris 6 Solutions

Lucrarea de laborator nr. 4

Not T.Pro. a gsit soluii redundante. Mecanismul backtracking face de data aceasta cautare nenecesar. Pentru alterarea mecanismului backtracking, T.Pro. ofer doua predicate: - fail, care foreaz backtracking-ul; - ! (cut, taietura), care mpiedic backtracking-ul. Utilizarea predicatului fail Valoarea lui fail este eec. Prin aceasta el ncurajeaz backtracking-ul. Efectul lui este acelai cu al unui predicat imposibil, de genul 2 = 3. Exemplu: domains nume = symbol predicates tatl(nume, nume) oricine oricine1 clauses tatl(gheorghe,maria). tatl(vasile,ion). tatl(vasile,elena). oricine :tatl(X, Y), write(X, " este tatl lui ", Y, "\n"), fail. oricine1 :tatl(X, Y), write(X, " este tatl lui ", Y, "\n"). Rspunsul la ntrebarea oricine1. va fi gheorghe este tatl lui maria Yes iar rspunsul la ntrebarea oricine va fi gheorghe este tatl lui maria vasile este tatl lui ion 6

Inteligen Artificial PROLOG vasile este tatl lui elena No

Lucrarea de laborator nr. 4

Faptul c apelul lui oricine se termin cu fail (care eueaz ntotdeauna) oblig T.Pro. s nceap backtrackingul prin corpul regulii oricine. Prolog va reveni pn la ultimul apel care poate oferi mai multe soluii. Un astfel de apel se numete apel nedeterminist. Predicatul write nu poate da alte soluii, deci revine la apelul lui tatl. Observatii: 1. Acel No semnific faptul c predicatul oricine nu a fost satisfcut. 2. Dup fail nu are rost s punei nici un predicat, deoarece Prolog nu va ajunge s-l execute niciodat. Not Secvena Pseudocod echivalent cu predicatul oricine este: ct timp tatl(X, Y) are soluii execut write(...) Deci, secvenele urmtoare sunt echivalente cat timp conditie executa corp predicat :conditie, corp, fail.

Utilizarea predicatului ! (cut) T.Pro. conine predicatul cut (!) folosit pentru a preveni backtracking-ul. Cnd se proceseaz predicatul !, apelul reuete imediat i se trece la subgoalul urmtor. Odat ce s-a trecut peste o tietur, nu este posibil revenirea la subgoal-urile plasate naintea ei i nu este posibil backtrack-ul la alte reguli ce definesc predicatul n execuie. Exist dou utilizri importante ale tieturii: 1. Cnd tii dinainte c anumite posibiliti nu vor duce la soluii semnificative, este o pierdere de timp s lsai Prolog-ul s lucreze. n acest caz, tietura se numete tietur verde. 2. Cnd logica programului cere o tietur, pentru prevenirea lurii n consideraie a subgoalurilor alternative. n acest caz, tietura se numete tietur roie. Prevenirea backtrack-ului la un subgoal anterior Utilizare: r1 :- a, b, !, c. Aceasta este o modalitate de a spune c suntei mulumii cu primele soluii descoperite cu subgoalurile a i b. Dei T.Pro. ar putea gsi mai multe soluii prin apelul la c, nu este autorizat s revin la a i b. Deasemenea,nu este autorizat s revin la alt clauz care definete predicatul r1.

Inteligen Artificial PROLOG Prevenirea backtrack-ului la urmtoarea clauz

Lucrarea de laborator nr. 4

Tietura poate fi utilizat pentru a-i spune T.Pro. c a ales corect clauza pentru un predicat particular. De exemplu, fie codul urmtor: r(1) :- !, a, b, c. r(2) :- !, d. r(3) :- !, e. r(_) :- write(Aici intr restul apelurilor). Folosirea tieturii face predicatul r determinist. Aici, T.Pro. apeleaz predicatul r cu un argument ntreg. S presupunem c apelul este r(1). T.Pro. caut o potrivire a apelului. O gsete la prima clauz. Faptul c imediat dup intrarea n clauz urmeaz o tietur, mpiedic T.Pro. s mai caute i alte potriviri ale apelului r(1) (cu alte clauze). Observaie Acest tip de structur este echivalent cu un case unde condiia de test a fost inclus n capul clauzei. La fel de bine s-ar fi putut spune i: r(X) :- X = 1, !, a, b, c. r(X) :- X = 2, !, d. r(X) :- X = 3, !, e. r(_) :- write(Aici intr restul apelurilor). Note 1. Deci, urmtoarele secvene sunt echivalente: case X of v1: corp1; v2: corp2; ... else corp_else. predicat(X) :- X = v1, !, corp1. predicat(X) :- X = v2, !, corp2. ... predicat(X) :- corp_else.

2. De-asemenea, urmtoarele secvene sunt echivalente: if cond1 then corp1 else if cond2 then corp2 ... else corp_else. Tema 7 Rulai urmtorul program aa cum este scris mai jos, iar apoi scoatei tietura (!) i analizai rezultatele obinute. domains nume=symbol predicates 8 predicat(...) :cond1, !, corp1. predicat(...) :cond2, !, corp2. ... predicat(...) :corp_else.

Inteligen Artificial PROLOG tatl(nume,nume) ef(nume,nume) citete(nume) oricine(nume,nume,nume,nume,nume) clauses tatl(gheorghe,maria). tatl(vasile,ion). citete(carte). citete(ziar). ef(ana,viorica). ef(nae,nicu). oricine(X,Y,Z,V,W):-tatl(X,Y),citete(Z),!,ef(V,W). Predicatul not Sintaxa: not(subgoal(Arg1, ..., ArgN))

Lucrarea de laborator nr. 4

Predicatul not reuete atunci cnd subgoal-ul care este argument al lui not nu poate fi dovedit adevrat. Dac subgoal-ul este apelat cu variabile libere,T.Pro. va emite eroare: Variabilele libere nu sunt autorizate n NOT. De exemplu, fie secvena: place(bill, Cineva) :place(sue, Cineva), not(uraste(bill, Cineva)). Acest enun este echivalent cu: lui Bill i place de cineva dac i lui Sue i place, i dac Bill nu l urte. De observat c, la intrare, Cineva este liber, dar la ieirea din primul subgoal, Cineva este legat. Astfel, la intrarea n not, Cineva este legat, i totul va funciona bine. Dac se inverseaz ordinea clauzelor, rezultatul nu va mai fi corect, deoarece la intrarea n not Cineva va fi variabil liber. Folosirea variabilei anonime (_) n not n locul lui Cineva tot nu va rezolva problema. Direcii de flux n Prolog, legrile de variabile se fac n dou moduri: la intrarea n clauz sau la ieirea din clauz. Direcia n care este trecut o valoare se numete 'direcia de flux'. Cnd o variabil este dat la intrarea ntr-o clauz este un parametru de intrare (i), iar cnd o variabil este dat la ieirea dintr-o clauz este un parametru de ieire (o). O anumit clauz poate s aib mai multe modele de flux. S analizm aceste direcii de flux pe exemplul cu factorial. factorial(N,F) 9

Inteligen Artificial PROLOG

Lucrarea de laborator nr. 4

este predicatul care va calcula factorialul lui N poate avea urmtoarele direcii de flux: (i,i) - verific dac N!=F : factorial(3,6) --> Yes; (i,o) - atribuie F:= N! : factorial(4,F) --> F=24; (o,i) - gsete acel N pt. care N! = F : pentru acest caz trebuie construit alt program; (o,o) - ? situaia este absurd factorial(N,R), se obine eroare de compilare. S regndim problema pentru cazul (o,i):

Varianta clasic pentru limbajele procedurale este: i=2; while(m mod i=0) do begin m:=m div i; i:=i+1; end; if (m=1) then n:=i-1; Varianta PROLOG este: domains n = real f = integer predicates fact(f,f) fact1(f,f,f) clauses fact(0,1). fact(N,M) :- I=2, fact1(N,M,I). fact1(N,M,I) :- M mod I = 0, M1=M div I, I1=I+1, fact1(N,M1,I1). fact1(N,1,I):-N=I-1.

Tem 8 Scriei un predicat care rezolv problema ridicrii la putere: power(X,Y,Z) unde Z = X la puterea Y.

10