Sunteți pe pagina 1din 65

Bazele Informaticii (curs pentru doctoranzi)

Programarea logic n Prolog Curs 1


Aurelia Prepeli (Profir), dr.,conf. univ. catedra Tehnologii de Programare, U.S.M.

Tematica lucrrilor de laborator la informatic pentru doctoranzi (cursurile 1-8):


Introducere in limbajul de programare de nivel nalt Prolog. Principalele caracteristici ale limbajului Prolog. Turbo Prolog. Mediul de programare TP. Crearea bazelor de fapte, cunotine i utilizarea lor (Curs 1).

Sistemul de operare Windows. Operaii cu ferestre, dosare, fiiere, programe, aplicaii. Combinaii de taste operative (Curs 2).

Editorul de texte Microsoft Word. Crearea i redactarea documentelor n Microsoft Word. Crearea tabelelor i efectuarea operaiilor cu elementele tabelelor (Curs 3).

Aplicaia Excel. Calculul tabelelor. Crearea tabelelor, graficelor, diagramelor n Excel i includerea lor ntr-un document pregtit n Microsoft Word (Curs 4).

Tematica lucrrilor de laborator la informatic pentru doctoranzi (cursurile 1-11):


Aplicaia Microsoft PowerPoint. Crearea unei prezentaii n PowerPoint (Curs 5). Navigarea pe Internet. Internetul i pota electronic. Crearea potei electronice. Pregtirea, transmiterea i primirea mesajelor electronice (Curs 6). Reele de calculatoare (Curs 7). Aplicaia Acces. Crearea unei baze de date simple n Acces. Crearea interogrilor pe exemplu dat (Curs 8). Reprezentarea informaiei (Curs 9). Sisteme de operare. Algoritmi. Limbaje (Curs 10). Componentele calculatorului (Curs 11).

Prelegeri:

??Orele de laborator:

Joi

15.55 - 17.15 (425/4)

Curs 1

Programarea logic n Prolog

Curs1. Programarea logic n Prolog


Introducere in Prolog. Principalele caracteristici ale limbajului Prolog. Structura programelor Turbo Prolog. Seciunile unui program n Turbo Prolog. Elemente constitutive: tipuri de date, clauze, fapte, interogri (goal), reguli, constante, variabile, predicate aritmetice, intrri, ieiri. Procesarea programelor Prolog, cutarea soluiilor.

Backtracking-ul.
Recursivitate. Simulri de cicluri.

Introducere in Prolog
Una din principalele idei ale programarii logice este aceea c un algoritm este constituit din doua elemente disjuncte: logic i control. Componenta logica corespunde definitiei problemei ce trebuie solutionata, n timp ce componenta

control stabileste cum poate fi obinuta soluia. n limbajul Prolog un programator trebuie sa descrie numai componenta logica a unui algoritm (s specifice problema ce trebuie soluionata), lsnd controlul executarii sa fie exercitat de sistemul de programare logica utilizat. Astfel limbajul logic poate fi conceput simultan ca limbaj de descriere, specificare formala a problemei i ca un limbaj de programare a calculatoarelor.
Limbajul Prolog este doar un caz particular de abordare a programarii logice. Limbajul Prolog ( PROgrammation en LOGique) a fost creat la Marsilia la inceputul anilor 70, inventatorii fiind Alain Colmeraurer si Philippe Roussel.

Principalele caracteristici ale limbajului Prolog


Fundamentele teoretice se gasesc in metoda demonstrarii automate dezvoltata incepand cu 1965 dupa metoda rezolutiei data de Julian Robinson. Un rol important l-a avut si R. Kowalski prin demonstrarea faptului ca se poate programa folosind logica. In limbajul Prolog se poate face orice ca si in alte limbaje de programare. Insa Prologul are avantaje distincte precum si dezavantaje. Prologul poate manui numere, insa nu asa de eficient ca un limbaj special destinat acestui lucru. Prologul, insa, este orientat pe manipularea simbolurilor. Ori manipularea simbolurilor este inima a ceea ce a devenit astazi cunoscut sub numele de Inteligenta Artificiala.

Principalele caracteristici ale limbajului Prolog

1. Este

