Sunteți pe pagina 1din 7

FMI, Info, Anul II, 2017-2018

Programare logică

Seminar 6
Rezoluţie SLD. Sisteme de rescriere.

Teorie pentru S6.1:

• O clauză definită este o formulă de forma:

– P (t1 , . . . , tn ) (formulă atomică), unde P este un simbol de predicat, iar t1 , . . . , tn


termeni
– P1 ∧ . . . ∧ Pn → Q, unde toate Pi , Q sunt formule atomice.

• O regulă din Prolog Q : − P1 , . . . , Pn este o clauză P1 ∧ . . . ∧ Pn → Q, iar un fapt din


Prolog P(t1 , . . . , tn ) este o formulă atomică P (t1 , . . . , tn ).

• O clauză definită P1 ∧ . . . ∧ Pn → Q poate fi gândită ca formula Q ∨ ¬P1 ∨ . . . ∨ ¬Pn .

• Pentru o mulţime de clauze definite T , regula rezolutiei SLD este

¬P1 ∨ · · · ∨ ¬Pi ∨ · · · ∨ ¬Pn


SLD
(¬P1 ∨ · · · ∨ ¬Q1 ∨ · · · ∨ ¬Qm ∨ · · · ∨ ¬Pn )θ

unde Q ∨ ¬Q1 ∨ · · · ∨ ¬Qm este o clauză definită din T (ı̂n care toate variabilele au
fost redenumite) şi θ este c.g.u pentru Pi şi Q.

• Fie T o mulţime de clauze definite şi P1 ∧. . .∧Pm o ţintă, unde Pi sunt formule atomice.
O derivare din T prin rezoluţie SLD este o secvenţă G0 := ¬P1 ∨ . . . ∨ ¬Pm , G1 , . . .,
Gk , . . . ı̂n care Gi+1 se obţine din Gi prin regula SLD. Dacă există un k cu Gk = 
(clauza vidă), atunci derivarea se numeşte SLD-respingere.

Teorema 1 (Completitudinea SLD-rezoluţiei). Sunt echivalente:

(i) există o SLD-respingere a lui P1 ∧ . . . ∧ Pm din T ,

(ii) T  P1 ∧ · · · ∧ Pm .

1
(S6.1) Găsiţi o SLD-respingere pentru următoarele programe Prolog şi ţinte:

(a) 1. r :- p,q. 5. t. ?- w.
2. s :- p,q. 6. q.
3. v :- t,u. 7. u.
4. w :- v,s. 8. p.

(b) 1. q(X,Y) :- q(Y,X), q(Y,f(f(Y))). ?- q(f(Z),a).


2. q(a,f(f(X))).

(c) 1. p(X) :- q(X,f(Y)), r(a). 4. r(X) :- q(X,Y). ?- p(X), q(Y,Z).


2. p(X) :- r(X). 5. r(f(b)).
3. q(X,Y) :- p(Y).

Demonstraţie:
(a)
G0 = ¬w
G1 = ¬v ∨ ¬s (4)
G2 = ¬t ∨ ¬u ∨ ¬s (3)
G3 = ¬u ∨ ¬s (5)
G4 = ¬s (7)
G5 = ¬p ∨ ¬q (2)
G6 = ¬q (8)
G7 = (6)

(b)
G0 = ¬q(f (Z), a)
G1 = ¬q(a, f (Z)) ∨ ¬q(a, f (f (a))) (1 cu θ(X) = f (Z) şi θ(Y ) = a)
G2 = ¬q(a, f (Z)) (2 cu θ(X) = a)
G3 = (2 cu θ(Z) = f (X))

(c)
G0 = ¬p(X) ∨ ¬q(Y, Z)
G1 = ¬r(X1 ) ∨ ¬q(Y, Z) (2 cu θ(X) = X1 )
G2 = ¬q(Y, Z) (5 cu θ(X1 ) = f (b))
G3 = ¬p(Z1 ) (3 cu θ(X) = Y1 şi θ(Y ) = Z1 )
G4 = ¬r(X) (2 cu θ(Z1 ) = X)
G5 = (5 cu θ(X) = f (b))

2
Teorie pentru S6.2:

Fie T o mulţime de clauze definite şi o ţintă G0 = ¬P1 ∨ . . . ∨ ¬Pm . Un arbore SLD este
definit astfel:
• Fiecare nod al arborelui este o ţintă (posibil vidă)

• Rădăcina este G0

