Sunteți pe pagina 1din 7

IA

Laborator 4
Scopul: Aritmetica in Prolog. Recursivitate in Prolog. Prezentarea unor predicate de interactiune in Prolog.

PARTEA I: SUPORT LABORATOR


1. Operatori si functii Dei PROLOG a fost proiectat n primul rnd ca un limbaj de programare simbolic, el dispune de operatorii pentru cele patru operaii aritmetice de baz i operatorii unari minus i plus, la care se adaug operatorii mod i div . Se folosesc simbolurile urmtoare: Operatori binari: + adunare - scdere * nmulire / mprire mod restul mpririi ntregi div mprirea prin trunchiere Operatori unari: - (semnul) minus + (semnul) plus Expresiile obinute cu ajutorul acestor operatori se evalueaz pe baza unui set de reguli, care precizeaz precedena i asociativitatea operatorilor precum i conversiile aplicate operanzilor: Precedena (prioritatea) determin ordinea de efectuare a operaiilor ntr-o expresie cu diveri operatori. Asociativitatea indic ordinea de efectuare a operaiilor ntr-o secven de operaii care au aceeai preceden. Regulile de conversie de tip asigur stabilirea unui tip comun pentru ambii operanzi, la fiecare operaie care solicit acest lucru i n care tipurile difer.

Ordinea de evaluare determinat de preceden i asociativitate poate fi modificat grupnd operaiile cu ajutorul parantezelor. n prelucrrile aritmetice realizate n PROLOG semnul = joac un rol special. El este privit ca un operator cu doi operanzi: operand1 = operand2. Urmtoarele reguli determin comportarea acestui operator: Dac unul din operanzi este variabil nelegat i cellalt este un obiect, atunci operatorul leag variabila la obiectul respectiv. Dac un operand este variabil legat i cellalt este un obiect, atunci operatorul testeaz dac valoarea legat este aceeai cu obiectul respectiv.

IA 2010 Laborator 4 Dac un operand este variabil liber, iar cellalt este variabil legat, atunci operatorul leag variabila liber la obiectul legat de cealalt variabil. Dac ambii operanzi sunt variabile legate, atunci operatorul testeaz dac valorile legate sunt aceleai.

Exist predicate predefinite specializate care controleaz inegalitatea dintre expresiile numerice: > mai mare < mai mic >= mai mare egal <= mai mic egal <> , \= diferit Urmtorea lista conine predicate predefinite i funciile aritmetice crora le sunt asociate. round(x) rotunjete la cel mai apropiat ntreg trunc(x) trunchiaz abs(x) valoarea absolut sqrt(x) radical de ordinul 2 exp(x) e la puterea x ln(x) logaritm natural log(x) logaritm n baza 10 random(x) leag la x un numr aleator din [0, 1) sin(x) sinus; x se consider exprimat n radiani cos(x) cosinus; x se consider exprimat n radiani tan(x) tangenta; x se consider exprimat n radiani arctan(x) arctangenta Pentru exemplificarea prelucrrilor aritmetice, s considerm problema calculrii dobnzilor totale pentru mprumutul acordat de o banc, n condiiile n care rambursarea se face n trane lunare egale. Punem n eviden dou modaliti de rezolvare a cestei probleme. Prima dintre ele este o soluie recursiv. n acest scop se definete clauza: dobanda(Imprumut, Rata_curenta, Rata_anuala_dobanda, Dobanda_totala) n care variabilele folosite au urmtoarea semnificaie: Imprumut - mprumutul acordat Rata_curenta - rata curent lunar Rata_anuala_dobanda - rata anual a dobanzii Dobanda_totala - dobnda totala (de achitat pn la rambursarea integral a mprumutului.) Dobnda total este suma dobnzilor calculate prin aplicarea ratei lunare a dobnzii asupra mprumutului de restituit, care se diminueaz progresiv cu sumele rambursate lunar. Calcularea dobnzii nceteaz odat cu rambursarea integral a mprumutului. Deci condiia de margine poate fi enunat astfel: pentru un mprumut de restituit egal cu zero dobnda total este zero, indiferent de celelalte elemente. Programul care rezolv problema recursiv este:
predicates dobanda(real,real,real,real) clauses

IA 2010 Laborator 4
dobanda(0,_,_,0):-!. dobanda(Imprumut,Rata_curenta,Rata_anuala_dobanda,Dobanda_totala):Sold=Imprumut-Rata_curenta, dobanda(Sold,Rata_curenta,Rata_anuala_dobanda,Dobanda_urmatoare), Dobanda_totala=Dobanda_urmatoare+Imprumut*Rata_anuala_dobanda/1200.