un limbaj de programare logica centrat pe date. Se deosebeste de Pascal, C care sunt limbaje imperative, centrate pe proces. Paradigma fundamentala a programarii logice este cea de programare declarativa. Focusul programarii logice este identificarea notiunii de calcul si notiunii de deductie. Se bazeaza pe deductia liniara folosind clauze Horn. Se foloseste pentru a exprima relatii intre obiecte si a obtine informatii referitoare la obiecte si relatiile dintre ele.

Principalele caracteristici ale limbajului Prolog


2. Este un limbaj descriptiv A scrie un program pentru calculator inseamna 2 lucruri: < CE >: specificarea exacta a rezultatelor dorite; < CUM >: proiectarea metodei prin care se obtin aceste rezultate. Un limbaj este descriptiv daca accentul cade pe primul aspect (CE), alegerea metodei fiind lasata pe seama calculatorului. Un limbaj procedural este unul in care trebuie proiectata si metoda de obtinere a rezultatelor. 3. Este folosit in: - programarea unor aplicatii in Inteligenta Artificiala - dezvoltarea sistemelor expert - procesarea limbajului natural (inclusiv traducere automata) - robotica - teoria jocurilor - procesari de natura logica

Structura programelor Turbo Prolog


Implementare a Prolog-ului pentru calculatoare personale IBM PC si compatibile. Este un compilator foarte rapid lansat in 1988 de Borland International, cu multe predicate predefinite. Castigul in viteza s-a obtinut cu urmatorul pret: - necesitatea declararii predicatelor si a tipurilor folosite; - mai putin dinamic (regulile nu pot fi adaugate sau sterse); - nu exista predicatul 'call'; - limitarea in amestecul tipurilor; - imposibilitatea utilizarii unui simbol de predicat ca functie. Fisiere importante pentru TP prolog.exe : compilatorul de Turbo Prolog prolog.err : mesajele de eroare prolog.hlp : fisierul de help online

Structura programelor Turbo Prolog

Mediul de programare TP: Lansarea: prolog.exe

Meniul principal:
Files, Edit, Run, Compile, Options, Setup

Dupa ce a fost lansat aplicaia Prolog, se tasteaz Enter. Maximizarea/redimensionarea ferestrei de aplicaie Alt+Enter.

Structura programelor Turbo Prolog

Ferestrele din TP : Editor, Dialog, Message, Trace Activarea meniului Files: Alt+F Editarea: Alt+E Lansarea: Alt+R

Structura programelor Turbo Prolog

Rularea unui program, accesarea ferestrei Dialog: Run sau Alt+R

Seciunile unui program Turbo Prolog


Structura programelor Turbo Prolog: Un program Prolog este divizat n seciuni. Seciunile Prolog sunt: domains, global domains, database,

predicates, global predicates, clauses, goal.


Unele seciuni putem s le omitem, dac ele nu se utilizeaz. De exemplu, dac nu

utilizm bazele de date dinamice, atunci seciunea database nu se include n


program.

Seciunile unui program Turbo Prolog

Programul acelasi_parinte i ferestre Turbo Prolog.

Seciunile unui program Turbo Prolog


n seciunea domains se includ tipurile de obiecte (domeniul obiectelor) definite de utilizator: domains

lista_nume_dom_def1 = tip1 lista_nume_dom_def2 = tip2


........................

unde lista_nume_dom_def este o list din unul sau mai multe


domenii ce se definesc la fel. Numele domeniului este un identificator.

Seciunile unui program Turbo Prolog


Exist mai multe moduri de definire a domeniilor. Cel mai simplu mod de definire este: dom = d unde dom este numele domeniului, iar d este unul dintre tipurile: char, symbol, string, integer, real.

Exemplu. s = symbol
nume, prenume, oras = string

Seciunile unui program Turbo Prolog


n seciunea predicates se declar structura tuturor predicatelor din program. Forma general este: nume_predicat(d1, d2, ) unde d1, d2, sunt domeniile argumentelor ce sunt definite anterior sau standarde. nume_predicat trebuie sa inceapa cu o litera (de preferat mica), urmata, eventual, de o secventa de litere, cifre si underscore (_). Lungimea numelui trebuie sa fie mai mica de 250. Arietatea unui predicat este numarul de argumente; doua predicate cu acelasi nume pot avea arietati diferite. Ele trebuie declarate in sectiunea de predicate si corpul lor in sectiunea de clauze. Exemplu: domains s = symbol predicates virsta(s, integer)

Seciunile unui program Turbo Prolog


