Sunteți pe pagina 1din 13

Laborator 3

STRUCTURA UNUI PROGRAM PROLOG


Noiuni teoretice
Seciunea DOMAINS
Seciunea domains permite declararea domeniilor (tipurilor) argumentelor predicatelor.
Exist dou clase de tipuri, tipul elementar i tipul complex, care la rndul lui se submparte n:
tipul compus i tipul list.
Tipul standard
Tipul elementar poate fi standard sau definit de utilizator. Tabelul 1 descrie tipurile standard
cele mai des utilizate n programe implementate n limbajul Prolog. Uneori este util s se declare un
domeniu atunci cnd se dorete clarificarea unei poriuni din seciunea predicates. Prin declararea
unui domeniu propriu, cu un nume personalizat, mai uor i mai simplu se pot da nume sugestive
argumentelor predicatului respectiv.
Cuvnt
rezervat
byte
short

ushort

integer
long
ulong
real
char
symbol
string

Semnificaie

Exemple

Numr ntreg pe 8 bii fr semn,


cuprins ntre 0 255
Numr ntreg pe 16 bii, independent
de platform, cuprins ntre -32768
32767
Numr ntreg pe 16 bii fr semn,
independent de platform, cuprins
ntre 0 65535
Numr ntreg cu semn avnd
dimensiunea dependent de
arhitectura calculatorului
Numr ntreg lung pe 32 bii,
independent de platform
Numr ntreg lung pe 32 bii fr
semn, independent de platform
Numr real reprezentat pe 64 de bii
Caracter ncadrat ntre apostrofuri
ir de caractere n care primul caracter
este liter mic
ir de caractere cuprinse ntre
ghilimele
Tabel 1 Tipuri standard n Prolog

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

Structura unui program Prolog

Tipul compus i functori


Obiectele compuse ne permit tratarea informaiilor compuse ca un singur item, astfel nct
s poat fi extrase uor componentele acestora. Obiectele compuse sunt alctuite dintr-un functor i
o list de obiecte aparinnd functorului respectiv:
nume=functor(obiect1, obiect2, ..., obiectN)
Un obiect compus poate fi unificat cu o variabil simpl sau cu un alt obiect compus.
Obiectele compuse pot fi privite i tratate ca un singur obiect n clauzele Prolog.
Expresii aritmetice
Expresiile aritmetice const din operanzi (numere i variabile), operatori (+,-,*,/, div i mod)
i paranteze. Simbolurile din partea dreapt a semnului = (care este predicatul =) de mai jos
formeaz o expresie aritmetic:
A=1+6/(11+3)*Z
Numerele hexazecimale se reprezint prin precedarea lor cu un semnul $:
$FFF=4095
86=$4A+12
Valoarea unei expresii poate fi calculat dac toate variabile sunt legate la momentul
evalurii. Calculele se fac ntr-o anumit ordine determinat de prioritatea operatorilor aritmetici:
operatorii cu cea mai mare prioritate sunt evaluai primii.
Operaii
Tipul rezultatului unei operaii aritmetice este precizat n tabelul 2.2.
Operand 1
ntreg
real
ntreg
real
ntreg, real
ntreg
ntreg

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

Funcii i predicate predefinite


Denumire
abs(X)
sin(X)
cos(X)
tan(X)
arctan(X)
exp(X)
ln(X)
log(X)
sqrt(X)
random(X)
random(X,Y)
round(X)
trunc(X)

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

Egalitate i predicatul egal


n Prolog propoziii precum N=N1-2 indic fie o relaie ntre trei obiecte (N,N1,2) fie o
relaie ntre dou obiecte ( N i valoarea lui N1-2). Dac N este variabil independent, propoziia
este satisfcut legnd pe N de rezultatul evalurii expresiei N1-2. Aceasta corespunde unei
instruciuni de atribuire din limbajele de programare procedurale. Dac N este o variabil legat,
atunci propoziia este satisfcut dac relaia de egalitate are loc. n ambele situaii variabila N1
trebuie s fie legat.
OBSERVAIE:
O propoziie de forma N=N-1 va eua ntotdeauna.
Seciunea CONSTANTS
Seciunea constants se utilizeaz pentru declararea de constante simbolice n Prolog. O
constant simbolic se declar astfel: <identificator> = <macro definiie>
Exemple:
CONSTANTS
zero = 0
pi = 3.1415927
Exist cteva restricii n utilizarea constantelor simbolice:
Definirea unei constante nu poate face o referire la ea nsi.
Sistemul nu face distincie ntre literele mari i literele mici ntr-o declaraie de constante.
Totui trebuie evitat utilizarea literelor mari ca prim liter ntr-o seciune clauses pentru a nu se
confunda cu variabilele.

Structura unui program Prolog

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)

Structura unui program Prolog

i permite citirea unui numr real care va fi legat la variabila X.


Seciunea GOAL
n esen, aceast seciune este identic cu antetul unei reguli. Sunt 2 diferene ntre
seciunea goal i o regul:
cuvntul cheie goal nu este urmat de : -;
Prolog execut automat interogarea cnd programul ruleaz.
n timp ce programul ruleaz, se ncearc satisfacerea corpului regulii din seciunea goal.
Dac toate subobiectivele din seciunea goal sunt terminate cu succes, programul se ncheie cu
success. Dac, n timp ce programul ruleaz, unul dintre subobiectivele din interogare se termin cu
eec, ntregul program se termin cu eec.

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:-

Structura unui program Prolog

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

S se implementeze un program Prolog care determin valoarea urmtoarei funcii:

e x y 2 , x 0, y 10;

f ( x, y) x lg( y 15), 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

Structura unui program Prolog

Deoarece variabila F utilizat n procedura ce definete predicatul functia este o variabil


liber, corpurile celor trei reguli corespund instruciunilor de atribuire din limbajele procedurale,
atribuiri utilizate pentru calculul valorii funciei. n expresiile de atribuire utilizate pentru
determinarea valorii funciei se utilizeaz trei funcii aritmetice predefinite n limbajul Prolog.
n corpul ultimei reguli se utilizeaz predicate predefinite de interaciune. Pentru citirea
datelor se utilizeaz predicatul readreal pentru citirea argumentelor funciei, aceste valori fiind de
tip real. Pentru afiarea rezultatului se utilizeaz predicatul writef prin intermediul cruia se
precizeaz un format de afiare pentru valoarea funciei.
Ultima seciune corespunde cerinei din enunul problemei, ntrebare redat de interogarea
determina.
Aplicaia 4
S se implementeze un program Prolog care citete dou valori reale i verific dac pot
reprezenta lungimile laturilor unui paralelogram. n caz afirmativ se va calcula perimetrul acestuia
i se va verifica dac paralelogramul este romb.
Programul corespunztor problemei este:
predicates
perimetru(real,real,real)
nondeterm romb(real,real)
nondeterm verifica(real,real)
nondeterm rezolva
clauses
perimetru(A,B,P):P=2*A+2*B.
romb(A,A):write("Paralelogramul este romb"),nl.
romb(A,B):A<>B,
write("Paralelogramul nu este romb"),nl.
verifica(A,_):A<=0,
write("Prima valoare nu poate reprezenta lungimea unui segment "),nl.
verifica(_,B):B<=0,
write("A doua valoare nu poate reprezenta lungimea unui segment "),nl.
verifica(A,B):A>0,B>0,
perimetru(A,B,P),
write("Perimetrul paralelogramului este ",P),nl,
romb(A,B).
rezolva:write("Prima valoare="),
readreal(A),
write("A doua valoare="),
readreal(B),

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

Structura unui program Prolog

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;

x sin( 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.

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