Lucrarea nr. 2




Cuprins:

  1. Elemente de baza ale limbajului Prolog
  2. Structuri
  3. Aritmetica numerelor

Elemente de baza ale limbajului Prolog






Un program Prolog (sau mai exact text Prolog) este alcatuit dintr-o serie de clauze. Fiecare clauza se termina cu punct. Cand textul Prolog a fost comunicat sistemului Prolog, acesta poate fi supus unor intrebari.

Faptele sunt clauze prin care se afirma lucruri ce sunt intotdeauna si neconditionat adevarate. In exemplul de mai jos declaram fapte despre relatia parinte:

 parent( pam, bob).
 parent( tom, bob).
 parent( tom, john).
 parent( bob, pat).

Numarul argumentelor unei relatii se numeste aritatea relatiei. In exemplul de mai sus relatia (predicatul) parent are aritatea 2 (parent/2).

Dupa ce am compilat textul din exempul anterior, putem intreba, de exemplu, daca  este sau nu bob parintele lui pat:

 ?- parent( bob, pat).
 Yes

Raspunsul la intrebare (tinta) poate fi pozitiva sau negativa, dupa cum tinta poate fi sau nu demonstrata de Prolog pornind de la cunostintele sale.

Argumentele unei relatii pot fi obiecte concrete sau generale. Atomii (ca pam sau tom) constituie un tip de obiecte concrete notate printr-un identificator ce incepe cu litera mica. Variabilele, spre diferenta de atomi, incep cu litera mare. Astfel putem intreba: "Cine este parintele lui john?"

 ?- parent( X, john).
 X = tom
 Yes

Daca tinta contine variabile, atunci in timpul satisfacerii tintei variabilele pot fi legate (instantiate). Astfel, in timpul raspunsului la intrebarea de mai sus variabila X a fost legata cu atomul tom. Un caz special de variabila este variabila anonima ( _ ), care are semnificatia de orice, oricine. Folosind variabila anonima, putem intreba daca are john parinte, fara sa ne intereseze identitatea lui:

 ?- parent( _, john).
 Yes

Variabilele cu acelasi nume dintr-o clauza denota reprezinta acelasi obiect. In schimb variabilele anonime pot sa reprezinte obiecte diferite. Astfel intrebarea

 ?- parent(X,pat), parent(X,john).
 No

cere ca parintele lui pat si john sa fie identic, ceea ce nu este necesar pentru o formulare

 ?- parent(_,pat), parent(_,john).
 Yes

In cazul in care exista mai multe raspunsuri posibile, putem solicita acest lucru prin tastarea lui 'n' sau ';'

 ?- parent(X,bob).
 X = pam;
 X = tom
 Yes

Predicatele avand valori logice pot fi combinate prin operatori SI (,) SAU(;), respectiv grupate cu ajutorul parantezelor.

 ?- parent(X,Y), parent(Y,pat).
 X=pam
 Y=bob

Pentru a putea defini relatii bazandu-ne pe fapte deja cunoscute, putem defini acestea cu ajutorul regulilor. O regula specifica lucruri ce sunt adevarate daca o anumita conditie este satifacuta.

 grandparent(X,Z) :- parent(X,Y), parent(Y,Z).

In exemplul de mai sus am definit relatia grandparent, cu ajutorul relatiei parent. Partea stanga a relatiei este concluzia, partea dreapta este conditia, iar simbolul ":-" se traduce prin "daca" (if).

Probleme:

  1. Cunoscind sexul, inaltimea, varsta si pasiunile unor persoane (exprimate prin fapte), sa se defineasca relatia pereche/2 , care cauta perechile de sex diferit, inaltime si varsta egala si cel putin o pasiune comuna.
  2. Sa se defineasca relatiile copil, frate, nepot si predecesor pornind de la relatia parent.



Structuri





