Download ppt - Curs1. Prolog

Transcript

Bazele Informaticii(curs pentru doctoranzi)

Aurelia Prepeliţă (Profir), dr.,conf. univ.

catedra “Tehnologii de Programare”, U.S.M.

Tematica lucrărilor 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, cunoştinţe şi utilizarea lor (Curs 1).

Sistemul de operare Windows. Operaţii cu ferestre, dosare, fişiere, programe, aplicaţii (Curs 2).

Editorul de texte Microsoft Word. Crearea şi redactarea documentelor în Microsoft Word. Crearea tabelelor şi efectuarea operaţiilor cu elementele tabelelor (Curs 3).

Aplicaţia Excel. Calculul tabelelor. Crearea tabelelor, graficelor, diagramelor în Excel şi includerea lor într-un document pregătit în Microsoft Word (Curs 4).

Tematica lucrărilor de laborator la informatică pentru doctoranzi

(cursurile 1-8): Aplicaţia Microsoft PowerPoint. Crearea unei prezentaţii în PowerPoint (Curs 5). Navigarea pe Internet. Internetul şi poşta electronică. Crearea poştei electronice. Pregătirea, transmiterea şi primirea mesajelor electronice (Curs 6). Reţele de calculatoare (Curs 7). Aplicaţia Acces. Crearea unei baze de date simple în Acces. Crearea interogărilor pe exemplu dat (Curs 8). Reprezentarea informaţiei (Curs 9). Sisteme de operare. Algoritmi. Limbaje (Curs 10). Componentele calculatorului (Curs 11).

Prelegeri:

Vineri

17.00 - 18.20 (425/4)

Orele de laborator:Luni

14.20 - 15.40 (203/4a)15.55 - 17.15 (206/4a)

Marţi

14.20 -15.40 (145b/4)

Miercuri

15.55 - 17.15 (203/4a)17.30 - 18.50 (203/4a)

Joi

15.55 - 17.15 (206/4a)17.30 - 18.50 (206/4a)

Curs 1

Programarea logică în Prolog

Curs1. Programarea logică în Prolog• Introducere in Prolog. Principalele caracteristici ale

limbajului Prolog.• Structura programelor Turbo Prolog. Secţiunile

unui program în Turbo Prolog.

• Elemente constitutive: tipuri de date, clauze, fapte,

interogări (goal), reguli, constante, variabile, predicate

aritmetice, intrări, ieşiri.

• Procesarea programelor Prolog, căutarea soluţiilor.

Backtracking-ul.

• Recursivitate. Simulări 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 obţinuta soluţia. În limbajul Prolog un programator trebuie sa descrie numai componenta logica a unui algoritm (să specifice problema ce trebuie soluţionata), lăsând 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

Meniul principal: Files, Edit, Run,

Compile, Options, Setup

Dupa ce a fost lansată aplicaţia Prolog, se tastează Enter. Maximizarea/redimensionarea ferestrei de aplicaţie – 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

Structura programelor Turbo Prolog:

Un program Prolog este divizat în secţiuni. Secţiunile

Prolog sunt: domains, global domains, database,

predicates, global predicates, clauses, goal.

Unele secţiuni putem să le omitem, dacă ele nu se utilizează. De exemplu, dacă nu

utilizăm bazele de date dinamice, atunci secţiunea database nu se include în

program.

Secţiunile unui program Turbo Prolog

Programul “acelasi_parinte” şi ferestre Turbo Prolog.

Secţiunile unui program Turbo Prolog

În secţiunea 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.

Secţiunile 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

Secţiunile unui program Turbo Prolog

În secţiunea 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. Aritatea unui predicat este numarul de argumente; doua predicate cu acelasi nume pot avea aritati diferite. Ele trebuie declarate in sectiunea de predicate si corpul lor in sectiunea de clauze.Exemplu: domains s = symbol

predicatesvirsta(s, integer)

Secţiunile unui program Turbo Prolog

Secţiunea clauses conţine baza de cunoştinţe. În această secţiune se scriu faptele şi regulile. Clauzele cu conjuncţii sunt relaţii 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 disjuncţii sunt relaţii care au forma: T :- Q1; Q2; …; Qn . Se poate scrie şi astfel: T if Q1 or Q2 or … or Qn .În secţiunea goal se conţine o interogare (scop extern). Dacă această secţiune lipseşte, atunci interogările 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.

Secţiunile unui program Turbo Prolog

Exemplu. Programul „Părinţii”:

domainss=symbol

predicatesacelasi_parinte(s,s)femeie(s)barbat(s)sora(s,s)parinte(s,s)