n cea de a doua regul semnificaia variabilelor este urmtoarea: Sold - mprumutul de restituit n luna urmtoare (i.e. Imprumut-Rata_curenta) Dobanda_urmatoare - dobnda aferent lunilor urmtoare Dobanda_totala dobnda total este Dobanda_urmatoare + dobnda datorat pentru luna n curs, i.e Imprumut*Rata_anuala_dobanda/1200. Iat i rspunsul la interogarea:
dobanda(5000000,100000,20,X) X = 2125000 1 Solution

2. Recursivitatea in Prolog Intuitiv, recursivitatea se nate n clipa n care o schi este construit prin reproducerea ei nsi, la o alt scar sau la un alt nivel. n cadrul programrii recursivitatea este o tehnic care const n posibilitatea de a include ntr-o procedur apeluri la ea nsi.Multe definiii de concepte sunt definiii recursive, aa cum este de exemplu definiia recursiv a noiunii de list sau arbore. n Prolog, acesta se traduce prin posibilitatea ca un nume de predicat s apar att n corpul unei reguli ct i n capul ei. Limbajul Prolog permite exprimarea definiiilor recursive prin definiia recursiv a predicatelor. Intr-o astfel de definiie trebuie ntotdeauna s se defineasc un fapt sau o regul care marcheaz punctul de oprire din recursivitate, deci cazul particular al definiiei recursive. Exemple: 1.S se scrie un program care calculeaz n!, unde n! = 1 * 2 * 3 *...* n. fact(0, 1). % Factorialul lui 0 este 1, punctul de oprire. fact(N,NFact) :% Factorialul lui N este NFact dac: N1 = N - 1, % calculm (N - 1) pentru al putea pasa ca argument fact(N1, Rezult), % fie Rezult factorial de (N - 1) NFact = N * Rezult. % atunci NFact este N nmulit cu factorial de (N - 1) 2. S se scrie un predicat care calculeaz cel mai mare divizor comun pentru dou numere. Se folosete definiia recursiv a lui Euclid: Fie a i b dou numere ntregi pozitive. dac b = 0 atunci cmmdc(a, b) = a; altfel cmmdc(a, b) = cmmdc(b, r), unde r este restul mpririi lui a la b. 3

IA 2010 Laborator 4 Implementarea n Prolog este: % cmmdc(A, B, Cmmdc) cmmdc(A, 0, A). cmmdc(A, B, Rez) :- B > 0, Rest is A mod B, cmmdc(B, Rest, Rez). 3.Variabile si parametri Spre deosebire de alte limbaje, Visual Prolog nu admite ca o variabil, odat legat, s-si modifice valoarea. De exemplu, o instructiune de genul N = N + 1, nu este admis n Prolog. n locul ei se va folosi N1= N + 1 si se va genera o nou variabil . De aici se deduc cteva reguli elementare de lucru cu parametri n cicluri si/sau recursivitate: a. rezultatul final trebuie s fie o variabil nelegat care se va lega la rezultat abia dup ce acesta a fost obtinut; b. rezultatele intermediare si parametrii variabili se transmit genernd noi variabile locale; c. parametrii nemodificabili sunt variabile legate, constante etc. Astfel, problema factorialului poate fi scris astfel:
predicates factorial(integer, integer) clauses factorial(1, 1):-!. factorial(N, M):- N1 = N-1, factorial(N1, M1), M = N * M1.

4. Predicate de interactiune Prolog ofer posibilitatea interaciunii unui program cu echipamentul periferic al calculatorului, cu ecranul i cu utilizatorul. Aceasta se realizeaz cu ajutorul unor predicate predefinite. Exist trei predicate predefinite de ieire: write, writedevice i writef. Nota: writedevice i writef nu sunt definite in PIE. Forma general a predicatului write este: write(arg1, arg2,, argn), unde arg1, arg2,, argn sunt obiecte elementare sau variabile. n cazul n care argk este o variabil, ea trebuie s fie legat n momentul execuiei predicatului write. Predicatul write reuete ntotdeauna i are ca efect afiarea pe ecran a valorilor legate de argumentele sale. Pentru trecerea la o linie nou se poate utiliza predicatul nl (new line) sau secvena de caractere \n. Exemplificm utilizarea acestor predicate cu ajutorul urmtorului program: domains nume=string 4