Seciunea clauses conine baza de cunotine. n aceast seciune se scriu faptele i regulile. Clauzele cu conjuncii sunt relaii care au forma: T :- Q1, Q2, , Qn . n Turbo Prolog se poate scrie i astfel: T if Q1 and Q2 and and Qn . T este capul clauzei, Q1, Q2, , Qn formeaz corpul clauzei. Q1, Q2, , Qn subscopuri. Clauzele cu disjuncii sunt relaii care au forma: T :- Q1; Q2; ; Qn . Se poate scrie i astfel: T if Q1 or Q2 or or Qn . n seciunea goal se conine o interogare (scop extern). Dac aceast seciune lipsete, atunci interogrile se fac din fereastra de dialog (scop intern). Comentariile pot fi incluse ntre caracterele /* i */ . Caracterul % poate fi utilizat pentru comentariile de pe o linie.

Seciunile unui program Turbo Prolog


Exemplu. Programul Prinii:
domains s=symbol predicates

parinte(s,s) femeie(s) barbat(s) acelasi_parinte(s,s) sora(s,s) frate(s,s) copil(s,s) bunica(s,s) bunel(s,s)

Seciunile unui program Turbo Prolog


clauses parinte(ion,maria). % Ion este parintele Mariei parinte(ana,maria). Ana parinte(ana,dan). parinte(ion,dan). parinte(maria,elena). parinte(maria,andrei). parinte(dan,vasile). femeie(ana). Maria femeie(maria). femeie(elena). barbat(ion). barbat(dan). barbat(andrei). barbat(vasile).
Elena Andrei

Ion

Dan

Vasile

Seciunile unui program Turbo Prolog


acelasi_parinte(X,Y):parinte(P,X), parinte(P,Y), X<>Y. sora(A,B): acelasi_parinte(A,B), femeie(A). goal sora(X,Y),write(Surori:,X, si , Y).

Seciunile unui program Turbo Prolog


Exerciii.

1. Pentru programul Prinii, n fereastra de dialog, s se


formuleze urmtoarele goal-uri: Goal: acelasi_parinte(ion, X) Goal: sora(X, ada) Goal: acelasi_parinte(maria, Y), barbat(Y) Goal: sora(X, Y)

S se explice rspunsurile obinute.


2. S se dezvolte programul Prinii pentru a determina care dintre persoane sunt veri, sau verioare.

Seciunile unui program Turbo Prolog


3. De formulat toate tipurile de intrebari in Prolog referitor la predicatul sora(s,s) si de insotit fiecare intrebare cu intrepretarea ei in limbajul natural, dupa modelul de mai jos:
1. 2. 3. 4. 5. 6. 7. 8. 9.

parinte(Parinte,_) Cine este parinte? parinte(_,Copil) Cine este copil? parinte(Parinte, maria) Cine sunt parintii Mariei? parinte(ana,_) Este oare Ana parinte? parinte(_,dan) Este oare Dan copil? parinte(_,_) Exista oare predicatul parinte in baza de cunostinte? parinte(Parinte,Copil) Cine sunt parintii si copiii lor? parinte(ana, maria) Este oare Ana parintele Mariei? parinte(ana, Copil) Cine sunt copiii Anei?

De analizat raspunsurile obtinute.

Entitati PROLOG: Intrebarile (exemplu)


Exemplu. are(ana,carte). are(ana,masina). are(dan,calculator). are(dan,masina). Interogarea vom realiza-o n fereastra de dialog. Dac formulm scopul: Goal: are(ana,masina) atunci rspunsul va fi: YES, ntruct scopul este satisfcut de ctre baza de cunotine. Dac formulm scopul: Goal: are(ana,calculator) atunci rspunsul va fi: NO. La interogarea: Goal: are(ana,X) se rspunde: X=carte X=masina
2 Solutions.

Tipurile de date
Sectiunea de domenii este la fel ca in celelalte limbaje de programare. Domeniile de baza sunt: char integer real string symbol

- char - caractere intre apostof; Caracterul '\n' inseamna secventa escape "new line", adica trecere la rand nou, iar '\251' inseamna caracterul ASCII cu codul 251; - integer - reprezinta multimea numerelor intregi cuprinse intre 32768 si 32767;

Tipurile de date
- real - daca notam prin "D" o cifra (digit), atunci un numar real poate avea una din formele: DDDDDDD DDDDDDD.DDDDDDD [+|-]DDDDD[.]DDDDDDD[e[+|-]DDD] Numerele "reale" din acest domeniu sunt din intervalul [10^{-307},10^{308}] reunit cu [-10^{308},-10^{-307}];