Secţiunile unui program Turbo Prolog

clausesparinte(ion,ada). % Ion este parintele Adeiparinte(petru,ion).parinte(petru,maria).parinte(suzana,ion).parinte(ion,angela).parinte(suzana,maria).parinte(andrei,ion).femeie(ada).femeie(maria).femeie(suzana).femeie(angela).barbat(ion).barbat(petru).

Secţiunile 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).

Exerciţii.

1. Pentru programul „Părinţii”, în fereastra de dialog, să se formuleze următoarele 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 răspunsurile obţinute.

2. Să se dezvolte programul „Părinţii” pentru a determina care dintre persoane sunt veri, sau verişoare.

Secţiunile unui program Turbo Prolog

Exemplu.are(ana,carte).are(ana,masina).are(dan,calculator).are(dan,masina).Interogarea vom realiza-o în fereastra de dialog. Dacă formulăm scopul: Goal: are(ana,masina)atunci răspunsul va fi: YES, întrucât scopul este satisfăcut de către baza de cunoştinţe. Dacă formulăm scopul: Goal: are(ana,calculator)atunci răspunsul va fi: NO. La interogarea: Goal: are(ana,X)se răspunde: X=carte X=masina 2 Solutions.

Entitati PROLOG: Intrebarile (exemplu)

Tipurile de date

Sectiunea de domenii este la fel ca in celelalte limbaje de programare. Domeniile de baza sunt:charintegerrealstringsymbol

- 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: DDDDDDDDDDDDDD.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 dateExemple.

char: ‘A’, ’a’, ’5’,’!’, ‘+’symbol: x1, ”X1”, ion, ”Prolog”, “Turbo Prolog”string: “x1”, ”X1”, “ion”, ”Prolog”, “Turbo Prolog”, “Ada”, ”+”integer: 5, -35, 0real: 5.0, -2.5, 2.6e+4

Pentru datele de tipul symbol spre deosebire de tipul string, se creează un tabel care se păstrează în memoria internă şi deci căutarea 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

Simpli Structuraţi

Constante Variabile

Atomi Numere

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.

Structura ierarhică ce grupeaza multimea de termeni Prolog

Un termen structurat se defineste de functorul său, componentele sale şi arietatea sa (numărul de componente). Considerăm un exemplu.

autor(grigore,vieru)

Functorul este autor, arietatea 2. Componentele unui termen structurat poate fi la rândul lor termeni structuraţi.

cartea(mama_graiul,autor(grigore,vieru))

Un termen structurat poate fi reprezentat sub forma unui arbore a cărui rădăcină e simbolul funcţional (functorul), numărul de descendenţi ai rădăcinii fiind arietatea (numărul de componente ale termenului structurat), ordonarea descendenţilor corespunde ordonării componentelor. Dacă o componentă este un termen structurat, ea se descompune în acelaşi mod.

Termenii in Prolog

Termenii in Prolog

cartea

autormama_graiul

grigore vieru

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

Constantele definesc obiecte specifice, particulare, sau relaţii particulare. Există două tipuri de constante: atomi şi numere. Atomii sunt constante simbolice care încep, de obicei, cu o literă şi pot conţine litere, cifre şi caracterul “_”. Există şi alte caractere ce pot forma atomi speciali, care au o semnificaţie 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 construcţie sintactică a atomilor depind de implementare.     

Constantele: atomi

Numerele pot fi întregi sau reale; sintaxa particulară acceptată cât şi domeniile de definiţie depinzând de implementare. Numere pot fi pozitive sau negative.▫ -12, 7.1, 24Variabilele sunt, din punct de vedere sintactic, tot atomi, dar ele au o semnificaţie specială. Spre deosebire de regulile generale admise pentru construcţia 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 instanţia acea variabilă.Din punctul de vedere al convenţiei Prolog, numele oricărei variabile trebuie să înceapă fie cu literă mare, fie cu “_”.▫ Variabila, _variabila, Alta_vaRiabila2 sunt variabile.

Constantele: numere. Variabile

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

-- 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.

Unificarea. Regulile generale pentru unificarea a 2 termeni

- 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.

Backtracking-ul

Unificarea are loc atunci când: -- predicatele au acelaşi nume; -- obiectele unificate au acelaşi 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ă (primeşte valoare) cealaltă e legată de aceeaşi valoare.

Unificarea

Unificarea atomilor şi numerelor

Termen1 Termen2 Unificarea

Ion ion da

Ion petru nu

12 12 da

12 12.0 nu

'Liviu Rebreanu' 'Liviu Rebreanu' da

