Documente Academic
Documente Profesional
Documente Cultură
Exemple:
- pentru a reprezenta expresia x mai mare dect y se poate folosi atomul
maimare(X,Y), n care maimare este un functor, iar X i Y sunt termeni (variabile);
- pentru a reprezenta expresia x mai mare dect 10 se folosete notarea
maimare(X,10);
15
- pentru a reprezenta operaia care realizeaz media aritmetic se utilizeaz termenul
media(X,Y), n care X i Y sunt variabile, iar media este un simbol funcional;
- expresia media lui x i 7 mai mare dect y se reprezint n logica predicatelor
maimare(media(X,7),Y);
- enunul Petru este student la specializarea Calculatoare se formalizeaz n limbajul
logicii predicatelor prin predicatul STUDENT(petru, calculatoare). Pentru a exprima
c exist cel puin un student la secia Calculatoare utilizm:
( X)STUDENT(X,calculatoare).
- declaraia orice student la Calculatoare cunoate programare se exprim prin
( X) (STUDENT(X,calculatoare) CUNOATE_PROGRAMARE(X)).
- deducia Petru cunoate programare se transform n predicatul
CUNOATE_PROGRAMARE(petru). Pentru a reprezenta enunul Petru nu
cunoate programare folosim negaia CUNOATE_PROGRAMARE(petru).
- pentru a exprima faptul c un student care a promovat are media notelor mai mare
dect 5 utilizm combinaia promovat(X,maimare(media(Z,Y),5)). Dac tim c
Petru are notele 6 i 10 i reprezentm promovabilitatea lui atunci folosim un termen
compus: promovat(petru,maimare(media(6,10),5)).
n limbajul natural o combinaie de cuvinte alctuiete un enun (propoziie) cu un
anumit neles. n logica predicatelor, enunul este construit din termeni care alctuiesc o
formul sau o formul bine format.
O formul bine format se definete recursiv astfel:
1. un atom (este un predicat n-ar P(t
1
,...,t
n
), unde t
i
, i=1,...,n sunt termeni);
2. dac F i G sunt formule, atunci F, F G, F G, F G, F G sunt formule;
3. dac F este formul i x este o variabil liber, atunci ( x)F si ( x)F sunt
formule;
4. formulele se genereaz prin aplicarea de un numr finit de ori a regulilor de mai
sus.
Variabilele care apar n formule pot fi libere sau legate.
O variabil dintr-o formul este legat dac apare n formula pe care
cuantificatorul respectiv o aplic sau apare chiar n acel cuantificator. Deci, o variabil
cuantificat universal sau existenial este o variabil legat n formula prefixat de acel
cuantificator.
O variabil este liber dac nu este legat, adic dac are cel puin o apariie
liber n acea formul.
O formul care nu conine variabile libere se numete formul nchis.
Un literal este o formul redus la un atom (adic o formul care conine numai
predicate). Deci un literal este un atom sau negaia unui atom. Un literal pozitiv este un
atom. Un literal negativ este negaia unui atom.
Limbajul logic al predicatelor de ordin unu este o formalizare a enunurilor declarative
din limbajul natural. Aceste enunuri se refer la anumite cuvinte i pot fi adevrate
sau false n domeniul considerat. nelesul formulelor logice este definit relativ la un
cuvnt abstract numit structur (algebric) i poate fi, de asemenea, adevrat sau fals.
Deci, pentru a defini nelesul unei formule trebuie s se stabileasc o legtur ntre
limbaj i structur. Enunurile declarative pot face referire la entiti i reprezint
relaiile sau funciile dintre acestea. Astfel, abstractizarea matematic a cuvntului
numit structur, este o mulime nevid de entiti (numit domeniu), mpreun cu
relaiile i funciile definite pe mulime. Legtura dintre limbaj i structur se realizeaz
prin semantica limbajului.
16
Aspectele semantice se ocup de urmtoarele caracteristici:
interpretarea formulelor bine formate;
formule valide, inconsistente, echivalente;
consecin logic;
clauze Horn;
demonstrarea teoremelor prin reguli de inferen permite obinerea de formule
bine formate plecnd de la una sau mai multe formule bine formate aplicnd
modus ponnens, modus tollens, specializrii universale;
n logica predicatelor, deoarece n formule sunt implicate variabile, pentru a defini o
interpretare a unei formule trebuiesc definite domeniul i asignarea constantelor,
domeniul i asignarea funciilor, domeniul i asignarea predicatelor care apar n
formul.
O interpretare a unui limbaj L de ordin unu este constituit din urmtoarele elemente:
o mulime nevid D numit domeniul interpretrii;
fiecrei constante din limbajul L i se asigneaz un element din D;
fiecrui simbol de funcie n-ar din limbajul L i se asigneaz o aplicaie
n
D D .
fiecrui simbol de predicat P de aritate n, i se asigneaz o aplicaie
n
D {T, F} .
Interpretarea constantelor i a simbolurilor de funcii i predicate, constituie baza
asignrii valorilor de adevr formulelor din limbaj. Interpretarea unei formule va fi
definit ca o funcie a interpretrilor componentelor sale, care sunt termeni (constante,
variabile, functori). Deci, trebuie definit interpretarea unui termen. Deoarece termenii
pot s conin variabile, se introduce noiunea de evaluare.
Evaluarea unei variabile este o funcie care mapeaz unei variabile dintr-un alfabet o
interpretare.
O interpretare a unei formule F const dintr-un domeniu nevid D i asignarea de
valori fiecrei constante, funcie sau predicat care apar n F n modul urmtor:
1. fiecrei constante i se asigneaz un element din D;
2. fiecrei funcii n-are i se asigneaz o aplicaie de la D
n
la D, unde
D
n
={(x
1
,...,x
n
)|x
1
din D,...,x
n
din D};
3. fiecrui predicat n-ar i se asociaz o aplicaie de la D
n
la {True, False}.
Se spune c formula F are o interpretare peste domeniul D. Cnd se evalueaz valorile
de adevr ale unei formule F peste un domeniu D, ( x) se interpreteaz ca pentru toate
elementele din D, iar ( x) ca exist cel puin un element din D.
Regulile de evaluare a valorilor de adevr ale unei formule pentru orice
interpretare peste domeniul D sunt:
1. dac valorile de adevr ale lui G i H sunt evaluate, atunci se pot evalua i pentru
G, G H, G H, G H, G H ;
2. ( x)G este adevrat T, dac valoarea de adevr a lui G este T pentru orice
element din D, altfel este F;
3. ( x)G este T dac valoarea de adevr a lui G este T pentru cel puin un element
din D, altfel este F.
O formul care conine variabile libere nu poate fi evaluat. n logica predicatelor,
deoarece exist un numr infinit de domenii, exist i un numr infinit de interpretri ale
unei formule. Din aceast cauz nu se poate verifica validitatea sau inconsistena unei
formule prin evaluarea ei sub toate interpretrile posibile.
Exemplu:
17
considerm limbajul care conine constantele zero i cinci (pentru reprezentarea
numerelor naturale 0 i 5), functorul unar incr (pentru reprezentarea incrementrii) i
predicatul maimare (reprezint operaia de comparare). Pentru domeniul D reprezentat
de mulimea numerelor naturale avem:
zero
D
:= 0
cinci
D
:= 5
incr
D
(x) := 1+x
maimare
D
(x,y) := x>y
Pentru a determina interpretarea formulei 5 mai mare dect zero incrementat peste
domeniul D scriem formula ca (maimare(5,incr(zero))) = (maimare(5,1)) care are
valoarea de adevr True. Dac, n locul constantei 5 aveam o variabil liber X, formula
nu mai putea fi evaluat cu o valoare de adevr. Se tie c n mulimea numerelor
naturale, orice numr diferit de zero este mai mare dect acesta. n acest caz, formula
orice X numr natural este mai mare dect zero reprezentat prin (maimare(X,zero))
este adevrat n interpretarea numerelor naturale.
O formul este consistent (realizabil) dac exist cel puin o interpretare n care
formula s fie evaluat True.
Dac o formul este consistent ntr-o interpretare se spune c interpretarea este un
model al formulei sau c interpretarea satisface formula.
O formul este inconsistent (nerealizabil) dac i numai dac nu exist nici o
interpretare care s satisfac formula.
O formul este valid dac i numai dac orice interpretare a formulei este model
al formulei (interpretarea satisface formula).
Relaia dintre valoarea de adevr a formulei i termenii de clasificare ai formulei este:
O formul G este consecin logic a formulelor F
1
,...,F
n
dac i numai dac sub
orice interpretare, dac
1 n
F ... F este adevrat, atunci i G este adevrat.
Teorema deduciei arat c fiind date formulele F
1
,...,F
n
i o formul G, G este o
consecin logic a formulelor F
1
,...,F
n
dac i numai dac formula
1 n
((F ... F ) G)
este valid sau
1 n
((F ... F ) G) este inconsistent.
2.1.1 Interpretare i modele
Semantica declarativ a unui program logic este dat de semantica (teoria
modelelor) formulelor n logic de ordin unu. Pentru a demonstra o problem este
necesar s se porneasc de la axiome i s se deduc o concluzie adevrat. Problema se
reprezint cu ajutorul formulelor, care sunt interpretate pentru a clasifica formula n
valid, invalid, consistent sau inconsistent.
ntotdeauna
adevrat
ntotdeauna
fals
Uneori adevrat,
uneori fals
valid invalid
contingent
consistent (realizabil)
inconsistent
18
n logica predicatelor de ordin unu, deoarece exist un numr infinit de domenii,
exist i un numr infinit de interpretri ale unei formule. Astfel, o formul care descrie
un enun ntr-un domeniu, poate descrie alt enun n alt domeniu, rezultnd mai multe
modele pentru aceeai formul. Din aceast cauz nu este posibil s se verifice
validitatea sau inconsistena unei formule prin evaluarea ei sub toate interpretrile
posibile. Astfel, se utilizeaz proceduri Herbrand sau proceduri rezolutive de
demonstrare, care sunt proceduri de respingere a formulelor, adic n loc s se
demonstreze c o formul este valid, se demonstreaz c negaia formulei este
inconsistent. Pentru a se utiliza procedurile Herbrand, trebuie definit universul
Herbrand al unei mulimi de clauze.
Clauzele sunt formule transformate n forma standard Skolem, care are forma
unei disjuncii de literali de
1 n 1 m
x ,..., x (L ... L ) , unde
1 n
x ,..., x apar n
1 m
L ,..., L
(nu conine cuantificatorul existenial).
Clauzele se mai numesc i clauze Horn.
Pentru a se transforma o formul la forma de mai sus se folosesc urmtoarele reguli:
treceri n formule echivalente. Dou formule sunt echivalente, dac i numai
dac au aceleai valori de adevr pentru orice interpretare a oricrei din cele
dou formule. Formulele de echivalent din logica propoziiilor sunt:
F G echivalent cu (F G) (F G)
F G echivalent cu F G
F G G F
comutativitate
F G G F
(F G) H F (G H)
asociativitate
(F G) H F (G H)
F (G H) (F G) (F H)
distributivitate
F (G H) (F G) (F H)
F True True
F
=
False F
F True F
F False False
F F False
F F True
( F) F
(F G) F G
de Morgan
(F G) F G
=
=
=
=
=
=
La acestea se mai adaug i alte formule echivalente specifice logicii
predicatelor de ordin unu:
19
1
( x)F(x) G ( x)(F(x) G)
( x)F(x) G ( x)(F(x) G)
( x)F(x) G ( x)(F(x) G)
( x)F(x) G ( x)(F(x) G)
( xF(x)) x( F(x))
( xF(x)) x( F(x))
xF(x) xG(x) x(F(x) G(x))
xF(x) xG(x) x(F(x) G(x))
Q xF(x
2 1 2
1 2 1 2
1 2
) Q xG(x) (Q x)(Q y)(F(x) G(y))
Q xF(x) Q xG(x) (Q x)(Q y)(F(x) G(y))
unde Q si Q pot fi sau , iar y nu trebuie sa apara in F(x)
transformarea formulei n forma normal prenex:
1 1 n n
(Q x )...(Q x )M, unde
i
Q , i 1...n = sunt cuantificatorii universal i existenial , iar M este o
formul, numit matrice, care nu conine cuantificatori.
i i
(Q x ) formeaz
prefixul formulei;
matricea, deoarece nu conine cuantificatori, poate fi transformat n forma
conjunctiv normal (matricea poate fi considerat ca fiind scris n logica
propoziiilor pentru c nu conine cuantificatori). n logica propoziiilor exist
dou forme normale conjunctiv
1 n
F ... F i disjunctiv
1 n
F ... F
fr a afecta proprietile de inconsisten, cuantificatorul existenial din prefix
poate fi eliminat folosind funciile Skolem. Astfel, fie F o formul n forma
normal prenex
1 1 n n
(Q x )...(Q x )M, iar matricea M este n forma normal
conjunctiv. Se presupune n prefixul
1 1 n n
(Q x )...(Q x ) , cuantificatorul
r
Q , 1 r n ca fiind existenial.
o dac nici un cuantificator universal nu apare naintea lui
r
Q , atunci se
alege o constant C (diferit de cele care apar n M) care nlocuiete pe
r
x i se terge
r r
Q x din prefix;
o dac
s1 sm
Q ,..., Q sunt cuantificatori universali care apar naintea lui
r
Q n
prefix, 1 s1 ... sm r , atunci se alege o funcie m-ar f (diferit de
toate funciile care apar n M) i se nlocuiesc toate apariiile lui
r
x din M
cu
s1 sm
f (x ,..., x ) i se terge
r r
Q x din prefix;
Dup ce se elimin toi cuantificatorii existeniali din prefix se obine forma
standard Skolem a formulei F. Constantele i funciile folosite pentru a nlocui
variabilele cuantificate existenial se numesc funcii Skolem.
Etapele n care se obine o transformare a unei formule ntr-o clauz sunt:
se transform formula n forma normal Prenex, n care matricea nu conine nici
un fel de cuantificatori, iar prefixul este o secven de cuantificatori.
matricea, deoarece nu conine cuantificatori se aduce la forma conjunctiv
normal.
se elimin cuantificatorii existeniali din prefix folosind funciile Skolem.
Scopul transformrii n forma standard Skolem este pentru a rezolva problemele prin
teorema lui Herbrand sau prin metodele rezoluiei.
20
Exemple:
1. formula ( x)( y)( z)( u)( v)( w)P(x, y, z, u, v, w) are forma Skolem
( y)( z)( v)P(a, y, z, f (y, z), v, g(y, z, v)) ;
2. formula x y z(( P(x, y) Q(x, z)) R(x, y, z) se transform n forma
normal conjunctiv x y z( ( P(x, y) R(x, y, z)) (Q(x, z) R(x, y, z)) )
i are forma Skolem
x ( ( P(x, f (x)) R(x, f (x), g(x))) (Q(x, g(x)) R(x, f (x), g(x))) )
Un program scris n Prolog este o mulime de clauze, care poate fi considerat ca
o conjuncie a tuturor clauzelor implicate, iar fiecare variabil este considerat ca fiind
guvernat de un cuantificator universal.
Dac se consider S o mulime de clauze, care reprezint forma standard a unei
formule F. Pentru a demonstra c formula F e inconsistent este suficient a demonstra
c mulimea de clauze ataat acesteia e inconsistent. O mulime de clauze este
inconsistent (sau nerealizabil, nesatisfcut), dac este fals n toate interpretrile pe
toate domeniile posibile. Deoarece este imposibil s se evalueze formula pentru toate
interpretrile, pe toate domeniile posibile, se definete un domeniu special H, astfel
nct S este inconsistent dac i numai dac formula F este fals sub toate interpretrile
peste domeniul H. Un astfel de domeniu, numit universul Herbrand pentru mulimea
de clauze S se definete astfel:
fie HC mulimea constantelor care apar n S. Dac nu exist nici o constant
atunci se consider HC={a}.
pentru i=1,2,, fie Hi+1 reuniunea lui Hi cu mulimea termenilor de forma
n
1 n
f (t ,..., t ) , care sunt funcii n-are din S, iar
i
t sunt elemente ale mulimii Hi.
Mulimea Hi se numete mulimea de constante de nivel i, iar H
se numete
universul Herbrand pentru S.
Exemple:
1. Fie S {P(a), P(x) P(f (x))} = . Universul Herbrand este definit astfel:
0
1
2
H {a}
H {a, f (a)}
H {a, f (a), f (f (a))}
...
H {a, f (a), f (f (a), f (f (f (a))),...}
=
=
=
=
2. Fie S {P(x) Q(x), R(z), T(y) W(y)} = . Universul Herbrand este:
0 1
H H H ... {a} = = = = , deoarece formula nu conine nici un simbol funcional.
3. Fie S {P(f (x)), a, g(y), b} = . Universul Herbrand este dat de mulmile:
0
1
2
H {a, b}
H {a, b, f (a), f (b), g(a), g(b)}
H {a, b, f (a), f (b), g(a), g(b), f (f (a)), f (f (b)), f (g(a)),
f (g(b)), g(f (a)), g(f (b)), g(g(a)), g(g(b))}
=
=
=
21
2.1.2 Inferen logic
Procesul de raionament const n obinerea, pe baza unei mulimi de formule date,
numite premise, de noi formule, numite concluzie. n logica simbolic, principiile de
raionament, care constau n deducerea de formule valide din alte formule valide, sunt
scrise sub forma regulilor de inferen. Astfel, regulile de inferen permit obinerea de
consecine logice din premisele asupra crora se aplic inferena. Regulile de inferen
uzuale sunt:
Modus ponens consider c dac se tie c F i F->G atunci se poate trage
concluzia c G.
F, F -> G
G
Modus tollens consider c dac se tie c G i F->G atunci se poate trage
concluzia c F.
G, F -> G
F
Regula eliminrii cuantificatorului universal consider c ntr-o formul de
forma X F(X) se poate nlocui apariia variabilei legate X cu un termen t care
este liber de variabila X:
X F(X)
F(t)
O mulime de premise se numesc inconsistente, dac orice formul poate fi obinut prin
inferen din mulimea de formule.
2.1.3 Substituii
Din punct de vedere formal, o substituie const n nlocuirea variabilelor dintr-un
alfabet cu termeni din acelai alfabet. Prin substituie se nelege o mulime de perechi
{X
1
|t
1
,...,X
n
|t
n
}, unde t
i
sunt termeni, X
i
sunt variabile astfel nct X
i
t
i
i X
i
X
j
dac
i j.
Fie substituia dat de {X
1
|t
1
,...,X
n
|t
n
} i Este un termen sau o formul.
Aplicarea substituie la E este termenul sau formula obinute prin nlocuirea cu t
i
a
fiecrei apariii a variabilei libere X
i
n E. E se numete instan a lui E.
Exemple de substituii:
- Fie formula p(f(X,Z), f(Y, a)) i substituia {X|a, Y|Z, W|b}. Instana formulei
este p(f(a,Z), f(Z; a)).
- Fie formula p(X, Y ) i substituia {X|a, Y|b}, instana formulei este p(a, b).
Considerm , , substituii i E un termen sau o formul. Proprietile substituiei
sunt:
E( , )=(E )
( ) = ( ) (asociativitate)
(nu este comutativ)
22
2.2 Aspecte teoretice aplicate n Prolog
Programarea logic este baza pentru toate celelalte reprezentri de cunotine ale
lumii reale. Programele logice pot fi aplicate n multe domenii. Astfel, Web Consortium
a adoptat un limbaj logic pentru proiectul Semantic Web. n unele aplicaiile de
monitorizare a traficului aerian se folosesc limbaje logice pentru descrierea restriciilor
impuse de domeniu. De asemenea, n domeniul nelegerii limbajului natural se folosesc
aspecte de programare logic. Logica predicatelor de ordin unu permite modelarea
informaiilor generale despre lumea real i este sugestiv fa de limbajul natural i n
plus, computaional prin limbajele de programare logice. O caracteristic a limbajelor
logice, diferit de a limbajelor de programare, dar care seamn cu limbajul natural, este
c permite introducerea de cunotine adevrate despre lumea real fr a fi nevoie s se
specifice o modalitate de a fi calculate.
Problemele de rezolvat n programare logic este indicat s aib domenii cu
structur logic (cum ar fi sistemele deductive). S poat fi exprimate folosind clauze i
pattern-matching (translare, parsare).
Diferite implementri ale Prolog:
N
a
m
e
O
S
L
i
c
e
n
c
e
N
a
t
i
v
e
G
r
a
p
h
i
c
s
U
n
i
c
o
d
e
O
b
j
e
c
t
O
r
i
e
n
t
e
d
N
a
t
i
v
e
O
S
C
o
n
t
r
o
l
S
t
a
n
d
A
l
o
n
e
E
x
e
c
u
t
a
b
l
e
C
I
n
t
e
r
f
a
c
e
*
J
a
v
a
I
n
t
e
r
f
a
c
e
*
I
n
t
e
r
a
c
t
i
v
e
I
n
t
e
r
p
r
e
t
e
r
D
e
b
u
g
g
e
r
S
y
n
t
a
x
DOS-
PROLOG
MS-DOS Shareware X X X X X
Edinburgh
Prolog
Open
Prolog
Mac OS Freeware X
Ciao
Prolog
Unix,
Windows
GPL X X X X X ISO-Prolog
GNU
Prolog
Unix,
Windows
GPL X X X X X ISO-Prolog
Visual
Prolog
Windows
Freeware,
comercial
X X X X X X X
SWI-
Prolog
Unix,
Windows,
Mac OS
LGPL X X X X X X X
ISO-Prolog,
Edinburgh
Prolog
23
WIN-
Prolog
Windows
Shareware
comercial
X X X X X
ISO-Prolog,
Quintus Prolog
Tu-Prolog JVM GPL X X X X X X ISO-Prolog
Conferine cu specific pe limbajele logice:
INAP - International Conference on Applications of Declarative Programming
and Knowledge Management
ICLP - International Conference on Logic Programming
Scopul programrii logice este de a rezolva probleme prin obinerea de concluzii
pornind de la descrieri declarative ale condiiilor n care exist soluia, dar fr a arta
cum se gsete soluia. Aceste descrieri, numite programe logice, sunt alctuite dintr-o
mulime finit de formule logice. Asupra acestor formule se aplic restricii care permit
aplicarea principiului rezoluiei. O limitare a variantelor de Prolog clasice este c nu
permit definirea de funcii, doar relaii (vzute ca proceduri care nu returneaz nici o
valoare). De exemplu, n Prolog clasic nu se poate defini funcia factorial(X) care are ca
argument un ntreg i returneaz un ntreg, se poate defini doar relaia boolean
factorial(X, Rez) care leag un ntreg X de factorialul su Rez.
Un program logic n Prolog este definit printr-o mulime finit de clauze, n care
fiecare variabil este considerat ca fiind guvernat de un cuantificator universal.
O clauz are forma:
1 n
A B ,..., B sau clauza unitate A , unde A (numit cap) i B
i
(formeaz corpul) sunt formule n care toate variabilele sunt cuantificate universal.
Prolog utilizeaz ca regul de inferen rezoluia asupra clauzelor concrete, apoi
generalizat la clauze Horn prin mecanismul de unificare.
Un literal este concret dac nu conine variabile. O clauz concret este o
disjuncie de literali concrei.
Fie clauzele concrete
1 n
A A ... A = i
1 2 m
B A B ... B = .
1
A i
1
A se
numesc literali complementari.
Principiul rezoluiei obine clauza rezolvant
2 n 2 m
C A ... A B ... B =
plecnd de la clauzele A i B, prin eliminarea literalilor complementari i prin disjuncia
celorlali literali.
Mecanismul de inferen are ca scop cutarea echivalenei ntre dou formule,
care se realizeaz prin mecanismul de unificare.
Considerm s i t termeni. Unificatorul lui s i t este o substituie astfel nct
s i t sunt identici (se noteaz cu s =t ).
O substituie se spune c este mai general dect o alt substituie dac i
numai dac exist o substituie astfel nct = .
Un unificator se numete cel mai general unificator pentru doi termeni, dac
i numai dac este mai general dect orice alt unificator al termenilor.
Pentru o formul F unificatorul general cel mai comun se obine dac pentru
toi unificatorii , exist o substituie astfel nct [F] [ [F]] = .
Unificarea caut literalii complementari prin aplicarea de substituiri.
Exemplu: pentru formula F {x, y, f (z)} = unificatorul general cel mai comun este
p {f (z) | x, F(z) | y, z | z} = , cu s {f (a) | x, f (a) | y, a | z} = .
24
Rezoluia aplicat clauzelor oarecare: fie clauzele A i B, care nu au variabile comune.
Se spune c este posibil s se asocieze fiecrui cuantificator un nume de variabil
diferit. A i B sunt compuse dintr-o disjuncie de literali
i
{A } i
j
{B }. Dac exist
submulimile
k
{A } i
l
{B }astfel nct
k l
{A } { B } U sunt unificabile prin cel mai
comun unificator general p, atunci rezolventul lui A i B se poate scrie
i k j l
p[{A } {A }] p[{B } {B }] .
Proprietatea fundamental a rezoluiei: dac n urma unei rezoluii, plecnd de la o
mulime C de clauze se ajunge la o clauz vid, atunci C este inconsistent.
Exemplu: A P(x, f (a)) P(x, f (y)) Q(y) = , B P(z, f (a)) Q(z) = .
Unificatorul general cel mai comun al lui P(x, f (a)) i ( P(z, f (a))) este {x | z}, iar
de aici rezult rezolventul P(x, f (y)) Q(y) Q(x) .
Unificatorul general cel mai comun al lui P(x, f (y)) i ( P(z, f (a))) este {x | z, y | a},
iar de aici rezult rezolventul P(x, f (y)) Q(y) Q(x) .
Unificatorul general cel mai comun al lui Q(y) i ( Q(z)) este {y | z}, iar de aici
rezult rezolventul P(x, f (a)) P(x, f (y)) P(y, f (a)) .
Se observ astfel c dou clauze pot avea nici unul sau mai muli rezolvani.
2.2.1 Principiul rezoluiei prin respingere
Rezoluia prin respingere este utilizat pentru a demonstra c o formul bine
format A este consecin logic a unei mulimi de formule
i
S {S } = . Se procedeaz
astfel:
1. se constituie mulimea de clauze C derivate din S;
2. se adaug la mulimea de clauze C clauza derivat din A ;
3. atta timp ct clauza vid nu este n C se urmeaz paii:
a. se aleg dou clauze distincte din C;
b. dac nu sunt rezolvani, se alege o clauz i se adaug la C.
Se poate demonstra c dac A este consecin logic a lui S, exist un set de alegeri la
pasul 3.a care vor conduce la introducerea clauzei vide i la oprirea procedurii. Dar
nimic nu garanteaz c aceast pereche, cnd exist, este gsit, deoarece etapele de la
pasul 3 sunt nedeterministe. Deci se pun probleme de strategie, cu privire la modalitatea
de alegere a clauzelor la pasul 3.a i a literalilor corespunztori la pasul 3.b.
O strategie de rezoluie const n construirea unui arbore de respingere, n care
nodurile sunt clauze din S. Arcele sunt legturi ntre clauzele prini i rezolvanii
posibili, iar frunzele sunt clauze vide.
2.2.2 Cunotine n Prolog
Nu exist nici o normalizare a limbajului Prolog.
Un program Prolog este o list ordonat de clauze Horn (prin care se formalizeaz
enunuri declarative) care exprim:
reguli
1 n 1 n
S ... S R S ... S R
1 n
R S ... S ;
fapte F;
scopuri
1 m
B ... B .
25
Regulile sunt clauze Horn complete care au un literal pozitiv unic, (numit i cap) i unul
sau mai muli literali negativi, (numii i coad).
Faptele sunt literali pozitivi.
Scopurile sunt clauze care conin doar literali negativi.
Unei reguli i se poate asocia:
o interpretare logic dac predicatele din coad sunt adevrate, atunci
predicatul din capul regulii este de asemenea adevrat;
o interpretare procedural pentru a rezolva problema capului unei reguli,
trebuie s se rezolve succesiv problema cozii.
Rspunsul la un scop care nu conine variabile trebuie s se obin n valorile de adevr
T sau F. Rspunsul la un scop cu n variabile este o mulime de n valori, care se pot
asocia cu variabilele i care satisfac scopul. Variabilele anonime se noteaz cu _ i
valoarea lor este indiferent.
Exemple:
1. formula bine format xP(x, a) are forma cauzal P(x, a) , iar n Prolog se scrie
P(X, a) .
2. se consider formula bine format x y(Q(x, a) R(b, y)) P(x, y) are forma
cauzal P(x, y) Q(x, a) R(b, y) . n Prolog se scrie
P(X, Y) : Q(X, a), R(Y, b) .
3. formula bine format x y R(x, a) S(y, b) are forma cauzal
R(x, a) S(y, b) , iar ca scop n Prolog R(X, a), S(Y, b) , deoarece este
negarea lui x yR(x, a) S(y, b) .
2.2.3 Strategii de rezoluie n Prolog
Se aplic rezoluia ntre scopuri i reguli cu B
1
i R unificabile prin unificatorul general
cel mai comun p, care conduce la clauza
1 2 n 2 m
p[S ] p[S ] ... p[S ] p[B ] ... p[B ] ,
adic noile scopuri
1 n 2 m
p[S ],..., p[S ], p[B ],..., p[B ] .
Algoritmul de rezoluie poate fi considerat ca parcurgerea unui arbore, n care fiecare
nod este etichetat printr-o list de scopuri i o substituie
1 m
[B ,..., B , s]. Nodul rdcin
conine scopurile problemei propuse.
Algoritmul este:
fie nodul
1 m
[B ,..., B , s];
dac lista
1 m
[B ,..., B ] este vid
atunci afieaz S ( un succes);
se trece la nodul precedent;
altfel se consider
1
B ;
se caut prima regul dintre
1 n
R S ... S care nu a fost nc
explorat la acest nod i deci literalul pozitiv se poate unifica prin
1
B ;
dac nu exist
atunci
dac este un nod rdcin
atunci gata
altfel se urc la nodul precedent
26
altfel fie p unificatorul general cel mai comun al lui R i
1
B
coborrea creeaz un nou nod [
1 n 2 m
p[S ],..., p[S ], p[B ],..., p[B ] ]
Interpretorul Prolog genereaz o list de scopuri care se rezolv prin terge folosind
unificarea i o list de alegeri n ateptare. Dup un succes sau dac nu exist nici o
unificare posibil, se ntoarce napoi la lista de scopuri precedente i ia n considerare
ultima alegere n ateptare. Oprirea definitiv se produce cnd nu mai este posibil nici
o ntoarcere napoi.
27
2.2.4 Reprezentarea cunotinelor n Prolog
Principalele seciuni
Domeniile descriu tipurile de date care sunt verificate de interpretor sau
compilate.
Predicatele cuprind i clasific relaiile cunoscute din spaiul problemei.
Scopul descrie problema de rezolvat i formatul rspunsului ateptat.
Clauzele sunt reprezentate prin fapte logice, reguli i alte construcii.
Subprogramele sunt utile atunci cnd se folosete varianta compilat a Prolog-ului, care
permit opiuni de re-compilare la fiecare execuie a unui subprogram (un program poate
fi mprit pe subprograme care pot fi rulate separat). Implementrile interpretate ale
Prolog accept doar un singur modul de program.
Subrutine sunt predicatele i au acelai scop cu funciile din limbajele de programare
procedurale. Predicatele returneaz doar valori de tip boolean (true, false sau fail).
Argumentele predicatelor pot fi clasificate c fiind intrri sau ieiri. Dac un argument
primete o valoare n timpul apelului predicatului, atunci argumentul este de tip intrare,
altfel de tip ieire. Un argument poate fi i intrare i ieire.
Limbajul Prolog are predicate predefinite pentru funciile matematice, pentru operaii de
intrare-ieire (read, read-line, write), de lucrur cu iruri de caractere, pentru operaii cu
structuri.
Tipuri de date: sunt symbol, integer, real, string, char, list, file, simple, compound.
Nu se pot defini tablouri.
Constantele sunt true i fail.
Comentariile dac sunt pe mai multe linii sunt cuprinse ntre /* i */, iar dac sunt pe o
singur linie ncep cu %.
Clauzele sunt scrise n Prolog dup sintaxa:
cap :- corp
Scopurile sunt trecute ntr-o list separate prin , sau ;
2.2.5 Rezoluia n Prolog
Strategia de rezolvare n Prolog este n adncime folosind metoda backtracking.
Rezolvantul obinut la un pas de inferen este utilizat imediat pentru o nou unificare.
Clauzele de unificat cu rezolvantul sunt considerate n ordinea scrierii programului.
Unificarea se realizeaz ntotdeauna asupra primului literal al rezolvantului i asupra
literalului pozitiv al clauzelor programului.
Exemplu: se dau
Fapte (a) tata(paul, ion)
(b) tata(marian, paul)
Regula (c) bunic(A,B):- tata(A,P), tata(P,B)
Scop (d) bunic(X,Y).
- interpretorul ncearc unificarea scopului (d) cu primul literal al lui (a), apoi cu (b),
apoi cu (c). Unificarea este posibil pentru (c) cu substituia {X| A, X| B}. Noile
scopuri sunt (e) tata(X,P),tata(P,Y).
28
- interpretorul ncearc s unifice primul scop al lui (e) cu primul literal al lui (a), (b),
(c). Unificarea este posibil cu (a) pentru substituia {Paul|X, Ion|P}. Noul scop este
(f) tata(Ion,Y).
- interpretorul ncearc unificarea scopului (f) cu primul literal din (a), (b), (c), dar nu
este posibil nici o unificare.
- se ntoarce la scopul (e) i se ncearc unificarea cu clauzele n ateptare (b) i (c).
Unificarea este posibil cu (b) pentru substituia {Marian|X, Paul|P}. Noul scop este
(g) tata(Paul,X).
- interpretorul ncearc s unifice scopul (g) cu primul literal din (a), apoi din (b) i (c).
Unificarea este posibil pentru (a) cu substituia {Ion|Y}. Noul scop este clauza vid.
Problema se termin cu un succes i se afieaz substituiile pentru variabilele din
scopul iniial, astfel X=Marian, Y=Ion.
Observaie: soluiile nu sunt gsite ntotdeauna; ordinea clauzelor din program este
important. Ca regul general ntr-un program se scriu faptele i apoi regulile.
Exemplu:
1. a->a
a
determin o bucl infinit pentru scopul a, n pofida unui rspuns evident.
2. a
a->a
d un rspuns adevrat.
Sunt variante de limbaj care se opresc la primul scop gsit i altele care caut toate
scopurile posibile.
2.2.6 Controlul rezoluiei
n Prolog exist un predicat predefinit ! (sau /) care permite suprimarea explorrii
anumitor ramuri din arborele de rezoluie. Acest predicat este ntotdeauna True. n
utilizarea metodei backtracking, dac interpretorul ajunge la un nod la care lista de
scopuri ncepe cu predicatul de ntrerupere a explorrii arborelui de rezoluie, atunci se
ntoarce pn la nodul corespunztor nodului precedent, scop care a declanat apelul
regulii care coninea predicatul !.
Acest predicat se utilizeaz de obicei, la sfritul ntrebrii pentru a evita ntoarcerea n
cazul unui prim succes. Sau se foreaz un rspuns unic n cazul n care programul are
rspunsuri multiple, chiar o infinitate de rspunsuri. Se mai poate utiliza n corpul unei
reguli pentru a fora un rspuns pertinent i pentru a mpiedica alte explorri.
Exemplu:
1 a:-b, c, d.
c
d
e
f
a
g
b
h
a
esec
succes
29
2 b:-write(clauza b1), nl.
3 b:-write(clauza b2), nl.
4 c:-c1,!,c2.
5 c:-write(clauza c2), nl.
6 c1:-write(clauza c11), nl.
7 c1:-write(clauza c12), nl.
8 c2:-write(clauza c21), nl.
9 c2:-write(clauza c22), nl.
10 d:-write(clauza d1(succes)), nl, fail.
11 d:-write(clauza d2(succes)), nl, fail.
n urma rulrii programul va afia:
clauza b1
c11
c21
d1 (succes)
d2 (succes)
c22
d1 (succes)
d2 (succes)
b2 /*urc la b din cauza lui !*/
c11
c21
d1 (succes)
d2 (succes)
c22
d1
d2 /*urc la b i sfrit*/
Fr ! n regula 4 se obin urmtoarele rezultate:
clauza b1, c11, c21, d1(succes), d2(succes), c22, d1(succes), d2(succes), c12, (urmeaz
o parte neexplorat), c21, d1(succes), d2(succes), c22, d1(succes), d2(succes), c2,
d1(succes), d2(succes), b2, c11, c21, d1(succes), d2(succes), c22, d1(succes),
1
a
b c d
c d
2
4
c1 ! c2 d
! c2 d
6
!
c2 d
d
8
succes
10
c d
3
4
c1 ! c2 d
! c2 d
6
!
c2 d
d
8
succes
10 11
d
9
succes
10 11 11
d
9
succes
10 11
30
d2(succes), c12, (urmeaz o parte neexplorat), c21, d1(succes), d2(succes), c22,
d1(succes), d2(succes), c2, d1(succes), d2(succes).
Exemplu: de calcul al factorialului unui numr ntreg:
/* Program care defineste predicatele pentru calculul factorialului */
factorial(0,1):-!
factorial(N,F) :-
N>0,
N1 is N-1,
factorial(N1,F1),
F is N * F1.
2.2.7 Liste
Listele constituie structura de baz manipulat n Prolog, datorit tratrii recursive.
Listele sunt definite ntre [ i ].
Exemple:
[Ion, Paul, Marian]
[X|Y] [cap|coada]
Exemplu: de algoritm de ordonare rapid Dijkstra:
citestelista([T|Q]):- read_integer(T), !, citestelista(Q).
citestelista([]).
scrielista([]).
scrielista([T|Q]):-write(T), nl, scrielista(Q).
taie(_, [],[],[]).
taie(X,[Y|L], [Y|L1], L2):-Y<X, taie(X, L, L1, L2).
taie(X,[Y|L], L1, [Y|L2]):-Y>X, taie(X, L, L1, L2).
taie(X,[X|L], [X|L1], L2):- taie(X, L, L1, L2).
conc([], L, L).
conc([X|L1], L2, [X|L3]):-conc(L1, L2, L3).
tri([],[]).
tri([X|L],LT):-taie(X,L,L1,L2),tri(L1,LT1), tri(L2,LT2), conc(LT1, [X|LT2], LT).
ordonare:-write('Tastati lista'), nl, citestelista(L), tri(L,Lo),
write('Lista ordonata este:'), nl, scrielista(Lo), nl.
Predicatele utilizate i semantica acestora sunt:
citestelista(L) citete o list L.
scrielista(L) scrie o list L.
tri(L,L)
taie(I, L1, L2, L3)
conc(L1, L2, L3) concateneaz L1 i L2 rezultnd L3.
ordonare este predicatul care va fi folosit ca scop pentru execuia programului.
Exemplu: problema de sortare care ordoneaz cresctor o list de ntregi pozitivi.
ntregii pozitivi sunt reprezentai cu ajutorul constantei O i cu funcia unar
f(succesor). ntregul pozitiv n este reprezentat prin termenul
n
f (O) . Lista se reprezint
prin simbolul funciei binare ., constanta nil reprezint lista vid. Astfel, lista
31
[17,22,6,5] se reprezint prin 17.(22.(6.(5.nil))) sau prin 17.22.6.5.nil. predicate folosite
n program sunt sort, sorted, perm, delete, <= (scris infixat).
Semantica pentru predicate este:
sort: dac x i y sunt liste, y este o permutare a lui x i y este ordonat, atunci y
este versiunea ordonat a lui x.
sorted: lista vid este ordonat.
delete(x,z,w) se obine prin tergerea lui y din y.z i y.w.
Pentru a executa programul se fixeaz scopul sort(17.22.6.5.nil,X).
32
3. Programare funcional
Programarea funcional este o paradigm de programare, care se bazeaz pe
evaluarea expresiilor sau termenilor (specific limbajelor declarative) mai mult dect pe
evaluarea comenzilor (specific limbajelor procedurale). Expresiile n limbajele
funcionale sunt formate prin funcii care combin valori de baz (spre deosebire de
relaii care formeaz baza limbajelor logice). n programarea funcional, pentru a
realiza un program se consider funciile din punct de vedere matematic. Cele mai
importante caracteristici ale funciilor din acest punct de vedere sunt faptul c nu au
memorie i nu cauzeaz efecte colaterale (funciile furnizeaz doar rezultate atunci cnd
primesc valori pentru argumente). A doua caracteristic este valabil pentru limbajele
funcionale pure.
Exemplu: de program pentru calculul sumei numerelor ntregi de la 1 la 10.
ntr-un program imperativ (de exemplu limbajele C au Java), se utilizeaz o structur
repetitiv astfel:
total=0;
for(int i=1;i<=10;i++)
total+=i;
ntr-un program funcional nu se utilizeaz recursia pentru definirea funciei care
calculeaz suma:
n limbaj SML codul este:
let fun sum i total
= if i=0 then total
else sum (i-1) (total+i)
in sum 10 0
end
unde total i i sunt parametri formali care transmit explicit starea funciei, iar elementul
condiional este considerat o expresie care calculeaz o valoare i nu o secven de
comenzi.
n limbaj Scheme:
(define sum
(lambda (from total)
(if (=0 from)
total
(sum (- from 1) (+ total from))
)
)
)
(sum 10 0)
Programele funcionale rezolv problemele prin aplicarea de funcii.
Limbajele de programare funcionale se mpart n stricte (exemple ML, Caml, Scheme,
Pizza, Erlang) i non-stricte (Clean, Gofer, Haskell, Miranda). Se consider funcia f
care are ca argument o expresie exp, astfel f(exp). ntr-un limbaj funcional strict,
argumentele unei funcii sunt evaluate nainte de apelul funciei. Dac din evaluarea
expresiilor implicate n argumentele funciei rezult eroare, atunci funcia nu se mai
evalueaz. ntr-un limbaj non-strict, argumentele unei funcii nu sunt evaluate pn cnd
nu sunt cerute valorile acestora. Astfel, dac din evaluarea expresiei exp rezult eroare,
apelul funciei f(exp) poate s nu aib rezultat eronat, dac valoarea parametrului nu
este utilizat n corpul funciei.
33
Printre limbajele funcionale exist implementri concurente (exemple Erlang, Pizza,
Clean).
Aplicaii pentru programarea funcional:
Lisp a fost creat la sfritul anilor 1950 de ctre John McCarthy. Limbajul de
programare poate implementa i aspecte imperative, ceea ce la vremea respectiv a
fost un avantaj.
Allegro CL- sistem de dezvoltare dinamic i orientat obiect, creat pentru aplicaii
entreprise. Are la baz Common Lisp i este ideal pentru aplicaii critice, extensibile,
cum ar fi servere dinamice, managementul cunotinelor, controlul produciei,
proiectarea i realizarea semiconductorilor, data mining. Este realizat de Franz Inc. i
are versiuni free pentru platforme Windows, Linux, MacIntosh.
ML este un meta-limbaj care implementeaz structuri de control funcionale,
module i care a stat la baza dezvoltrii altor implementri. Dintre acestea amintim
Standard ML, Lazy ML, CAML. Exist variante ale ML pentru mai multe platforme
(PC-uri, staii de lucru, mainframe-uri, sisteme multi-procesor) i diverse sisteme de
operare.
Scheme este o variant a limbajului Lisp. Este simplu i poate implementa diverse
reprezentri de programare abstracte. Este standardizat i prezint mai multe
implementri, cum ar fi: Chez Scheme, MIT/GNU Scheme, Scheme 98.
Limbajele funcionale sau aplicative realizeaz calcule prin evaluarea expresiilor,
implementnd calculul lambda, care este un prototip de limbaj funcional, de mici
dimensiuni. Limbajele funcionale sunt indicate de a fi utilizate n analiza i
raionamentul formal i pot fi implementate mai uor pe arhitecturi paralele. Aspectele
teoretice ntlnite n limbajele funcionale sunt funciile complexe (recursive, mutual
recursive, polimorfice), evaluare slab (engl. lazy), potrivire (engl. pattern matching),
date abstracte.
Calculul lambda poate fi definit ca un sistem formal (structur abstract utilizat
pentru modelare, constituit din o mulime finit de simboluri utilizate pentru
construcia de formule, o gramatic care permite construirea de formule bine formate, o
mulime de axiome, teoreme i reguli de inferen), utilizat pentru a investiga definiia i
aplicarea funciilor i a recursiei. Teoria calculului lambda a fost introdus de Alonzo
Church i de Stephen Cole Kleene n anii 1930. Aceast teorie poate fi utilizat pentru
definirea funciilor computabile (calculabile). Calculul lambda a fost construit, din
punct de vedere informal, pe sintaxa termenilor i a regulilor de transformare a
termenilor (prin substituia de variabile) cu scopul de a trata comportamentul funciilor
(orice funcie poate fi exprimat i evaluat cu acest formalism). Funciile sunt
considerate a fi mulimi de perechi argument-valoare care pot fi calculate. n teoriile
matematice n care funciile sunt considerate ca mulimi nu este permis recursia,
deoarece nu exist noiunea ca o mulime s se conin pe sine. Teoria calculului
lambda a permis introducerea noiunii de funcie recursiv. Din punct de vedere
matematic calculul lambda este consistent, deoarece nu conine paradoxuri sau
contradicii.
Calculul lambda poate fi cu sau fr tip. Varianta fr tip a fost conceput iniial
de Curch. La aceasta s-au adugat tipuri fiecrui termen, pentru a pstra compatibilitatea
n timpul substituiilor. Astfel, fiecare constant se consider a avea un tip de baz, iar
fiecare funcie (considerat o abstracie lambda) are un tip compus. Tipurile compuse
sunt notate cu pentru funcii definite pe tipul cu valori de tipul . Avantajul
calculului lambda cu tip este posibilitatea de a reduce fiecare termen la forma normal.
Calculul lambda cu tip este baza unor limbaje funcionale (exemplu, Haskell, Standard
ML, Caml).
34
3.1 Sintaxa calculului lambda
Un program funcional trebuie interpretat ca o expresie care trebuie evaluat.
Expresia care alctuiete programul poate fi reductibil la sub-expresii (eventual
reductibile).
Exemplu: expresia 5*6+8*3 se scrie n sintax funcional (+ (* 5 6) (* 8 3)) sau ((+
((*5)6) ((*8)3)), deoarece expresia iniial se poate reduce la o sum de alte dou
expresii, numite radicali.
Aceast modalitate de notare se numete forma prefixat. Scrierea n formatul
prefixat a pornit de la ideea de a folosi combinarea mai multor expresii. O expresie
poate fi scris prin combinarea mai multor aplicaii (care pot fi diverse funcii sau
operatori). De exemplu dac se consider expresiile E1 i E2, atunci (E1E2) este o
expresie valid care arat c E1 se aplic argumentului E2.
Sintaxa unei expresii pentru forma prefixat este: (Kx)y, adic aplicaia K se
aplic lui x i apoi lui y.
Sintaxa pentru expresii este:
<expresie>::= <constanta> | <variabila> | <variabila>.<expresie>|
<expresie><expresie>
Primele trei reguli sunt folosite pentru a genera funcii, iar a patra regul descrie
aplicarea unei funcii asupra unui argument.
semnific o funcie abstract utilizat de obicei, pentru definirea unei funcii de ctre
utilizator. Variabila sau variabilele care urmeaz funcia reprezint argumentele
funciei, definite ca parametri formali. Expresia dup punct reprezint corpul funciei.
Locul punctului poate fi luat de ctre paranteze. Variabila din argumentul funciei se
numete legat. Celelalte variabile, care apar n corpul funciei, dar nu sunt i argumente
se numesc variabile libere.
Exemple:
1. funcia cu un singur argument f(x)=x+5 poate fi reprezentat ca x.x+5 (sau
varianta echivalent y.y+5 n care s-a nlocuit numele argumentului formal).
n forma prefixat funcia de mai sus se scrie astfel: x.+ x 5. Funcia f(2) se
scrie prin urmtoarele expresii echivalente ( x.x+5)2 sau ( x.x 2)( x.x+5)
sau 2+5
2. funcia f(x)=x+z se scrie n sintaxa calculului lambda astfel ( x. x + z) sau n
forma prefixat ( x. + x z). Variabila x este legat, iar variabila z este liber.
3. funcia f(x,y)=x+y se scrie n sintaxa calculului lambda astfel ( x. y. x + y)
sau n forma prefixat ( x. y. + x y). Variabilele x i y sunt legate. Pentru a
scrie f(2,3)= 2+3 se pot utiliza expresiile echivalente: ( x. y. x + y) 2 3 sau
( x. x + 3) 2
Nu toate expresiile pot fi scrise asemntor cu exemplele de mai sus. Astfel, expresiile
( x.x x) ( x.x x) sau ( x.x x x) ( x.x x x)
sunt dificil de calculat cnd se aplic prima funcie la argumentul su. n astfel de
cazuri, se plic logica combinaional, n care expresia ( x.x x) se numete combinator
, iar (( x.x x) ( x.x x)) este combinator .
35
3.2 Semantica operaional
n funcia ( x. + x y), variabila x este legat de x, iar y este o variabil liber a
crei valoare trebuie cunoscut nainte de apelul funciei.
Exist mai multe reguli care specific gradul de legare al unei variabile ntr-o expresie:
x este liber n expresia x;
x este liber n y.E, dac x i y sunt variabile diferite i dac x este liber n
expresia E;
x este liber n (E F) dac x este liber i n expresia E i n expresia F.
n calculul lambda sunt o serie de operaii de echivalen care se pot realiza asupra
expresiilor:
Alpha conversie realizeaz redenumirea unei variabile legate. Astfel, n
expresia x.E se poate scrie y.E[x|y] unde x este o variabil legat n expresia
labda E. Fiecare apariie a variabilei x n E poate fi nlocuit cu y, dac y nu este
variabil liber n E i nu este legat prin n expresia E. Astfel, prin alpha-
conversie se definete o relaie de echivalen.
Exemple: x.x se poate converti n y.y; expresia x.( x.x)x poate fi
convertit n y.( x.x)y.
Beta conversie prin reducie dndu-se o expresie ( x.A)B se nlocuiesc toate
apariiile lui x n A prin B. Sintaxa este: ( x.E)M este echivalent cu E[x|M]
dac toate apariiile libere n M rmn libere i n E[x|M].
Exemple: ( x. + x 1) 4 este echivalent cu (+ 4 1); ( x.3)5 se reduce la 3.
Eta conversie exprim ideea de extensibilitate n care, dou funcii sunt
echivalente dac i numai dac dau acelai rezultat pentru toate argumentele.
Astfel, considerndu-se funcia F n care apare variabila legat x, expresia
( x.F x) se poate scrie ca F. Dou funcii F i G sunt extensional echivalente,
dac F a ==G a pentru orice expresie lambda a. Dac se consider a ca fiind
variabila legat x n F atunci F x==G x care este echivalent cu x.F x==x.G x,
astfel c F a fost eta convertit prin G.
Exemplu: ( x. + 1 x) este echivalent cu (+ 1).
funcii recursive ntr-o funcie Y se caut punctul fix H astfel nct expresia
(Y H) s poat fi calculat ca H (Y H).
Scopul conversiilor n calculul lambda este de a transforma expresia n forma normal,
care nu conine alte sub-expresii care pot fi reduse astfel: x1 x2...xn . v E1...Em, unde
v este o variabil nelegat.
Funciile exprimate prin calculul lambda pot fi privite din dou puncte de vedere:
Dinamic sau operaional funciile sunt o suit de operaii;
Static sau denotaional funciile sunt considerate o mulime finit de
asociaii ntre argumente i valorile corespunztoare.
Expresiile din calculul lambda sunt reprezentate intern n limbajele de programare
cu ajutorul arborilor.
3.2.1 Reprezentri aritmetice n calculul lambda
n calculul lambda exist mai multe posibiliti de a defini numere naturale, dar modelul
cel mai des utilizat este cu ajutorul ntregilor Church astfel:
0=f. x.x
36
1=f. x.fx
2=f. x.f(fx)
3=f. x.f(f(fx))
Astfel, numrul n se reprezint printr-o funcie care are ca argument o funcie f i care
returneaz puterea a n-a lui f.
Se definesc operaiile aritmetice de baz astfel:
PLUS m n = m. n. f. x. m f (n f x) =m+n
PLUS 1 n= n. f. x. f (n f x) =n+1
MULT m n = m. n. f. x. m (n f) =m*n
PRED n 1 = n. f. x. n ( g. h.h(g f))( u.x)( u.u) =n-1
Exemplu:
PLUS 1 2 = 1. 2. f. x.1 f (2 f x) =f. x.f(f(f x)) =3
Deoarece 1 i 2 nu sunt considerate funcii, deci nu sunt luate n considerare, iar (2 f
x) nseamn de dou ori apelul lui f asupra lui x.
3.2.2 Reprezentri ale logicii predicatelor n calculul lambda
Pentru a defini valorile TRUE i FALSE se folosete modelul Church astfel:
TRUE= u. v.u
FALSE= u. v.v
Predicatele sunt considerate funcii care ntorc valori booleene. Un predicat des utilizat
este ISZERO care returneaz True dac i numai dac argumentul su este zero:
ISZERO=n.n( x.FALSE)TRUE
Acest predicat permite definirea structurii condiionale if-then-else.
3.2.3 Arbori cu sintax abstract
n toate implementrile bazate pe reducerea la un graf, expresia iniial trebuie
reprezentat n main printr-un arbore cu sintax abstract.
n aceti arbori, fiecare nod conine un operator sau o funcie, care are ca operanzi
valorile sub-expresiilor din nodurile-fii; frunzele conin literali, variabile, valorile
constantelor, funciile predefinite. Ca rdcin are valoarea expresiei.
Aplicarea unei funcii f la un argument x este reprezentat astfel:
@ este un tag, o marc, pentru a face referire la o aplicaie.
La modul general o lambda expresie se reprezint prin arborele:
@
f x
@
f x
x
corp
37
Exemplu: expresiile (+ 4 2) i (+ 3 (* 2 8)) se reprezint prin urmtorii arbori cu sintax
abstract:
Prin procesul de reducie se realizeaz transformri succesive asupra arborilor cu
sintax abstract. Astfel, arborele devine un graf orientat aciclic.
n cod main, fiecare nod poate fi reprezentat ntr-o celul de memorie care conine:
Marc care memoreaz tipul de date (aplicaie, numr, operator predefinit,
lambda abstracie, list de celule, etc.).
Cel puin dou cmpuri numrul de cmpuri difer n funcie de implementare.
Cmpurile pot memora adresa unei alte celule (pointeaz) sau valori atomice
(date).
Tip de nod Nod abstract Celul concret
Aplicaie
Lambda abstracie
Lista (x y)
Numr 45
Funcie predefinit +
Exemplu: expresia (+ 4 2) se reprezint astfel: cu specificare tipului de date de ctre
programator sau fr specificarea explicit a tipului de date:
E
x
lambda
marc cmp 1 cmp 2
@
+
2
@
4
@
+
2
@
3
@
@
8
*
@
f x
x
E
:
x y
@
f x
:
x y
N 45
P +
38
Unde @ reprezint aplicaia
P este o funcie predefinit
N este un numr
Observaie: unele limbaje funcionale sunt polimorfe (nu se specific tipul de obiecte de
ctre programator) i corespondena cu un anumit tip de date se efectueaz la compilare
(static). n acest caz nu sunt necesare mrcile celulelor pentru a distinge obiectele sistem
(nodurile, operatorii i funciile predefinite, lambda abstraciile) sau obiecte de tipuri
diferite construite cu constructori diferii. n consecin, numrul de mrci nu este mare
i pot fi codificate pe un numr mic de bii (de exemplu pe 8 bii). Alte limbaje
funcionale au atribuire dinamic de tipuri de date (de exemplu la execuie) n care
fiecare operator predefinit verific tipul argumentelor sale nainte de execuie. Aceste
limbaje au, de obicei, un numr fix de tipuri de date.
@
@
N 2
N 4
P +
@
@ + 4
2