• Dacă arborele are un nod Gi , iar Gi+1 se obţine din Gi folosind regula SLD folosind
o clauză Ci ∈ T , atunci nodul Gi are copilul Gi+1 . Muchia dintre Gi şi Gi+1 este
etichetată cu Ci .
Dacă un arbore SLD cu rădăcina G0 are o frunză  (clauza vidă), atunci există o SLD-
respingere a lui G0 din T .
(S6.2) Desenaţi arborele SLD pentru programul Prolog de mai jos şi ţinta ?- p(X,X).
1. p(X,Y) :- q(X,Z), r(Z,Y). 7. s(X) :- t(X,a).
2. p(X,X) :- s(X). 8. s(X) :- t(X,b).
3. q(X,b). 9. s(X) :- t(X,X).
4. q(b,a). 10. t(a,b).
5. q(X,a) :- r(a,X). 11. t(b,a).
6. r(b,a).
Demonstraţie:
¬p(X, X)

1 2

¬q(X, Z), ¬r(Z, X) ¬s(X)

3 4 5 6 7 8 9

¬r(b, X) ¬r(a, b) ¬r(a, X) ¬q(a, b) ¬t(X, a) ¬t(X, b) ¬t(X, X)


(fail) (fail) (fail)
6 3 11 10

   
(X = a) (X = a) (X = b) (X = a)

3
Teorie pentru S6.3:

• Pentru un limbaj de ordinul I L, o regulă de rescriere l → r este formată din doi


termeni l, r ∈ T rmL astfel ı̂ncât l nu este variabilă şi V ar(r) ⊆ V ar(l).

• Un sistem de rescriere (TRS) este o mulţime finită de reguli de rescriere.

• Dacă R este un sistem de rescriere, pentru t, t0 ∈ T rmL definim relaţia t →R t0 astfel:

t →R t0 ⇔ t este c[z ← θs (l)] şi


t0 este c[z ← θs (r)], unde
c context, l → r ∈ R, θ substituţie

• Un termen t este reductibil dacă există un termen t0 astfel ı̂cât t → t0 .

• Un termen t este ı̂n formă normală (ireductibil) dacă nu este reductibil.



• t0 este o formă normală a lui t dacă t → t0 şi t0 este ı̂n formă normală.
∗ ∗
• t1 şi t2 se intâlnesc (t1 ↓ t2 ) dacă există t ∈ T a.ı̂. t1 → t ← t2 .

(S6.3) Fie L un limbaj de ordinul I cu un simbol de constantă 0, un simbol de funcţie s de


aritate 1 şi un simbol de funcţie f de aritate 2. Folosind sistemul de rescriere

R = {f (g(x)) → g(x), g(f (x)) → g(x)},

rescrieţi termenii t1 = f (f (g(f (g(0))))) şi t2 = f (f (0)) până la o formă normală. Caracterizaţi
formele normale ale sistemului R.

Demonstraţie:
Forma normală a lui t1 este g(g(0)), deoarece

t1 = f (f (g(f (g(0))))) →R f (f (g(g(0)))) →R f (g(g(0))) →R g(g(0)),

iar t2 este ı̂n formă normală.


Formele normale pentru sistenul R sunt f (. . . (f (0)) . . .), g(. . . (g(0)) . . .) şi 0.

Teorie pentru S6.4:

• Un sistem de rescriere se numeşte

4
– noetherian: dacă nu există reduceri infinite t0 → t1 → t2 → . . ..
∗ ∗
– confluent: t1 ← t → t2 ⇒ t1 ↓ t2 .
– complet (convergent, canonic): confluent şi noetherian.

• Fie l1 → r1 , l2 → r2 ∈ R astfel ı̂ncât:

(i) V ar(l1 ) ∩ V ar(l2 ) = ∅,


(ii) există t un subtermen al lui l1 care nu este variabilă
(l1 = c[z ← t], unde nrz (c) = 1, t nu este variabilă)
(iii) există θ c.g.u pentru t şi l2 (i.e. θ(t) = θ(l2 )).

Perechea (θ(r1 ), θ(c)[z ← θ(r2 )]) se numeşte pereche critică.

θ(l1 )
R R
θ(r1 ) θ(c)[z ← θ(r2 )]

Teorema 2 (Teorema Perechilor Critice). Dacă R este noetherian, atunci sunt echivalente:

(i) R este confluent,

(ii) t1 ↓R t2 pentru orice pereche critică (t1 , t2 ).

(S6.4) Fie L un limbaj de ordinul I cu două simboluri de funcţie f şi g de aritate 1. Cercetaţi
dacă sistemul de rescriere de mai jos este confluent:

R = {f (f (x)) → g(x)}.