- string - reprezinta orice secventa de caractere scrise intre ghilimele. Lungimea unui sir (string) este mai mica de 255 caractere; - symbol - sunt permise doua forme: * o secventa de litere, numere si underscore (_), cu singura restrictie ca prima litera este mica; * o secventa de caractere marcata de ghilimele (aceasta este folosita cand vrem sa introducem spatii sau litera mare la inceput).

Tipurile de date
Exemple. char: symbol: string: integer: real: A, a, 5,!, + x1, X1, ion, Prolog, Turbo Prolog x1, X1, ion, Prolog, Turbo Prolog, Ada, + 5, -35, 0 5.0, -2.5, 2.6e+4

Nota: Pentru datele de tipul symbol spre deosebire de tipul string, se creeaz un tabel care se pstreaz n memoria intern i deci cutarea este mai rapid.

Termenii in Prolog

Termenii sunt formati dintr-o multime de caractere.

Caracterele recunoscute in Prolog se divizeaza in patru categorii: -multimea de litere majuscule: A B C D ... X Y Z
-multimea de litere minuscule: a b c d ... x y z

-multimea de caractere numerice: 0 1 2 3 4 5 6 7 8 9


-multimea de caractere speciale: ! " # $ % ' ( ) = - ~ " \ | { } [ ] _ ' @+:;*<>,.?/

Termenii in Prolog
Termeni Termenul este singura structura de date utilizata in programarea logica. Sintaxa termenilor structurati e asemanatoare cu cea a faptelor. Deci, un predicat poate fi considerat ca un termen structurat al carui functor este numele predicatului, iar argumentele reprezinta componentele termenilor structurati. Acesl lucru este utilizat in diverse implementari Prolog pentru tratarea uniforma si sinteza dinamica de programe.

Simpli

Structurai

Constante

Variabile

Atomi

Numere

Structura ierarhiccegrupeaza multimea de termeni Prolog

Termenii in Prolog
Un termen structurat se defineste de functorul su, componentele sale i arietatea sa (numrul de componente). Considerm un exemplu.

autor(grigore,vieru)
Functorul este autor, arietatea 2. Componentele unui termen structurat poate fi la rndul lor termeni structurai. cartea(mama_graiul,autor(grigore,vieru)) Un termen structurat poate fi reprezentat sub forma unui arbore a crui rdcin e simbolul funcional (functorul), numrul de descendeni ai rdcinii fiind arietatea (numrul de componente ale termenului structurat), ordonarea descendenilor corespunde ordonrii componentelor. Dac o component este un termen structurat, ea se descompune n acelai mod.

Termenii in Prolog
cartea

mama_graiul

autor

grigore

vieru

Reprezentarea structurii ierarhice a termenului structurat cartea(mama_graiul,autor(grigore,vieru))

Constantele: atomi
Constantele definesc obiecte specifice, particulare, sau relaii particulare. Exist dou tipuri de constante: atomi i numere. Atomii sunt constante simbolice care ncep, de obicei, cu o liter i pot conine litere, cifre i caracterul _. Exist i alte caractere ce pot forma atomi speciali, care au o semnificaie aparte n limbaj. Atomii pot desemna: obiecte constante care sunt argumentele predicatelor, de exemplu atomii mihai i maria n faptul parinte(mihai, maria); predicate Prolog sunt: definite de utilizator predefinite n sistem; atomi speciali, de exemplu atomii :- i ?- ; diverse reguli de construcie sintactic a atomilor depind de implementare.

Constantele: numere. Variabile


Numerele pot fi ntregi sau reale; sintaxa particular acceptat ct i domeniile de definiie depinznd de implementare. Numere pot fi pozitive sau negative. -12, 7.1, 24 Variabilele sunt, din punct de vedere sintactic, tot atomi, dar ele au o semnificaie special. Spre deosebire de regulile generale admise pentru construcia atomilor, numele unei variabile poate ncepe i cu simbolul _, ceea ce indic o variabil anonim. Utilizarea unei variabile anonime semnific faptul c nu ne intereseaz valoarea la care se va instania acea variabil. Din punctul de vedere al conveniei Prolog, numele oricrei variabile trebuie s nceap fie cu liter mare, fie cu _. Variabila, _variabila, Alta_vaRiabila2 sunt variabile.

