Sunteți pe pagina 1din 2

Variabile i parametrii

Spre deosebire de alte limbaje, PROLOG nu admite ca o variabil, o dat legat s-i
modifice valoarea. e e!emplu o instruc"iune de genul #$#%& nu este admis in PROLOG.
'n locul ei se va folosi #&$#%& si se va genera o nou variabil. e aici se deduc nite reguli
elementare de lucru cu parametric (n cicluri i)sau recursivitate*
a+ Re,ultatul final trebuie s fie o variabil nelegat care se va lega la re,ultat abia dup
ce a fost el ob"inut-
b+ Re,ultatele intermediare i parametrii variabili se transmit gener.nd noi variabile
locale-
c+ Parametrii nemodificabili sunt variabile legate, constante etc.
Relum e!emplul anterior*
predicates*-
factorial/&,&+*-0.
factorial/#,1+*-
#&$#-&, factorial/#&,1&+, 1$#21&.
3ici re,ultatul final 1$fact/#+ este calculate abia (n final ca #2fact/#-&+, dup ace
fact/#-&+ a fost calculate in 1&. Pentru a se calcula fact/#-&+ se apelea, predicatul factorial
pentru #&$#-&, i 1& nelegat /el va con"ine fact/#&++. Se coboar astfel p.nla
factorial/&,1&+. 1& se leag la &, conform unificrii cu regula factorial/&,&+ /cut nu permite
continuarea cu alternative general+. Prin (ntoarcere dup apelul factorial/&,1&+, se calculea,
re,ultatul fact/4+ ca produs 42fact/&+. 3cest re,ultat se re"ine (n 1& local al apelului
factorial/4,1&+, dup care se calculea, 1& pentru apelul factorial /5.1&+ etc, p.n ce stiva
se eliberea, i se ajunge la apelul ini"ial factorial/#-&,1&+. 3cum 1 care e re,ultatul real se
calculea, ca #21&. deci 1 se calculea, in final, # este un parametru fi! ce nu se transmite,
iar ceea ce se transmite sunt variabilele locale #& si 1& care se depun i se culeg de pe stiv,
valoarea lor fiind reacoperit la fiecare apel)(ntoarcere de valorile de pe stiv.
S vedem cum se comport nite variabile ce controlea, un ciclu. S lum un e!emplu
de calcul classic al factorialului.
'n limbajul 6*
factorial/n,m+
7
i$&- p$&-
89ile/i:$n+do
7p$p2i- i$i%&-;
m$p-
;
'n PROLOG*
6iclul 89ile l-am scris ca pe un predicat recursive fact&, atribuirea m$p se face prin
unificare la a doua alternativ /<=#+ prin folosirea lui P pe locul variabilei nelegate ce con"ine
re,ultatul /se transmite la revenire in Re, i 1+.
<nitiali,rile le putem face i prin transmisie*
factorial/#,1+*-
fact&/#,&,&,1+.
fact&/#,<,P,Re,+*-
<:$#, 0, P&$P2<, <&$<%&, fact&/#,<&,P&,Re,+.
fact&/>,>,P,P+.
'n acest ca, < i P sunt variabile locale, la fel ca <& i P&, # i 1 fiind singurele
globale/la nivelul factorial+.
1ai elegant /renun".nd la fact&+, folosind acelai predicat de diferit aritate*
factorial/#,1+*- factorial /#,1,&,&+.
factorial/#,1,<,P+*-
<:$#, 0, <&$<%&, P&$P2<, factorial/#,1,<&,P&+.
factorial/>,>,P,P+.
Observm c un predicat cu aritate crescut are deja valori de pornire ca parametru,
respective, valori de lucru local.
S calculm puterile unui numr p.n c.nd depesc &??. S verificm dac e putere a
lui trei / utima putere (nainte de &?? este @&+.
predicates
po8er/integer+.
po8er/integer,integer+.
8orA/ +.
clauses
8orA*-readint/#+, po8er/#+.
po8er/#+*-po8er/#,#+.
po8er/#,#&+*-#&:=@&,#&:$&??,0,#4$#2#&,po8er/#,#4+.
po8er/#,#&+*-#&$@&,8rite/Bputere de 5B+, nl.
po8er/#,#&+*-#&:=@&, 8rite/Bnu e putere a lui 5 B, #&+, nl.
goal
8rite/B#$ B+, readint/#+, po8er/#+.
O alt problem ar fi calcularea puterilor unui numr natural n p.n la &??.
predicates
putere/integer+.
putere/integer,integer+.
clauses
putere/#+*-putere/#,#+.
putere/#,#&+*-
#&:&??,0,#4$#2#&,8rite/#&,CDnC+, putere/#,#4+
goal
8rite/E#$F+, readint/#+, 8rite /Eputerile lui # pana la &?? sunt* DnF+, putere/#+.

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