Obiectele structurate (structuri) sunt obiecte care au mai multe componente. Data, de exemplu, poate fi vazuta ca o structura cu trei componente: an, luna si zi. Componentele unei structuri se combina cu ajutorul unui functor. Pentru data putem alege functorul date:  date(1970, jan, 1) In exemplu, argumentele structurii (1970, jan si 1) sint obiecte constante. Ele pot fi  la randul lor si variabile, sau structuri. Tipul unei structuri poate fi recunoscut in totalitate prin forma sa sintactica.

Problema: Sa se scrie un predicat care testeaza daca segmentele din componenta unei figuri geometrice formeaza sau nu un triunghi. Tipul figura se reprezinta cu ajutorul functorului fig cu argumente de tip segment. Tipul segment are ca functor seg si ca argumente 2 puncte. Tipul punctare ca functor p si ca argumente doua numere intregi.


Aritmetica numerelor






Numerele utilizate in Prolog includ numere intregi si reale. Notatia lor este cea obisnutia din alte limbaje de programare. O atentie speciala necesita in schimb aritmetica numerelor in Prolog.

Expresiile sunt evaluate in urmatoarele cazuri:

          ?- X is 2+3.
          X = 5
          Yes           ?- 5+3 =:= 4+4.
          Yes

Obs: In al doilea caz daca partea stanga sau dreapta nu este legata, atunci raspunsul este negativ:

          ?- X =:= 1+2.
          No

dar daca X este legat anterior atunci:

          ?-  same(X,3), X =:= 1+2.
          X=3
          Yes.

unde same este un predicat definit de noi prin: same(A,A).

Operatorii si functiile standard din Prolog sint urmatoarele:
 
Operator / Functie
Semantica
N + N, N - N,
N * N, N / N
adunare, scadere, inmultire, impartire
I //  I 
impartire cu rest (div)
I rem I
remainder
I mod I
modulo
N ** N
ridicare la putere
-N
minus unar
abs(N)
modul
atan(N1, N2)
arctangenta(N1/N2) exprimata in radiani [-pi..pi]
ceiling(N)
cel mai mic intreg mai mare decat N
cos(N)
cosinus
exp(N)
exponential(e**N)
sqrt(N)
radical
sign(N)
signum
float(N)
conversie la numar real
floor(N)
cel mai mare intreg mai mic decat N
log(N)
ln(N), logaritm natural
sin(N)
sinus
truncate(X)
trunchiere
round(X)
rotunjire
I >> J
deplasare la dreapta pe biti
I << J
deplasare la stanga pe biti
I/\J
SI logic pe biti(bitwise and)
I\/J
SAU logic pe biti (bitwise or)
\I
NOT logic pe biti (bitwise not)

in care I si J denota argumente intregi, X argumente reale, iar N argumente de orice tip numeric.

Pentru a intelege in totalitate folosirea functilor si operatorilor aritmetici, trebuie sa fim constienti de compatibilitatea perfecta intre operatori, functii si functorii intalniti la structuri. In cazul functiilor, aceasta compatibilitate este naturala, iar in cazul operatorilor aritmetici, aceasta compatibilitate se obtine din echivalenta notatiei infix si prefix. Astfel expresia 1+2 o putem rescrie sub forma +(1,2).

Exemplu.:

 ?- X is +(1,2).
 X=3
 Yes

Datorita acestei compatibilitati exemplul urmator este in totalitate corect:

 ?- same( 1+2, X), 5-2 =:= X.
 X = 1 + 2
 Yes
 

Probleme:

  1. Sa se defineasca predicatele abs/2, min/3 si max/3.
  2. Sa se defineasca predicatul factorial(N,F).
  3. Sa se redefineasca predicatul between(N1,N2,N), care leaga succesiv variabila N cu valori intregi din intervalul [N1..N2].
  4. Sa se defineasca predicatul eval(Expr,Val), unde Expr este o expresie aritmetica continind numai operatorii + si -, iar Val se obtine prin evaluarea lui Expr. Se considera necunoscut predicatul is, in schimb se foloseste predicatul (nestandard, dar existent in SWI-Prolog) plus:
               plus(Int1, Int2, Int3)

        reuseste daca Int3 = Int1+Int2;  cel putin doua dintre cele trei argumente trebuie sa fie legate.