Unificarea
Unificarea este procesul de 'potrivire' a doua predicate prin asignarea de valori unor variabile astfel incat cele doua predicate sa devina identice. Caracteristicile principale ale unificarii in Turbo Prolog: a) Cand Prolog-ul incearca sa satisfaca un scop, cauta o potrivire incepand cu prima clauza a programului. b) Cand se face un nou apel, cautarea unei potriviri incepe intotdeauna de la inceputul programului. c) Cand un apel a gasit o potrivire, spunem ca a reusit si se va incerca satisfacerea urmatorului subscop. d) Daca o variabila se leaga la o valoare intr-o clauza, singurul mod in care se poate dezlega este prin backtracking.

Unificarea. Regulile generale pentru unificarea a 2


termeni
-- Inainte de toate, mentionam ca daca termenl (sau termen2) e o variabila instantiata, atunci termen2 (sau termen1) se comporta ca termenul cu care a fost instantiata, adica ca o constanta sau o structura, sau o alta variabila. -- Daca termenl si termen2 ambii sunt atomi sau numere, ei pot sa se unifice cand fiecare este acelasi atom sau numar. In particular, un numar real nu poate sa se unifice cu un numar intreg, chiar daca exprima aceeasi valoare. -- Daca termenl si termen2 ambii sunt termeni structurati, ei pot fi unificati cand fiecare are acelasi functor principal, acelasi numar de argumente (arietate) si argumentele ce corespund acelorasi pozitii la randul sau pot sa se unifice. -- Daca termenl si termen2 sunt ambii variabile neinstantiate, ei pot fi unificati. In acest caz variabilele raman neinstantiate, dar legate una de alta, pana cel putin una din ele nu va fi instantiata si atunci, si cealalta devine automat instantiata cu acelasi termen.

Backtracking-ul
- La satisfacerea unei conjunctii de scopuri in Prolog, se incearca satisfacerea fiecarui scop pe rand, de la stanga la dreapta. Prima satisfacere a unui scop determina plasarea unui marcaj in baza de cunostinte in dreptul faptului sau regulii care a determinat satisfacerea scopului. - Daca un scop nu poate fi satisfacut (esueaza), sistemul Prolog se intoarce si incearca resatisfacerea scopului din stanga, pornind cautarea in baza de cunostinte de la marcaj in jos. inainte de resatisfacerea unui scop se elimina toate instantierile de variabile determinate de ultima satisfacere a acestuia. Daca cel mai din stanga scop din conjunctia de scopuri nu poate fi satisfacut, intreaga conjunctie de scopuri esueaza.

- Aceasta comportare a sistemului Prolog in care se incearca in mod repetat satisfacerea si resatisfacerea scopurilor din conjunctiile de scopuri se numeste backtracking.

Backtracking-ul

Backtracking-ul este mecanismul prin care Prolog-ul cauta (sistematic) solutia printre faptele si regulile din program. Principiile de baza ale backtrackingului sunt: a) Subscopurile trebuiesc satisfacute in ordine. b) Clauzele sunt testate in ordinea in care apar in program. c) Cand un subscop se unifica cu capul unei reguli, corpul ei se va adauga la multimea de subscopuri care trebuiesc satisfacute. d) Un scop este satisfacut atunci cand sunt satisfacute toate subscopurile sale.

Unificarea

Unificarea are loc atunci cnd: -- predicatele au acelai nume; -- obiectele unificate au acelai nume; -- obiectele i valoarea variabilelor legate sunt identice; -- valorile a dou variabile sunt identice; -- variabilele ce nu sunt legate se leag la valorile obiectelor care se unific; -- variabila anonim nu ia valoare, se unific cu orice; -- dac dou variabile sunt legate, atunci ndat ce una este concretizat (primete valoare) cealalt e legat de aceeai valoare.

Unificarea atomilor i numerelor

Termen1 Ion Ion

Termen2 ion petru 12 12 12.0 'Liviu Rebreanu' scriitor plus 3*4

'Liviu Rebreanu' 'Liviu Rebreanu' + I2

Unificarea da nu 12 da nu da nu nu nu

Unificarea unor termeni structurai

Termen1 autor(grigore,vieru) autor(grigore,vieru) autor(grigore,vieru) 3+4 3*4

