Sunteți pe pagina 1din 37

Prelegerea 3

Sintaxa limbajului si structura


programului Prolog
Ideea de bază în prpgramarea logică este
exprimată prin
Algorithm = Logic + Control.
Componenta Logic - asimilată cu "program Prolog", sau
"bază de cunoştinţe" - vizează descrierea problemei: ce fapte
se cunosc şi ce reguli generale trebuie folosite pentru a
deduce ulterior alte fapte (noi).
Componenta Control reprezintă însuşi interpretorul (ori
fiinţa raţională) care va "executa" programele; interpretorul
de Prolog "aplică" metoda deducerii şi un mecanism intern de
Backtrackig recursiv - căutând sistematic valori cu care să
"înlocuiască“ necunoscutele implicate în scopul ("goal")
Entitatile de baza limbajului Prolog sunt:

• fapte: indica proprietati ale obiectelor sau relatii


intre acestea .
• reguli: definesc dependentele dintre obiecte, si
permit derivarea de fapte noi. Sunt codificate in
forma clauzelor Horn
• scopuri (goals): reprezinta intrebari ce se doresc
solutionate de catre sistem.
Sintaxa limbajului Prolog
Clasificarea obiectelor din limbajul Prolog
Obiecte elementare
Exista doua tipuri de constante: atomi si numere.
• Atomii sunt constante simbolice care incep, de obicei, cu o
litera si pot contine litere, cifre si caracterul “_”.
• Numerele pot fi intregi sau reale;
Atomii pot desemna:
• obiecte constante care sunt argumentele predicatelor, de
exemplu atomii mihai şi maria in faptul
iubeste(mihai, maria);
• predicate Prolog, fie cele definite de utilizator, fie cele
predefinite in sistem; de exemplu atomul iubeste in faptul
iubeste(mihai, maria);
• atomi speciali, de exemplu atomii “:-” şi “?” , “;”
Tipuri elementare standard

• char: un caracter incadrat intre doua caractere


apostrof;
• integer: intreg cuprins in intervalul [-32768, 32767];
• real: numar real, echivalent cu double din C ;
• string: secventa de caractere, ce este implementata
ca un pointer la un tablou terminat prin zero, ca şi in C
• symbol: analog ca la tipul string, cu diferenţa că
primul caracter este litera mica
• file: nume simbolic de fişier
Structuri
• O structura Prolog este un obiect ce desemneaza o colecţie
de obiecte corelate logic, care formează componentele
structurii.
Exemple:
• poseda(mihai, carte(prolog, bratko, 1990)).
unde carte(prolog, bratko, 1990) este o structură cu numele
carte si cu trei componente: prolog, bratko si 1990.

Se admit si structuri imbricate:


• poseda(mihai, carte (prolog, autori(in, solomon),
1981)).
Structuri
În Prolog, o structura se defineste prin specificarea:
-numelui structurii ( functorul structurii);
-elementelor structurii (compon.structurii).

Un arbore binar poate fi reprezentat in Prolog tot


printr-o structura, de exemplu:
arb(barbu, arb(ada, vid, vid), vid).
reprezinta un arbore binar cu cheia din radacina
barbu, cu subarborele drept vid si cu subarborele
sting format dintr-un singur nod cu cheia ada.
Structuri
Sintaxa structurilor este aceeasi cu cea a faptelor
Prolog. Un predicat Prolog poate fi văzut ca o
structura a cărui functor este numele predicatului, iar
argumentele acestuia reprezintă componentele
structurii.

Considerarea predicatelor Prolog ca structuri


prezintă un interes deosebit; atît datele cît şi
programele în Prolog au aceeaşi forma, ceea ce
faciliteaza tratarea uniformă si sinteza dinamică de
programe.
Liste

O listă este o structură de date ce reprezintă o


secvenţă ordonată de zero sau mai multe elemente.

O listă poate fi definită recursiv astfel:


1. lista vidă (lista cu 0 elemente) este o listă
2. o listă este o structură cu două componente:
primul element din listă (capul listei) şi restul
listei (lista formată din urmatoarele elemente
din lista).
Liste
Liste
• Lista vidă este reprezentata prin atomul special [ ].
Sfîrşitul unei liste este de obicei reprezentat ca
listă vidă.
• [a] – lista conţine numai un element

• [a, b, c] – o listă cu trei elemente

Această sintaxă a listelor este generală şi valabilă în