'Liviu Rebreanu' scriitor nu

+ plus nu

I2 3*4 nu

Unificarea unor termeni structuraţi

Termen1 Termen2 Unificarea

autor(grigore,vieru) autor(grigore,vieru) da

autor(grigore,vieru) nume(grigore,vieru) nu

autor(grigore,vieru) autor(grigore,vieru,1935) nu

3+4 4+3 nu

3*4 *(3,4) da

Backtracking-ul

Să examinăm cum sistemul stabileşte răspunsul pentru ultima interogare (goal). Pentru ca predicatul acelasi_parinte(X,Y) să fie adevărat e necesar ca predicatele parinte(P,X) şi parinte(P,Y) să fie adevărate. 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 următorul pas se încearcă să se concretizeze parinte(P,X) pentru X="suzana" cu baza de cunoştinţe şi P se concretizează cu "maria". La următorul pas se încearcă concretizarea parinte(P,Y) pentru P="maria" şi se reuşeşte pentru Y="dan". Se obţine prima soluţie: Z="dan". Deci s-a reuşit unificarea formulei din goal cu o regulă. Dacă goal din fereastra de dialog conţine variabile, atunci sistemul caută toate soluţiile. În rezultat predicatul parinte(maria,Y) se suprapune cu faptul parinte(maria,suzana) şi obţinem a doua soluţie: Y="suzana".

Backtracking-ul

Deşi PROLOG a fost proiectat în primul rând ca un limbaj de programare simbolică, el dispune de operatorii pentru cele patru operaţii aritmetice de bază şi operatorii unari minus şi plus, la care se adaugă operatorii mod (restul împărţirii î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ă funcţiile: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 relaţionali sunt predicate predefinite. Un astfel de operator este operatorul de egalitate =. Predicatul (operatorul) de egalitate

funcţionează ca şi cum ar fi definit prin următorul 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ă, dându-se un scop de tipul X = Y, regulile de decizie care indică dacă scopul se îndeplineşte sau nu sunt următoarele: Dacă X este variabilă neinstanţiată, iar Y este instanţiată la orice obiect Prolog, atunci scopul reuşeşte. Ca efect lateral, X se va instanţia la aceeaşi valoare cu cea a lui Y. De exemplu: ?- carte(barbu, poezii) = X. este un scop care reuşeşte şi X se instanţiază la carte(barbu, poezii).

Dacă atât X cât şi Y sunt variabile neinstanţiate, scopul X = Y reuşeşte, variabila X este legată la Y şi reciproc. Aceasta înseamnă că ori de câte ori una dintre cele două variabile se instanţiază la o anumită valoare, cealaltă variabila se va instanţia la aceeaşi valoare.

OPERATORII PROLOG: Expresii aritmetice si logice

Atomii şi numerele sunt întotdeauna egali cu ei înşişi. De exemplu, următoarele scopuri au rezultatul marcat drept comentariu:

mihai = mihai  % este satisfăcutmare = mic   % eşuează102 = 102   % reuşeşte1010 = 1011   % eşuează

În prelucrările aritmetice realizate în PROLOG semnul “=” joacă un rol special. El este privit ca un operator cu doi operanzi: operand1 = operand2.

Următoarele reguli determină comportarea acestui operator: Dacă unul din operanzi este variabilă nelegată şi celălalt este un

obiect, atunci operatorul leagă variabila la obiectul respectiv.

OPERATORII PROLOG: Expresii aritmetice si logice

Dacă un operand este variabilă legată şi celălalt este un obiect, atunci Operatorul testează dacă valoarea legată este aceeaşi cu obiectul respectiv.

Dacă un operand este variabilă liberă, iar celălalt 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 aceleaşi.

OPERATORII PROLOG: Expresii aritmetice si logice

Tipul operaţiilor operaţiilor aritmetice

OPERATORII PROLOG: Expresii aritmetice si logice

Operandul1 Operatorul Operandul2 Rezultatul

întreg  +, -, * întreg întreg

real   +, -, * întreg real

întreg   +, -, * real real

real   +, -, * real real

întreg sau real  / întreg sau real real

întreg  div întreg întreg

întreg mod  întreg întreg

Expresiile aritmetice sunt evaluate în următoarea ordine:• Dacă expresia conţine subexpresii (în paranteze), ele sunt evaluate

primele.• Dacă expresia conţine înmulţirea (*) sau impartirea (/, div, mod), aceste

operaţii se execută următoarele, de la stânga la dreapta.• De la stânga la dreapta se execută operaţiile adunarea (+) şi scăderea

(-).

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.

Operaţii matematice in Prolog

• Scrierea 2+3 nu reprezintă o instrucţiune care păstrează rezultatul acestei adunări.

Reprezintă mai degrabă atomul ‘adunarea lui 2 cu 3’.• Termenul 2+3 este diferit de termenul 4+1.numar(3).numar(4).numar(5).? – numar(2 + 1).No? – X is 2 + 1, numar(X).X = 3Yes

Operaţii matematice in Prolog

Predicatul is (=) este predefinit.

În partea stângă poate fi sau o variabilă neinstanţiată sau un întreg, iar în partea dreaptă – o expresie aritmetică ce nu conţine variabile neinstanţiate.

Unificarea reprezinta modul în care PROLOG-ul realizează potrivirile între termeni:

▫ X = marian. Yes▫ marian = andreiNo▫ 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

Operaţii matematice in Prolog

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

Operaţii matematice in Prolog

?-Z=7mod4 %predicatul XmodY găseşte restul împărţirii lui X la Y, Z=3 % unde X şi Y sunt numere întregi.

?-Z=4mod7 Z=4

?-Y=7div4 %predicatul XdivY găseşte partea întreagă Y=1 %de la împărţirea lui X la Y, unde X şi Y sunt

%numere întregi.

?-Y=7div4 Y=0

Operaţii matematice 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!=11!=1*12!=1*1*23!= =1*1*2*3= 2!*3=64!=1*1*2*3*4=24…n!=1*1*2*3*4* …*n=(n-1)!*n

Procese repetitive si recursie in Prolog

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

Examinăm scopul (de calculat 3!):

?-factorial(3,X)

Procese repetitive şi recursie în Prolog

Procese repetitive şi recursie în Prolog

factorial(3,X)

factorial(2,U)

U=>U2

factorial(1,U2)

U=>U3

factorial(0,U3)

N V M

3 X 2

N2 V2 M2

2 U 1

N3 V3 M3

1 U2 0

V=U*3

U=U2*2

U2=U3*1

U3=1

factorial(3,3)

factorial(2,2)

factorial(0,1)

factorial(1,1)

U2=1*1

U=2

V=2*3

X=6

factorial(0, 1):-!. factorial(N, V) :-

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

stiva

stiva

stiva

Se încearcă unificarea scopului cu regula factorial(0,1) . Nu se reuşeşte. 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 conţine 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

0 1

1 U3 1 1

2 U2 2 U2 2 2

3 U 3 U 3 U 3 6

< N, V >

a) b) c) d)