Termen2 autor(grigore,vieru) nume(grigore,vieru) autor(grigore,vieru,1935) 4+3 *(3,4)

Unificarea da nu nu nu da

Backtracking-ul

Backtracking-ul
S examinm cum sistemul stabilete rspunsul pentru ultima interogare (goal). Pentru ca predicatul acelasi_parinte(X,Y) s fie adevrat e necesar ca predicatele parinte(P,X) i parinte(P,Y) s fie adevrate. De la nceput se suprapun predicatele acelasi_parinte(suzana,Z) din goal cu acelasi_parinte(X,Z) din clauz (regul). n rezultat X se concretizeaz cu "suzana", iar variabila Y se leag cu variabila Z . La urmtorul pas se ncearc s se concretizeze parinte(P,X) pentru X="suzana" cu baza de cunotine i P se concretizeaz cu "maria". La urmtorul pas se ncearc concretizarea parinte(P,Y) pentru P="maria" i se reuete pentru Y="dan". Se obine prima soluie: Z="dan". Deci s-a reuit unificarea formulei din goal cu o regul. Dac goal din fereastra de dialog conine variabile, atunci sistemul caut toate soluiile. n rezultat predicatul parinte(maria,Y) se suprapune cu faptul parinte(maria,suzana) i obinem a doua soluie: Y="suzana".

OPERATORII PROLOG: Expresii aritmetice si logice

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 (restul mpririi ntregi) i div (impartirea prin trunchiere) Operatori aritmetici
Operatorii aritmetici binari, cum ar fi +, -, *, /. Evaluarea expresiei se face la cerere n cazul n care se foloseste operatorul predefinit infixat is, de exemplu: X is 1 + 2. n Prolog se utilizeaz funciile: X mod Y, X div Y, round(X), trunc(X), abs(X), cos(X), sin(X), tan(X), arctan(X), exp(X), ln(X), log(X), sqrt(X).

OPERATORII PROLOG: Expresii aritmetice si logice Operatori relaionali sunt predicate predefinite. Un astfel de operator este operatorul de egalitate =. Predicatul (operatorul) de egalitate funcioneaz ca i cum ar fi definit prin urmtorul fapt: X = X. iar ncercarea de a satisface un scop de tipul X = Y se face prin ncercarea de a unifica X cu Y. Din aceasta cauz, dndu-se un scop de tipul X = Y, regulile de decizie care indic dac scopul se ndeplinete sau nu sunt urmtoarele: Dac X este variabil neinstaniat, iar Y este instaniat la orice obiect Prolog, atunci scopul reuete. Ca efect lateral, X se va instania la aceeai valoare cu cea a lui Y. De exemplu: ?- carte(barbu, poezii) = X. este un scop care reuete i X se instaniaz la carte(barbu, poezii). Dac att X ct i Y sunt variabile neinstaniate, scopul X = Y reuete, variabila X este legat la Y i reciproc. Aceasta nseamn c ori de cte ori una dintre cele dou variabile se instaniaz la o anumit valoare, cealalt variabila se va instania la aceeai valoare.

OPERATORII PROLOG: Expresii aritmetice si logice

Atomii i numerele sunt ntotdeauna egali cu ei nii. De exemplu, urmtoarele scopuri au rezultatul marcat drept comentariu:

mihai = mihai mare = mic 102 = 102 1010 = 1011

% este satisfcut % eueaz % reuete % eueaz

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.

OPERATORII PROLOG: Expresii aritmetice si logice

Dac un operand este variabil legat i cellalt este un obiect, atunci Operatorul testeaz dac valoarea legat este aceeai cu obiectul respectiv. 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.

OPERATORII PROLOG: Expresii aritmetice si logice


Expresiile aritmetice sunt evaluate n urmtoarea ordine:

Dac expresia conine subexpresii (n paranteze), ele sunt evaluate primele.

Dac expresia conine nmulirea (*) sau impartirea (/, div, mod), aceste operaii se execut urmtoarele, de la stnga la dreapta.
De la stnga la dreapta se execut operaiile adunarea (+) i scderea (-).
Operandul1 ntreg real ntreg real ntreg sau real ntreg ntreg Operatorul +, -, * +, -, * +, -, * +, -, * / div mod Operandul2 ntreg ntreg real real ntreg sau real ntreg ntreg Rezultatul ntreg real real real real ntreg ntreg

