Cuprins:
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:
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.
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:
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:
|
|
N * N, N / N |
adunare, scadere, inmultire, impartire |
|
impartire cu rest (div) |
|
remainder |
|
modulo |
|
ridicare la putere |
|
minus unar |
|
modul |
|
arctangenta(N1/N2) exprimata in radiani [-pi..pi] |
|
cel mai mic intreg mai mare decat N |
|
cosinus |
|
exponential(e**N) |
|
radical |
|
signum |
|
conversie la numar real |
|
cel mai mare intreg mai mic decat N |
|
ln(N), logaritm natural |
|
sinus |
|
trunchiere |
|
rotunjire |
|
deplasare la dreapta pe biti |
|
deplasare la stanga pe biti |
|
SI logic pe biti(bitwise and) |
|
SAU logic pe biti (bitwise or) |
|
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:
reuseste daca Int3 = Int1+Int2; cel putin doua dintre cele trei argumente trebuie sa fie legate.