IA 2010 Laborator 4 firma=symbol predicates angajat(nume, firma) salariu(nume, real) afis clauses angajat("Mihai Popescu",bcr). angajat("Petre Georgescu",bcr). angajat("Maria Ionescu",banc_post). salariu("Mihai Popescu",10000000). salariu("Petre Georgescu",5000000). salariu("Maria Ionescu", 70000000). afis :-angajat(X,Y), salariu(X,Z),write(X, " lucreaza la ", Y), write(" si are salariul ", Z), nl, fail. afis. Predicatul fail a fost utilizat n prima clauz afis pentru a fora backtrackingul. Aceasta este necesar deoarece predicatul write nu se resatisface. A doua clauz afis a fost adugat pentru a evita rspunsul no (prima clauz afis esueaz ntotdeauna datorit prezenei predicatului fail). Redm n continuare rspunsul sistemului la interogarea afis. afis Mihai Popescu lucreaza la bcr i are salariul 10000000. Petre Georgescu lucreaza la bcr i are salariul 5000000. Maria Ionescu lucreaza la banc_post i are salariul 7000000. Yes Predicatul writef se utilizeaz n cazul transmiterii cu format de ieire a datelor. Forma sa este: writef(ir_format,arg1, arg2,, argn) unde ir_format este un ir de caractere care indic formatul utilizat pentru afiarea pe ecran a valorilor legate de arg1, arg2,, argn. n general irul ir_format conine: caractere care se copiaz ca atare pe ecran grupuri de specificatori de forma % -<dimens>.<prec>tip (pentru fiecare argument din list trebuie s existe un specificator) Semnificaia caracterelor dintr-un specificator este urmtoarea: % marcheaz nceputul specificatorului determin alinierea la stnga i completarea cu spaii la dreapta. Prezena acestui caracter este opional. Implicit: aliniere la dreapta i completare la stnga cu spaii sau cu 0 dimens specific dimensiunea minim a cmpului afiat; nu se efectueaz trunchierea valorii afiate. prec este opional i arat precizia numrulzi n virgul mobil sau lungimea maxim a numrului de caractere care se tipresc n cazul obiectului de tip string. tip (opional) specific forma n care este afiat argumentul n virgul mobil; poate avea valorile f, e, g cu urmtoarele semnificaii: f indic virgula mobil 5

IA 2010 Laborator 4 e indic scriere exponenial g indic scrierea cu format scurt Predicatul writedevice este utilizat pentru a redirecta afiarea rezultatelor ctre imprimant sau ctre un fiier. De exemplu, writedevice(printer) determin afiarea la imprimant a rezultatelor, iar writedevice(screen) determin afiarea rezultatelor pe ecran. Exist patru predicate predefinite de intrare: readln, readchar, readint, readreal. Predicatul readln permite citirea unui obiect de tip symbol sau string, i are forma readln(X), unde X este o variabil, care n urma introducerii textului (urmat de ENTER) devine legat la valoarea obinut n urma citirii. Predicatul readln se execut cu ecou pe ecran. Predicatul readchar permite citire unui singur caracter, i are forma readchar(X), unde X este o variabil care n urma execuiei va fi legat la caracterul introdus. Acest predicat se execut fr ecou pe ecran. Predicatul readint are forma readint(X) i permite citirea unui numr ntreg care va fi legat la variabila X. Predicatul readreal are forma readreal(X) i permite citirea unui numr real care va fi legat la variabila X. S considerm, pentru exemplificare urmtorul program: predicates cont(integer, symbol) afis_simbol clauses cont(506, obligatiuni). cont(512, conturi_curente_la_banci). cont(531, casa). afis_simbol:-write("Denumirea contului= "), readln(X), cont(Y,X), write("Simbolul acestui cont este: ",Y),nl. Iat i o interogare: afis_simbol Denumirea contului = conturi_curente_la_banci Simbolul acestui cont este: 512 Yes

IA 2010 Laborator 4

PARTEA A-II-A: EXERCITII


1. Problema trezorierului Ipoteze: 1) Nici un membru al clubului nu are datorii la trezorierul clubului. 2) Dac un membru al clubului nu a pltit taxa, atunci el are datorii la trezorierul clubului. 3) Trezorierul clubului este un membru al clubului. Concluzie: Trezorierul clubului a pltit taxa. 2. Problema parteneriatului Ipoteze: 1) Tom este corect. 2) Bill nu este partener cu Tom. 3) Dac dou persoane X i Y sunt corecte, atunci X este partener cu Y. 4) Dac Bill nu este corect, atunci John este corect. 5) Dac o persoan X este partener cu Y, atunci i Y este partener cu X. Concluzie: John este partener cu Tom. 3. Problema vecinilor Ipoteze: 1) tefan este vecin cu Petre. 2) tefan este cstorit cu o doctori care lucreaz la Spitalul de Urgen. 3) Petre este cstorit cu o actri care lucreaza la Teatrul Naional. 4) tefan este meloman i Petre este vntor. 5) Toi melomanii sunt sentimentali. 6) Toi vntorii sunt mincinoi. 7) Actriele iubesc brbaii sentimentali. 8) Soii au aceiai vecini. 9) Cstoria i vecintatea sunt relaii simetrice. Concluzie: l iubete soia lui Petre pe tefan? 4. S se calculeze puterile unui numr pn la 100. 5. Determinati minimul dintre 2 numere.