Documente Academic
Documente Profesional
Documente Cultură
ushort
integer
long
ulong
real
char
symbol
string
Semnificaie
Exemple
0, 56,234
+34,88,332
0,32,987
+45,78,986
-5550,21, 198700
0,5678, 200000
5.5, 0.007, -11.897
a, A, 0, *
numar, nuMar,
numar_1
numar, numar
Operator
Operand 2
+,-,*
ntreg
+,-,*
ntreg
+,-,*
real
+,-,*
real
/
ntreg, real
div
ntreg
mod
ntreg
Tabelul 2.2 Operaii aritmetice
Rezultat
ntreg
real
real
real
real
ntreg
ntreg
Comparaii
Limbajul Prolog poate compara expresii aritmetice, caractere, string-uri i simboluri. Este
utilizat notaia infix, ceea ce nseamn c operatorii sunt plasai ntre operanzi ( de exemplu, X <
4) i nu naintea lor (de exemplu, <(X,4)).
Lista operatorilor permii n Prolog este urmtoarea:
<
mai mic
<=
mai mic sau egal
>
mai mare
>=
mai mare sau egal
Laborator 3
=
<>, ><
egal
diferit
Tip
Semnificaie
funcie
ntoarce valoarea absolut a lui X
funcie
ntoace sinusul unghiului X, dat n radiani
funcie
ntoace cosinusul unghiului X, dat n radiani
funcie
ntoace tangenta unghiului X, dat n radiani
funcie
ntoace arctangenta valorii reale de care este leagat X
funcie
ntoace e la puterea X
funcie
ntoace logaritm natural din X
funcie
ntoace logaritm n baza 10 din X
funcie
ntoace rdcina ptrat a lui X
predicat
leag X de o valoare real aleatoare, 0<=X<1
predicat
leag Y de o valoare ntreag aleatoare, 0<=Y<X
funcie
ntoace valoarea rotunjit a lui X
funcie
ntoace valoarea trunchiat a lui X
Tabelul 2.3 Funcii i predicate predefinite
Pot fi declarate mai multe constante ntr-un program, ns constantele trebuie declarate
nainte de utilizarea lor.
Declaraiile de constante devin efective din punctul n care sunt fcute i rmn valabile
n orice fiier inclus dup declarare.
Un identificator constant trebuie declarat o singur dat.
Seciunea CLAUSES
Clauzele (faptele i regulile) pentru un predicat trebuie amplasate mpreun n seciunea
clauses. O secven de fapte i reguli care definesc un predicat poart numele de procedur.
Atunci cnd rspunde la o interogare, Prolog va ncepe cu nceputul seciunii clauses
cutnd o potrivire cu toate faptele i regulile din aceast seciune.
n Prolog o regul se folosete atunci cnd un fapt depinde de un alt fapt sau grup de fapte.
O regul are un antet i un corp cu urmtoarea sintax:
ANTET : - <subobiectiv 1>, < subobiectiv 2>, ..., < subobiectiv n>.
Corpul unei reguli este format din unul sau mai multe subobiective. Subobiectivele se separ
prin virgul, specificnd conjuncia. Fiecare subobiectiv este un apel la un alt predicat Prolog care
se poate ncheia cu succes sau cu eec. Dac toate subobiectivele care alctuiesc coprul unei reguli
se ncheie cu succes, atunci regula se ncheie cu succes, iar dac cel puin un subobiectiv eueaz,
atunci i regula eueaz.
Pentru a avea succes la o regul, Prolog trebuie s satisfac toate subobiectivele sale. Cnd
un subobiectiv eueaz, Prolog se ntoarce napoi la subobiectivele anterioare, apoi continu cu
valori schimbate ale variabilelor. Aceast tehnic este denumit backtracking.
Seciunea PREDICATES
Atunci cnd se definete un predicat n seciunea clauses a unui program Prolog, trebuie n
prealabil declarat n seciunea predicates prin care se comunic programului Prolog despre ce este
vorba. Exist i predicate predefinite n Prolog care nu trebuie redeclarate. De asemenea vor trebui
precizate domeniile argumentelor predicatului. Declararea unui predicat se face dup sintaxa:
nume_predicat(tip_argument1, tip_argument2, ... )
Domeniile utilizate n declararea unui argument sunt fie domenii standard, fie domenii care
au fost declarate n seciunea domains.
Numele predicatelor trebuie s nceap cu liter, urmat apoi de o secven de litere, cifre i
eventual caracterul _ . Nu are importan dac literele utilizate sunt litere mari sau mici dar este
recomandabil ca prima liter s fie liter mic, deoarece alte versiuni ale limbajului Prolog nu
accept literele mari ca prim liter n numele unui predicat. Numele unui predicat nu poate depi
250 de caractere.
Aritatea unui predicat este dat de numrul argumentelor sale. Pot exista dou predicate cu
acelai nume, dar cu ariti diferite. Aceste predicate trebuie grupate mpreun n seciunile
predicates i clauses.
Predicate de interaciune
Prologul, ca limbaj de programare rafinat, ofer posibilitatea interaciunii unui program cu
echipamentul periferic al calculatorului, cu ecranul i cu utilizatorul. Aceasta se realizeaz cu
Laborator 3
ajutorul unor predicate predefinite. Cele mai utilizate predicate predefinite de ieire sunt write i
writef.
Forma general a predicatului write este:
write(arg1, arg2,, argn)
unde arg1, arg2,, argn sunt obiecte elementare sau variabile. n cazul n care argk este o variabil,
ea trebuie s fie legat n momentul execuiei predicatului write. Predicatul write reuete
ntotdeauna i are ca efect afiarea pe ecran a valorilor legate de argumentele sale. Pentru trecerea la
o linie nou se poate utiliza predicatul nl (new line) sau secvena de caractere \n.
Predicatul writef se utilizeaz n cazul transmiterii cu format de ieire a datelor. Forma sa
este:
writef(ir_format,arg1, arg2,, argn)
unde ir_format este un ir de caractere care indic formatul utilizat pentru afiarea pe ecran a
valorilor legate de arg1, arg2,, argn. n general irul ir_format conine:
caractere care se copiaz ca atare pe ecran;
grupuri de specificatori de forma % -<dimens>.<prec>tip (pentru fiecare argument din
list trebuie s existe un specificator).
Semnificaia caracterelor dintr-un specificator este urmtoarea:
% marcheaz nceputul specificatorului.
- determin alinierea la stnga i completarea cu spaii la dreapta. Prezena acestui
caracter este opional. Implicit: aliniere la dreapta i completare la stnga cu spaii sau cu 0.
dimens specific dimensiunea minim a cmpului afiat, nu se efectueaz trunchierea
valorii afiate.
prec este opional i arat precizia numrului n virgul mobil sau lungimea maxim a
numrului de caractere care se tipresc n cazul obiectului de tip string.
tip (opional) specific forma n care este afiat argumentul n virgul mobil; poate avea
valorile f, e, g cu urmtoarele semnificaii:
f indic virgula mobil;
e indic scriere exponenial;
g indic scrierea cu format scurt.
Exist patru predicate predefinite de intrare: readln, readchar, readint i readreal.
Predicatul readln permite citirea unui obiect de tip symbol sau string, i are forma
readln(X)
unde X este o variabil, care n urma introducerii textului devine legat la valoarea obinut n urma
citirii.
Predicatul readchar permite citirea unui singur caracter, i are forma
readchar(X)
unde X este o variabil care n urma execuiei va fi legat la caracterul introdus.
Predicatul readint are forma
readint(X)
i permite citirea unui numr ntreg care va fi legat la variabila X.
Predicatul readreal are forma
readreal(X)
Aplicaii rezolvate
Aplicaia 1
S se implementeze un program Prolog care determin impozitul pltit de un salariat al crui
salariu se cunoate.
Programul corespunztor problemei este:
domains
nume=string
salariu=ushort
impozit=real
predicates
calcul(nume,salariu,impozit)
rezolva
clauses
calcul(_,S,I):I=S*0.16.
rezolva:write("Nume salariat: "),
readln(N),
write("Salariu="),
readint(S),
calcul(N,S,I),
write("Impozitul platit de salariatul ",N," este "),
writef("%5.2f",I),
nl.
goal
rezolva.
Analiza programului:
Dac, la o testare, numele salariatului este Ionescu Mihai, iar salariul acestuia este 1000,
atunci n fereastra de ieire se va afia:
Nume salariat: Ionescu Mihai
Laborator 3
Salariu=1000
Impozitul platit de salariatul Ionescu Mihai este 160.00
yes
Programul este structurat pe patru seciuni.
n prima seciune de definesc trei domenii standard cu nume personalizate pentru c se
dorete clarificarea rolului fiecrui argument din predicatul calcul declarat n seciunea urmtoare.
n a doua seciune s-au declarat dou predicate: predicatul calcul cu trei argumente de tip
nume, salariu, respectiv impozit i predicatul rezolva fr argumente.
n seciunea legat de clauze sunt definite cele dou predicate, fiecare prin intermediul unei
reguli.
n prima regul se utilizeaz variabila anonim deoarece modul de calcul al impozitului nu
depinde de numele salariatului. Deoarece variabila I utilizat n aceast regul este liber, corpul
acestei reguli corespunde unei instruciuni de atribuire din limbajele procedurale.
Corpul celei de-a doua reguli utilizeaz predicate predefinite de interaciune. Pentru citirea
datelor se utilizeaz predicatul readln pentru citirea numelui salariatului i predicatul readint pentru
citirea salariului. Pentru afiarea rezultatului se utilizeaz att predicatul write, ct i predicatul
writef . Prin utilizarea ultimului predicat amintit se precizeaz un format de afiare pentru rezultat.
Ultima seciune corespunde cerinei din enunul problemei, ntrebare redat de interogarea
rezolva.
Aplicaia 2
S se implementeze un program Prolog care determin volumul unui paraleliped
dreptunghic cnd lungimea, limea i nlimea acestuia se introduc de la intrarea standard.
Programul corespunztor problemei este:
domains
lungime=real
latime=real
inaltime=real
volum=real
paraleliped=dimensiuni(lungime,latime,inaltime)
predicates
calcul(paraleliped,volum)
citeste(paraleliped)
rezolva
clauses
calcul(dimensiuni(Lungime,Latime,Inaltime),Volum):Volum=Lungime*Latime*Inaltime.
citeste(dimensiuni(Lungime,Latime,Inaltime)):write("Lungime= "),
readreal(Lungime),
write("Latime="),
readreal(Latime),
write("Inaltime="),
readreal(Inaltime).
rezolva:-
citeste(Paraleliped),
calcul(Paraleliped, Volum),
writef("Volumul paralelipipedului este %8.3f",Volum),
nl.
goal
rezolva.
Analiza programului:
Dac de la tastatur se vor introduce urmtoarele valori: 10 pentru lungime, 8 pentru lime
i 5 pentru nlime, atunci n fereastra de ieire se va afia:
Lungime=10
Lime=8
nlime=5
Volumul paralelipipedului este 400.000
yes
Programul este structurat pe patru seciuni.
n prima seciune de definesc patru domenii standard cu nume personalizate pentru c se
dorete clarificarea rolului fiecrui argument din predicatele declarate n seciunea urmtoare. Tot n
aceast seciune se declar i un domeniu compus care permite tratarea informaiilor despre un
paraleliped dreptunghic ca un singur item, astfel nct s poat fi extrase uor componentele
acestuia.
n a doua seciune s-au declarat trei predicate: predicatul calcul cu dou argumente de tip
paraleliped, respectiv volum, predicatul citeste cu un argument de tip paraleliped i predicatul
rezolva fr argumente.
n seciunea legat de clauze sunt definite cele trei predicate, fiecare prin intermediul unei
reguli.
Deoarece variabila Volum utilizat n prima regul este liber, corpul acestei reguli
corespunde unei instruciuni de atribuire din limbajele procedurale, atribuire utilizat pentru
calculul volumului paralelipipedului.
Corpul celei de-a doua reguli utilizeaz predicate predefinite de interaciune. Pentru citirea
datelor se utilizeaz predicatul readreal pentru citirea dimensiunilor paralelipipedului, aceste valori
fiind de tip real.
n ultima regul, pentru afiarea rezultatului se utilizeaz predicatul writef prin intermediul
cruia se precizeaz un format de afiare pentru rezultat.
n primele dou reguli, pentru c se dorete accesul la componentele obiectului de tip
paralelipiped dreptunghic, se utilizeaz functorul acestui domeniu compus. n schimb, n primele
dou subobiective ale ultimei reguli, nemaifiind necesare informaiile despre dimensiunile
paralelipipedului dreptunghi, pentru argumentele de tip compus se utilizeaz variabile.
Ultima seciune corespunde cerinei din enunul problemei, ntrebare redat de interogarea
rezolva.
Aplicaia 3
Laborator 3
e x y 2 , x 0, y 10;
x y, x 0.
Programul corespunztor problemei este:
predicates
nondeterm functia(real,real,real)
nondeterm determina
clauses
functia(X,Y,F):X<=0,Y<-10,F=exp(X)+Y*Y.
functia(X,Y,F):X<=0,Y>=-10,F=X+log(Y+15).
functia(X,Y,F):X>0,F=sqrt(X)+Y.
determina:write("X="),
readreal(X),
write("Y="),
readreal(Y),
functia(X,Y,F),
write("f(",X,",",Y,")="),
writef("%6.2f",F),nl.
goal
determina.
Analiza programului:
Dac de la tastatur se vor introduce urmtoarele valori: 16 pentru x i 5 pentru y, atunci n
fereastra de ieire se va afia:
X=16
Y=5
f(16,5)=9.00
yes
Programul este structurat pe trei seciuni.
n prima seciune s-au declarat dou predicate: predicatul functia cu trei argumente de tip
real i predicatul determina fr argumente.
n seciunea legat de clauze sunt definite cele dou predicate: predicatul functia s-a definit
prin intermediul a trei reguli corespunztoare celor trei ramuri din definiia funciei dat n enun i
predicatul determina s-a definit prin intermediul unei reguli.
10
Laborator 3
11
verifica(A,B).
goal
rezolva.
Analiza programului:
Dac de la tastatur se vor introduce urmtoarele valori: 20 pentru prima valoare i 10
pentru a doua valoare, atunci n fereastra de ieire se va afia:
Prima valoare=20
A doua valoare=10
Perimetrul paralelogramului este 60
Paralelogramul nu este romb
yes
Programul este structurat pe trei seciuni.
n prima seciune s-au declarat patru predicate:
predicatul perimetru cu trei argumente de tip real;
predicatul romb cu dou argumente;
predicatul verifica cu dou argumente;
predicatul rezolva fr argumente.
n seciunea legat de clauze sunt definite cele patru predicate: predicatul perimetru s-a
definit prin intermediul unei reguli, predicatul romb s-a definit prin dou reguli care verific
proprietatea ca cele dou valori reprezentate de argumente s fie egale, predicatul verifica s-a definit
prin intermediul a trei reguli corespunztoare cazurilor de existen a paralelogramului i predicatul
rezolva s-a definit prin intermediul unei reguli.
Deoarece variabila P utilizat n regula definete predicatul perimetru este o variabil liber,
corpul acestei reguli corespunde instruciunii de atribuire din limbajele procedurale, atribuire
utilizat pentru calculul perimetrului paralelogramului.
Prima regul din procedura ce definete predicatul romb trateaz cazul n care cele dou
argumente sunt egale, corpul acestei reguli folosind predicatul predefinit write pentru a afia
mesajul: Paralelogramul este romb. Corpul celei de-a doua reguli din aceast procedur cuprinde
dou subobiective, primul obiectiv fiind o expresie de comparare care verific dac cele dou
argumente au valori diferite. Al doilea subobiectiv va fi apelat doar dac primul este ndeplinit,
afindu-se n acest caz mesajul: Paralelogramul nu este romb.
Corpurile primelor dou reguli din procedura corespunztoare cuprind dou subobiective,
primul obiectiv fiind o expresie de comparare care verific dac unul dintre cele dou argumente
este negativ. Al doilea subobiectiv va fi apelat doar dac primul este ndeplinit, afindu-se n acest
caz un mesaj corespunztor. Ultima regul a acestei proceduri cuprinde mai multe subobiective,
primele dou fiind expresii de comparare care verific dac cele dou argumente sunt strict pozitive,
adic pot reprezenta lungimi de segmente. Dac aceste subobiective sunt ndeplinite, se trece la
urmtorul obiectiv care va determina perimetrul paralelogramului, valoarea obinut fiind afiat
prin utilizarea predicatului predefinit write. Ultimul subobiectiv al regulii va verifica dac
paralelogramul ndeplinete condiia de a fi romb.
n corpul ultimei reguli se utilizeaz predicate predefinite de interaciune. Pentru citirea
datelor se utilizeaz predicatul readreal pentru citirea valorilor de tip real. Tot n corpul acestei
reguli, n final, se utilizeaz predicatul verifica care va duce la verificarea condiiilor ce trebuie
ndeplinite pentru existene paralelogramului, respectiv al rombului.
12
Ultima seciune corespunde cerinei din enunul problemei, ntrebare redat de interogarea
rezolva.
Aplicaia 5
S se implementeze un program Prolog care determin numrul de ani biseci dintre doi ani.
Programul corespunztor problemei este:
predicates
bisect(integer,integer)
nondeterm inversare(integer, integer)
nondeterm determina
clauses
bisect(A,B):A1=A-1,
X=A1 div 4-A1 div 100+A1 div 400,
Y=B div 4-B div 100+B div 400,
N=Y-X,
write("Exista ",N," ani bisecti intre anul ",A," si anul ",B),nl.
inversare(A,B):A<B,
bisect(A,B).
inversare(A,B):A>=B,
bisect(B,A).
determina:write("Dati primul an="),readint(A),
write("Dati al doilea an="),readint(B),
inversare(A,B).
goal
determina.
Analiza programului:
Dac de la tastatur se vor introduce urmtoarele valori: 1900 pentru primul an i 2002
pentru al doilea an, atunci n fereastra de ieire se va afia:
Dati primul an=1900
Dati al doilea an=2002
Exista 25 de ani bisecti intre anul 1900 si anul 2002
yes
Programul este structurat pe trei seciuni.
n prima seciune s-au declarat trei predicate: predicatul bisect cu dou argumente de tip
real, predicatul inversare cu dou argumente de tip real i predicatul determina fr argumente.
n seciunea legat de clauze sunt definite cele trei predicate: predicatul bisect s-a definit
prin intermediul unei reguli, predicatul inversare s-a definit prin intermediul a dou reguli i
predicatul determina s-a definit prin intermediul unei reguli.
Laborator 3
13
n corpul regulii ce definete predicatul bisect, prin intermediul mai multor atribuiri, se
determin numrul de ani bisecti existeni pn n anul dat de valoarea primului argument, numrul
de ani bisecti existeni pn n anul dat de valoarea celui de-al doilea argument, apoi se face
diferena acestor valori, obinndu-se valoarea cutat. Valoarea astfel obinut se afieaz prin
utilizarea predicatului predefinit write.
Cele dou reguli care definesc predicatul inversare compar valorile celor dou argumente i
apeleaz predicatul bisect astfel nct, la apel, valoarea primului argument al acestui predicat s fie
mai mic dect valoarea celui de-al doilea argument.
n corpul ultimei reguli se utilizeaz predicate predefinite de interaciune. Pentru citirea
datelor se utilizeaz predicatul readint pentru citirea celor dou valori ntregi reprezentnd cei doi
ani. Tot n corpul acestei reguli, n final, se utilizeaz predicatul inversare care va duce la
compararea celor dou valori citite i, apoi, la determinarea numrului de ani biseci existeni ntre
cele dou valori citite.
Ultima seciune corespunde cerinei din enunul problemei, ntrebare redat de interogarea
determina.
Aplicaii propuse
1. S se implementeze un program Prolog care determin aria unui dreptunghi cnd
lungimea i limea acestuia se introduc de la intrarea standard.
2. S se implementeze un program Prolog care determin maximul a dou numere citite de
la intrarea standard.
3. S se implementeze un program Prolog care determin media unui elev la o disciplin
cnd se citesc de la intrarea standard notele obinute la aceea disciplin.
4. S se implementeze un program Prolog care determin valoarea urmtoarei funcii:
e x3 y, x 20, y 0;
f ( x, y )
x 11 y, x 20, y 5;
ln( x y), x 20, y 5.
5. S se implementeze un program Prolog care citete dou valori reale i verific dac pot
reprezenta dimensiunile unui con circular drept. n caz afirmativ se va calcula volumul acestuia.
6. S se implementeze un program Prolog care determin media unui student cnd se citesc
de la intrarea standard notele obinute de student, precum i creditele aferente fiecrei discipline.