Tipul operaiilor operaiilor aritmetice

Operaii matematice in Prolog


Pentru evaluarea unei expresii aritmetice, se foloseste predicatul predefinit is: X is <expresie aritmetic>. suma(N1, N2, S) :- S is N1 + N2. Operatori matematici utilizati: Predicate Relatie < mai mic <= mai mic sau egal = egal > mai mare >= mai mare sau egal <>,>< diferit sunt pentru a verifica egalitatea dintre dou numere, respectiv pentru a verifica dac dou numere sunt diferite.

Operaii matematice in Prolog


Scrierea 2+3 nu reprezint o instruciune care pstreaz rezultatul acestei adunri. Reprezint mai degrab atomul adunarea lui 2 cu 3. Termenul 2+3 este diferit de termenul 4+1. numar(3). numar(4). Predicatul is (=) este predefinit. numar(5). n partea stng poate fi sau o variabil neinstaniat sau un ntreg, ? numar(2 + 1). iar n partea dreapt o expresie No aritmetic ce nu conine variabile ? X is 2 + 1, numar(X). neinstaniate. X=3 Yes

Operaii matematice in Prolog


Unificarea reprezinta modul n care PROLOG-ul realizeaz potrivirile ntre termeni: X = marian. Yes marian = andrei No place(maria, X) = place(Y, andrei). Y = maria, X = andrei f(X, a) = f(a, X). X=a place(maria, X) = place(X, andrei). No

Operaii matematice in Prolog


?-Y=2+2 Y=4 ?-X=3+2, Y=X*2 X=5, Y=10 ?-4<>2+2 no ?-a<>3+2 no ?-X=X-3*12 no ?-5=2-a<0 yes

Operaii matematice in Prolog


?-Z=7mod4 %predicatul XmodY gsete restul mpririi lui X la Y, Z=3 % unde X i Y sunt numere ntregi.

?-Z=4mod7 Z=4
?-Y=7div4 %predicatul XdivY gsete partea ntreag Y=1 %de la mprirea lui X la Y, unde X i Y sunt %numere ntregi. ?-Y=7div4 Y=0

Procese repetitive si recursie in Prolog


Prolog-ul nu dispune de instructiuni repetitive de genul FOR, WHILE, REPEAT. Pentru calculul formulelor recurente n Prolog se utilizeaz recursia. Exemplu. De calculat valoarea termenului al n-lea al irului: 1, 1, 2, 6, 24, 120, 720, ... 0!=1 1!=1*1 2!=1*1*2 3!= =1*1*2*3= 2!*3=6 4!=1*1*2*3*4=24 n!=1*1*2*3*4* *n=(n-1)!*n

Procese repetitive i recursie n Prolog


/*************************************************** * Calculul lui n! * ***************************************************/ domains i=integer r=real predicates factorial(i, r) % Numbers likely to exceed 32767 are declared as reals. clauses factorial(0, 1):-!. %Conditia de limita factorial(N, V) :-N>1, M=N-1,factorial(M,U),V=U*N.

Examinm scopul (de calculat 3!): ?-factorial(3,X)

Procese repetitive i recursie n Prolog


X=6 factorial(3,X)
stiva

factorial(3,3)

N 3

V X

M 2

V=U*3
factorial(2,U)

V=2*3 factorial(2,2)
U=2

factorial(0, 1):-!. factorial(N, V) :N>1,M=N-1, factorial(M,U),V=U*N.

stiva

U=>U2

N2 2

V2 U

M2 1

U=U2*2
factorial(1,U2) factorial(1,1)

stiva

U=>U3 V3 U2 M3 0

N3 1

U2=1*1
U2=U3*1 factorial(0,1)

factorial(0,U3)
U3=1

Procese repetitive i recursie n Prolog

Se ncearc unificarea scopului cu regula factorial(0,1) . Nu se reuete. Se trece la a doua regul care genereaz subscopul factorial(2,U) (apelul al doilea) . Apoi se genereaz subscopul factorial(1, U2 ) (apelul al treilea) i factorial(0, U3) (apelul al patrulea). Subscopul factorial(0, U3) se unific cu prima regul (conditia de limita) i U3 se concretizeaz cu valoarea 1. Acest proces l putem descrie cu ajutorul unei stive (vezi mai jos), care conine cortegii de forma < N, X >. De la nceput n stiv se pune < 3, X > , unde 3 este valoarea legat de N i X este variabil liber. Stiva se trece ntr-o nou stare i se pune < 2, U2 > . Analog se pune n stiv < 1, U3 > . Subscopul factorial(0, U3) se unific cu prima regul i n stiv se pune < 0, 1 > . Acum poate fi examinat subscopul U2 = N * U3. Obtinem: U2=1.

