Sunteți pe pagina 1din 40

Prelegerea 3

Sintaxa limbajului si structura


programului Prolog

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 ? , ;

Constante
Constants can either be:
Numbers:
integers are the usual form (e.g. 1, 0, -1, etc), but
floating-point numbers can also be used (e.g. 3.0E7)
Symbolic (non-numeric) constants:
always start with a lower case alphabetic character and
contain any mixture of letters, digits, and underscores
(but no spaces, punctuation, or an initial capital).
e.g. abc, big_long_constant, x4_3t).
String constants:
are anything between single quotes e.g. Like this.

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 diferena c
primul caracter este litera mica
file: nume simbolic de fiier

Structuri
O structura Prolog este un obiect ce desemneaza o colecie
de obiecte corelate logic, care formeaz componentele
structurii.
Exemple:
poseda(mihai, carte(prolog, clocksin, 1981)).
unde carte(prolog, clocksin, 1981) este o structur cu numele
carte si cu trei componente: prolog, clocksin si 1981.
Se admit si structuri imbricate:
poseda(mihai, carte (prolog, autori(clocksin, mellish),
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
printro 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 dintrun singur nod cu cheia ada.

Structuri
Sintaxa structurilor este aceeasi cu cea a faptelor
Prolog. Un predicat Prolog poate fi vzut ca o
structura a crui functor este numele predicatului, iar
argumentele acestuia reprezint componentele
structurii.
Considerarea predicatelor Prolog ca structuri
prezint un interes deosebit; att datele ct i
programele n Prolog au aceeai 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 [ ].
Sfritul unei liste este de obicei reprezentat ca
list vid.
[a] lista conine 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 operaie frecvent asupra listelor este obinerea
primului element dintro list i a restului listei , deci
a celor dou componente ale structurii de list.
Aceasta operaie este realizat n Prolog de
operatorul de scindare a listelor | scris sub
urmtoarea form:
[Prim | Rest]
Dac lista conine exact un element, Rest va
reprezenta lista vid. ncercarea de identificare a
structurii [Prim | Rest] cu o list vid duce la eec.

Structuri echivalente

[a, b, c] =
[a | [b, c] ] =
[a, b | [c] ] =
[a, b, c | [ ] ] =
[a | [b | [c] ] ] =
[a | [b | [c | [ ] ] ] ].

Considernd urmtoarele fapte existente n baza de cunotine Prolog

pred([1, 2, 3, 4]).
pred([coco, sta, pe, [masa, alba]]).
se pot pune urmtoarele ntrebri obinnd rspunsurile
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 aplicaii este cel care testeaz


apartenena unui element la o list i care se definete astfel:
membru(Element, [Element | _ ]).
membru(Element, [ _ | RestulListei]) :membru(Element, RestListei).
Funcionarea acestui scurt program Prolog poate fi
urmrit cernd rspunsul sistemului la urmtoarele
scopuri:
?- membru(b, [a, b, c]).
yes
?- membru(X, [a, b, c]).
X = a;
X = b;
X = c;
No.

Operatori
Operatorii relaionali sunt predicate predefinite
infixate. Un astfel de operator este
operatorul de egalitate =
Predicatul (operatorul) de egalitate functioneaz
ca i cum ar fi definit prin urmtorul 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
reuete. De exemplu:
?- carte(barbu, poezii) = X.
este un scop care reuete i X se instaniaza la
carte(barbu, poezii).
Dac att X ct i Y sunt variabile neinstaniate,
scopul X = Y reusete, variabila X este legat
la Y si reciproc.

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 definete ca un
predicat opus celui de egalitate.
Scopul X <> Y reuete dac scopul X = Y nu este
satisfcut i eueaz dac X = Y reuete.
n plus, exist predicatele relaionale de inegalitate
definite prin operatorii infixai
>, <, =<, >=, cu semnificaii evidente.

Structura programului Prolog


Un program Prolog conine urmtoarele seciuni:
- domains;
- predicates;
- clauses;
- goal;

- constants;
- databases.
Nu toate seciuni sunt obligatorii: (domains, goal,
constants, databases-opional).

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 seciune care conine fiecare predicat ce apare
citat in clauze si precizeaz tipul argumentelor.
Seciunile domains si predicates pot fi declarate globale,
astfel:
- global domains
- global predicates

Structura programului Prolog


Predicates este acea seciune care conine fiecare
predicat ce apare citat in clauze si precizeaz tipul
argumentelor.
Predicatele trebuie:
declarate in seciunea de predicate,
definite in seciunea de clauze,
iar la apel, n functie de numarul si tipul argumentelor
se va alege definiia corespunzatoare.

Structura programului Prolog


Databases
Reprezint o seciune 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 seciune poate fi declarata global
( va fi discutata in prelegerile ce urmeaza)

Structura programului Prolog


Seciunea constants
permite declararea unor constante (constante simbolice) si
poate sa apar oriunde in program, cu condiia s fie
declarat constanta nainte de utilizarea ei. Constanta e
vizibil in toate clauzele, dar valoarea constantei nu se poate
modifica n timpul execuiei programului.
Forma generala:
constants
nume _constanta=valoare
Exemple:
Constants
P =3
G = 9,8
Computer = macintos

Seciunea goal
Dac sectiunea goal apare n program, la rulare
programul execut acest goal, caut prima soluie i
nu afieaz variabilele interne de lucru !!!
(goal declarat).
Cnd apare n program, n general, seciunea goal este
dupa seciunile predicates si clauses.
Un program Prolog poate conine doar o singura
sectiune goal !!!!

Exemplu: un scop este declarat in program


PREDICATES
hello
CLAUSES
hello :- write(hello).
GOAL hello.

Sectiunea goal
Sectiunea goal conine 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 se termin cu punct.

O baza de cunostinte: Planete si satelite


Scopul: de afla satelitele planetei Mars
domains
name=symbol
predicates
star(name)
planet(name)
revolve(name,name)
satellite(name,name)
goal
satellite(X,Mars),
write(X,este satelit
Mars),nl.

clauses
star(Soare).
planet(Pamint).
planet(Mars).
revolve(Pamint,Soare).
revolve(Luna,Pamint).
revolve(Fobos,Mars).
revolve(Deimos,Mars).
satellite(X,Y):-planet(Y),
revolve(X,Y).

Modificam scopul
Scopul intern
goal
write(Satelitele Mars:),
satellite(X,Mars),
write( ,X), fail.
Raspunsul va fi:
Satelitele Mars: Fobos Deimos

Pentru un scop extern


goal: satellite(X,Mars)

Va fi obtinut raspunsul:
X=Fobos
X=Deimos
2 Solutions

Pentru fiecare goal


Prolog execut urmatoarele operaii:
l cauta printre fapte;
dac nu-l gasete ca fapt, caut pentru el
regula de deducie i verific condiiile
regulii, considernd pe rnd variantele
(dac exist)

fiecare condiie devine un subgoal.

Goal
Scopul este demonstrat dac toate subscopurile
sunt demonstrate.
Cnd un subobiectiv eueaz, Prolog se ntoarce la
subobiectivele anterioare i continu cu alte
valori
ale variabilelor.
Aceast tehnica este denumit backtracking.

Seciunea constants
permite declararea unor constante (constante simbolice).
Seciunea poate sa apar oriunde in program, cu condiia s
fie declarat constanta nainte de utilizarea ei. Constanta e
vizibil in toate clauzele, dar valoarea constantei nu se poate
modifica n timpul execuiei programului.
Forma generala:

constants
nume _constanta=valoare
Exemple:
Constants
P =3
G = 9,8
Computer = dell

Un program simplu
Se consider poarta I ca fiind construit prin
conectarea unei "pori I NU" cu un inversor. ntregul
circuit este definit de relaia:
poarta_si(Intrare1, Intrare2, Iesire)
pe baza relaiilor
poarta_si_nu(Intrare1, Intrare2, Iesire)
inversor(Intrare, Iesire).

Un circuit logic poart

n1).
Irez(alimentare,
n2).
tranzistor(n2,masa,
n1).
tranz(n2, masa,
n1).
tranz(n3, n4, n2).
tranz(n5, masa,
n4).
inversor(Intr, Ie) :tranz(Intr, masa,
Ie),

Intr2,
Un circuit logic poartpoarta_si_nu(Intr1,
I
Ie) :tranz(Intr1, X, Ie),

tranz(Intr2, masa, X),


rez(alimentare, Ie).
poarta_si(Intr1, Intr2, Ie)
:poarta_si_nu(Intr1, Intr2,
X),
inversor(X, Ie).
Pentru ntrebarea
?- poarta_si(In1, In2, Ie).
In1 = n3, In2= n5, Ie =
n1

Un circuit logic poart I

Rspunsul sistemului Prolog confirm faptul c


circuitul descris este o poart I, identificnd
intrrile i ieirile corespunztoare.

Concluzii

n aceast prelegere am fcut cunotin cu


sintaxa limbajului Prolog
structura programului Prolog
tipuri de date standard i defenii de
utilizatori n Prolog.
Am ineles c
Tipic, un program in limbajul Prolog nu este
o secven de aciuni ci o mulime de fapte
i reguli care impreun duc la nite concluzii
logice. Prolog este ceea ce numim un limbaj

Concluzii
Prolog lucreaz cu aa numitele predicate logice. Pentru a
exprima un predicat logic se utilizeaz o sintax foarte
simpl, apropiata de limbajul natural.
Prolog se poate ajunge la soluii prin inferena logic
(deducie logic) pornind de la ceva cunoscut n prealabil.
Prolog incearc s deduc dac o ipotez este adevarat
prin interogarea unui set de informaii deja adevarate.

Concluzii
O alta caracteristica importanta a limbajului Prolog este
aceea c gsete toate soluiile unei probleme. Prolog nu
parcurge baza de date logic pur i simplu ci, dup gsirea
unei soluii la o problem, poate face o revenire pentru
gsirea altor soluii.

S-ar putea să vă placă și