Stiva pentru scopul factorial(3, F).

Se iau valorile din vârful stivei şi se treace cu o poziţie mai jos, de unde se citeste N şi se calculeaza V pentru această poziţie. De la starea a) a sivei se trece pe rând la stările 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 căutarea altor soluţii şi va trece la valori negative pentru N , ceea ce nu e corect.

Procese repetitive şi recursie în Prolog

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 backtracking-ului, rezultatele intermediare folosite in procesul de recursie vor fi trecute de la o iteratie la alta, ca argumente ale predicatului recursiv.

Intrări. Ieşiri

Predicate de intrare:readln(String) % Citeşte 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 afişa orice tip de obiecte. Formatul general:write(arg1, arg2, …, argn)

Argumentele sunt obiecte. Operatorul poate fi folosit atât în reguli cât şi în goal.

Ieşiri

Exemplu.

Goal: muritor(X),write(X)

sau

Goal: muritor(X),write("muritor:",X),nl

unde nl este un operator de ieşire şi are semnificaţia ‘\n’ din alte limbaje. Se citeşte linie nouă (newline).

Ieşiri

Predicatul writef este analog lui write, în plus are un format conform căruia are loc afişarea. 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ă conţină atâţi specificatori de format, câţi argumenţi sunt indicaţi. Specificatorul formatului are forma generală:

%[-] m.pwunde: - – determină alinierea la stânga (implicit la dreapta) m – este numărul maxim de poziţii p – este numărul maxim de poziţii pentru partea zecimală w – poate fi:

f – real în zecimal fixat,e – real în notaţie exponenţială,g – real scurt (implicit)s – string sau symbol

w poate fi omis.

Ieşiri

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ă, UŞAM, Chişinău, 2000 S. Lâsâi, G. Sturza, V. Grigorcea., Turbo Prolog. USM, Chişinău

(ediţie electronică). Meszaros Judith, Turbo Prolog 2.0 Ghid de utilizare, Editura

Albastră, Cluj-Napoca, 1996 Ţândăreanu 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