Procese repetitive i recursie n Prolog


Se iau valorile din vrful stivei i se treace cu o poziie mai jos, de unde se citeste N i se calculeaza V pentru aceast poziie. De la starea a) a sivei se trece pe rnd la strile b), c) i d). Se poate spune c au loc atribuirile: U2 = 11, U = U22, V = U*3. Prima regul a predicatului factorial se termin cu cut(!). Dac el nu ar fi prezent n prima regul, sistemul va ncerca cutarea altor soluii i va trece la valori negative pentru N , ceea ce nu e corect.
0 1 2 3 1 U3 U2 U 1 2 3 1 U2 U 2 3 2 U 3 6

< N, V > a) b) c) d)

Stiva pentru scopul factorial(3, F).

Procese repetitive i recursie n Prolog


Recursia are dezavantajul c la fiecare apel recursiv, se salveaz n stiva starea curenta pentru a se putea relua calculul dupa executarea apelului recursiv. Daca recursia este finala, atunci starea curenta nu va mai fi salvata in stiva. Conditiile ca un predicat s fie final recursiv, sunt: - apelul recursiv apare pe ultima pozitie n corpul regulei; - nu exista puncte de backtracking n regula. Deoarece valorile variabilelor se pierd in timpul backtrackingului, rezultatele intermediare folosite in procesul de recursie vor fi trecute de la o iteratie la alta, ca argumente ale predicatului recursiv.

Intrri. Ieiri
Predicate de intrare: readln(String) % Citete o linie de text, terminat cu Enter. readint(Integer) readchar(Char) readreal(Real) Aici am utilizat un mod de descriere a operanzilor pe care l vom utiliza i pe parcurs. n paranteze am indicat, c argumentul este o variabil (primul caracter este o majuscul) i tipul ei.
Cu operatorul write putem afia orice tip de obiecte. Formatul general: write(arg1, arg2, , argn) Argumentele sunt obiecte. Operatorul poate fi folosit att n reguli ct i n goal.

Ieiri

Exemplu. Goal: muritor(X),write(X) sau

Goal: muritor(X),write("muritor:",X),nl
unde nl este un operator de ieire i are semnificaia \n din alte limbaje. Se citete linie nou (newline).

Ieiri
Predicatul writef este analog lui write, n plus are un format conform cruia are loc afiarea. Formatul general este: writef(<format>, arg1, arg2, ..., argn) <format> este un ir de caractere n care se specific formatul pentru fiecare argument. Acest ir trebuie s conin ati specificatori de format, ci argumeni sunt indicai. Specificatorul formatului are forma general: %[-] m.pw unde: - determin alinierea la stnga (implicit la dreapta) m este numrul maxim de poziii p este numrul maxim de poziii pentru partea zecimal w poate fi: f real n zecimal fixat, e real n notaie exponenial, g real scurt (implicit) s string sau symbol w poate fi omis.

Ieiri

Exemplu. Fie X=1.0, Y=3.37, Z=4.5 writef("Sunt numere %1 si %4.1, precum si %-10e",X,Y,Z). Rezultatul va fi: Sunt numere 1 si 3.4, precum si 4.5e+00

Bibliografie

Cotelea V., Programarea n logic, UAM, Chiinu, 2000 S. Lsi, G. Sturza, V. Grigorcea., Turbo Prolog. USM, Chiinu (ediie electronic). Meszaros Judith, Turbo Prolog 2.0 Ghid de utilizare, Editura Albastr, Cluj-Napoca, 1996 ndreanu N., Introducere n Programarea logic. Limbajul Prolog, Editura"Intarf", Craiova, 1994 J. Doores, A.R.Reiblein &S. Vadera., Prolog-programming for tomorrow. Sigma Press.Wilmslow, 1987. http://inf.ucv.ro/~rstoean/courses/pnp/index.html http://thor.info.uaic.ro/~georgie/prolog/ http://www.utgjiu.ro/math/mbuneci/book/exp.html http://www.mariel.ru/mmlab/home/prolog/LECTION2/index.html