orice implementare Prolog.
Liste
O operaţie frecventă asupra listelor este obţinerea
primului element dintr-o listă şi a restului listei, deci
a celor două componente ale structurii de listă.
Aceasta operaţie este realizată în Prolog de
operatorul de scindare a listelor “|” scris sub
următoarea formă:
[Prim | Rest]
Dacă lista conţine exact un element, Rest va
reprezenta lista vidă. Încercarea de identificare a
structurii [Prim | Rest] cu o listă vidă duce la eşec.
Structuri echivalente

[a, b, c] =
[a | [b, c] ] =
[a, b | [c] ] =
[a, b, c | [ ] ] =
[a | [b | [c] ] ] =
[a | [b | [c | [ ] ] ] ].
Considerînd următoarele fapte existente în
baza de cunoştinţe Prolog
pred([1, 2, 3, 4]).
pred([coco, sta, pe, [masa, alba]]).
se pot pune următoarele întrebări obţinînd răspunsurile
specificate:
?- pred([Prim | Rest]).
Prim = 1, Rest = [2, 3, 4];
Prim = coco, Rest = [sta, pe, [masa, alba]];
No
?- pred([ _, _ , _ , [ _ | Rest]])
Rest = [alba]
Un predicat util în multe aplicaţii este cel care testează
apartenenţa unui element la o listă şi care se defineşte astfel:
membru(Element, [Element | _ ]).
membru(Element, [ _ | RestulListei]) :-
membru(Element, RestListei).
Funcţionarea acestui scurt program Prolog poate fi urmărită
cerând răspunsul sistemului la următoarele scopuri:
?- membru(b, [a, b, c]).
yes
?- membru(X, [a, b, c]).
X = a;
X = b;
X = c;
No.
Operatori

Operatorii relaţionali sunt predicate predefinite


infixate. Un astfel de operator este
operatorul de egalitate “=“
Predicatul (operatorul) de egalitate functionează
ca şi cum ar fi definit prin următorul fapt:
X = X.
iar incercarea de a satisface un scop de tipul
X = Y se face prin incercarea de a unifica X cu Y
Pentru un scop de tip X=Y.

• Daca X este variabilă neinstantiată, iar Y este


instantiată la orice obiect Prolog, atunci scopul
reuşeşte. De exemplu:
?- carte(barbu, poezii) = X.
este un scop care reuşeşte şi X se instanţiaza la
carte(barbu, poezii).

• Dacă atît X cît şi Y sunt variabile neinstanţiate,


scopul X = Y reuseşte, variabila X este legată
la Y si reciproc, X si Y devin variabile legate.
Operatorul de egalitate
• Atomii si numerele sunt intodteauna egali cu ei
insusi:
1001=1011 % esueaza
ana=ana % este satisfacut

• Doua structuri sunt egale, daca au acelasi functor,


acelasi numar de componente si componentele
ale structurilor coincid
Operatori

Operatorul de inegalitate <>(\=) se defineşte ca un


predicat opus celui de egalitate.

Scopul X <> Y reuşeşte dacă scopul X = Y nu este


satisfăcut şi eşuează dacă X = Y reuşeşte.

În plus, există predicatele relaţionale de inegalitate

definite prin operatorii infixaţi >, <, =<, >=, cu

semnificaţii evidente.
Structura programului Prolog

Un program Prolog conţine următoarele secţiuni:


- domains;
- predicates;
- clauses;
- goal;
- constants;
- databases.

Nu toate secţiunile sunt obligatorii: (domains, goal,


constants, databases- sunt opţionale).
Structura programului Prolog
• domains
se poate realiza redenumirea unor domenii standard pentru
a le da o semantică mai precisă, precum şi declararea unor
noi structuri de date.
• predicates
este acea secţiune care conţine fiecare predicat ce apare
citat in clauze si precizează tipul argumentelor.
• Secţiunile domains si predicates pot fi declarate globale,
astfel:
- global domains
- global predicates
Structura programului Prolog
Predicates este acea secţiune care conţine fiecare
predicat ce apare citat in clauze si precizează tipul
argumentelor.
Predicatele trebuie:
• declarate in secţiunea de predicate,
• definite in secţiunea de clauze,

iar la apel, în functie de numarul si tipul argumentelor


se va alege definiţia corespunzatoare.
Structura programului Prolog

Databases
• Reprezintă o secţiune specială pentru declararea
unor fapte care se doresc a fi o parte a unei baze de
date dinamice.

• Prolog pune la dispozitie mai multe predicate