Demonstraţie:
Se observă că R este noetherian, deci putem aplica Teorema Perechilor Critice. Determinăm
perechile critice ale sistemului R. Redenumind variabilele, considerăm l1 → r1 , l2 → r2 ∈ R
ca fiind f (f (x)) → g(x) şi f (f (y)) → g(y), respectiv. Subtermenii lui l1 care nu sunt
variabile sunt f (x) şi f (f (x)). Investigăm fiecare caz:

• t := f (x). Observăm că l1 = c[z ← t] pentru contextul c = f (z). Mai mult, θ(x) = f (y)
este c.g.u. pentru t şi l2 . Obţinem perechea critică P1 = (g(f (y)), f (g(y))).

5
• t := f (f (x)). Observăm că l1 = c[z ← t] pentru contextul c = z. Mai mult, θ(x) = y
este c.g.u. pentru t şi l2 . Obţinem perechea critică P1 = (g(y), g(y)).

Evident g(y) ↓ g(y), dar g(f (y)) 6↓ f (g(y)) deoarece g(f (y)) şi f (g(y)) sunt deja ı̂n formă
normală. Din Teorema Perechilor Critice obţinem că R nu este confluent.

(S6.5) Fie L un limbaj de ordinul I cu trei simboluri de constantă a, b şi c, un simbol de


funcţie g de aritate 1 şi un simbol de funcţie f de aritate 2. Cercetaţi dacă sistemul de
rescriere de mai jos este confluent:

R = {f (x, x) → a, f (x, g(x)) → b, c → g(c)}.

Demonstraţie:
Se observă că R nu se termină:

c →R g(c) →R g(g(c)) →R . . . .

În concluzie nu putem aplica Teorema perechilor critice pentru a stabili confluenţa. Se
observă că:
f (c, c)

a f (c, g(c))

Cum a 6↓ b, sistemul R nu este confluent.

(S6.6) Fie L un limbaj de ordinul I cu trei simboluri de constantă a, b şi c, un simbol de


funcţie g de aritate 1 şi un simbol de funcţie f de aritate 2. Găsiţi perechile critice pentru
sistemul de rescriere:

R = {f (x, x) → a, f (x, g(x)) → b, c → g(c)}.

Demonstraţie:
Printre cazurile posibile, se numără:

6
• Cazul l1 → r1 = f (x, x) → a şi l2 → r2 = f (y, y) → a. Considerăm subtermenii t ai lui
l1 care nu sunt variabile:

– t = f (x, x). Observăm că l1 = c[z ← t] pentru contextul c = z. Mai mult, θ(x) = y
este c.g.u. pentru t şi l2 . Obţinem perechea critică (a, a).

• Cazul l1 → r1 = f (x, x) → a şi l2 → r2 = f (y, g(y)) → b. Considerăm subtermenii t ai


lui l1 care nu sunt variabile:

– t = f (x, x). Observăm că l1 = c[z ← t] pentru contextul c = z. Nu există c.g.u.


pentru t şi l2 .

• Cazul l1 → r1 = f (x, x) → a şi l2 → r2 = c → g(c). Considerăm subtermenii t ai lui l1


care nu sunt variabile:

– t = f (x, x). Observăm că l1 = c[z ← t] pentru contextul c = z. Nu există c.g.u.


pentru t şi l2 .

• Cazul l1 → r1 = f (x, g(x)) → b şi l2 → r2 = f (y, g(y)) → b. Considerăm subtermenii t


ai lui l1 care nu sunt variabile:

– t = g(x). Observăm că l1 = c[z ← t] pentru contextul c = f (x, z). Nu există c.g.u.
pentru t şi l2 .
– t = f (x, g(x)). Observăm că l1 = c[z ← t] pentru contextul c = z. Mai mult,
θ(x) = y este c.g.u. pentru t şi l2 . Obţinem perechea critică (b, b).

• Cazul l1 → r1 = f (x, g(x)) → b şi l2 → r2 = c → g(c). Considerăm subtermenii t ai lui


l1 care nu sunt variabile:

– t = g(x). Observăm că l1 = c[z ← t] pentru contextul c = f (x, z). Nu există c.g.u.
pentru t şi l2 .
– t = f (x, g(x)). Observăm că l1 = c[z ← t] pentru contextul c = z. Nu există c.g.u.
pentru t şi l2 .

• Cazul l1 → r1 = c → g(c) şi l2 → r2 = c → g(c). Considerăm subtermenii t ai lui l1 care


nu sunt variabile:

– t = c. Observăm că l1 = c[z ← t] pentru contextul c = z. Mai mult, orice substituţie


este c.g.u. pentru t şi l2 . Obţinem perechea critică (g(c), g(c)).

În concluzie, perechile critice pentru R sunt (a, a), (b, b) şi (g(c), g(c)).

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