pentru gestiunea bazelor de date (assertz, asserta
etc.). Aceasta secţiune poate fi declarata global
( va fi discutata in prelegerile ce urmeaza)
Structura programului Prolog
Secţiunea constants
permite declararea unor constante (constante simbolice) si
poate sa apară oriunde in program, cu condiţia să fie
declarată constanta înainte de utilizarea ei. Constanta e
vizibilă in toate clauzele, dar valoarea constantei nu se poate
modifica în timpul execuţiei programului.
Forma generala:
constants
nume _constanta=valoare
Exemple:
Constants
P =3
G = 9,8
Computer = macintos
Secţiunea goal
Dacă sectiunea goal apare în program, la rulare
programul execută acest goal, caută prima soluţie şi
nu afişează variabilele interne de lucru !!!
(goal declarat).

Cînd apare în program, în general, secţiunea goal este


dupa secţiunile predicates si clauses.

Un program Prolog poate conţine doar o singura


sectiune goal !!!!
Exemplu: un scop este declarat in program

PREDICATES
hello
CLAUSES
hello :- write(“hello”).
GOAL hello.
Sectiunea goal
Sectiunea goal conţine o clauză sau un şir de clauze
conectate logic (cu and si/sau or): goal complex
(compus din mai multe subgoal-uri legate logic).

Acest goal poate fi un predicat cu sau fară argumente,


iar argumentele, dacă apar, pot fi variabile (variabile
anonime sau nu) sau obiecte.

Acest goal (intern) se termină cu punct.


O baza de cunostinte: Planete si satelite
Scopul: de afla satelitele planetei Mars

domains clauses
name=symbol star(“Soare”).
predicates planet(“Pamint”).
star(name) planet(“Mars”).
planet(name) revolve(“Pamint”,”Soare”).
revolve(name,name) revolve(“Luna”,”Pamint”).
satellite(name,name) revolve(“Fobos”,”Mars”).
goal revolve(“Deimos”,”Mars”).
satellite(X,”Mars”), satellite(X,Y):-planet(Y),
write(X,”este satelit revolve(X,Y).
Mars”),nl.
Modificam scopul
Scopul intern Pentru un scop extern

goal goal: satellite(X,”Mars”)


write(“Satelitele Mars:”),
satellite(X,”Mars”),
write(“ “,X), fail. Va fi obtinut raspunsul:
X=Fobos
Raspunsul va fi: X=Deimos
Satelitele Mars: Fobos 2 Solutions
Deimos
Pentru fiecare goal

Prolog execută urmatoarele operaţii:


• îl cauta printre fapte;
• dacă nu-l gaseşte ca fapt, caută pentru el
regula de deducţie şi verifică condiţiile
regulii, considerînd pe rînd variantele
(dacă există)
• fiecare condiţie devine un subgoal.
Concluzie

Scopul este demonstrat dacă toate subscopurile


sunt demonstrate.

Cînd un subobiectiv eşuează, Prolog se întoarce la


subobiectivele anterioare şi continuă cu alte valori
ale variabilelor.

Această tehnica este denumită „backtracking”.


Satisfacerea unui scop urmeaza pasi:
1. intr-un pas, se incearca satisfacerea primului scop din
lista; in momentul in care scopul de la inceputul listei
nu poate fi satisfacut, se revine (backtrack) la scopul
anterior, si se incearca o alta unificare pentru acesta.
2. O cale se incheie cu succes daca lista de scopuri ajunge
vida, sau esueaza, daca ultimul scop din lista nu poate fi
satisfacut

Evolutia programului depinde de:


• ordinea definitiilor din program
• ordinea antecedentelor din corpul regulilor
Concluzii

În această prelegere am făcut cunoştinţă cu


• sintaxa limbajului Prolog
• structura programului Prolog
• tipuri de date standard şi defeniţi de utilizatori în Prolog.

Am inţeles că
Tipic, un program in limbajul Prolog nu este o secvenţă de
acţiuni ci o mulţime de fapte şi reguli care impreună duc la
nişte concluzii logice. Prolog este ceea ce numim un limbaj
declarativ.
Concluzii

• Prolog lucrează cu aşa numitele predicate logice. Pentru a


exprima un predicat logic se utilizează o sintaxă foarte
simplă, apropiata de limbajul natural.

• Prolog se poate ajunge la soluţii prin inferenţa logică


(deducţie logică) pornind de la ceva cunoscut în prealabil.
Prolog incearcă să deducă dacă o ipoteză este adevarată
prin interogarea unui set de informaţii deja adevarate.
Concluzii

• O alta caracteristica importanta a limbajului Prolog este


aceea că găseşte toate soluţiile unei probleme. Prolog nu
parcurge baza de date logică pur şi simplu ci, după găsirea
unei soluţii la o problemă, poate face o revenire pentru
găsirea altor soluţii.