Sunteți pe pagina 1din 45

Curs 4

2017-2018 Programare Logică


1 / 46
Logica de ordinul I (recap.)

3 / 46
Logica de ordinul I

Sloganul programării logice:


Un program este o teorie într-o logică formală,
iar execuţia sa este o deducţie în teorie.

Programarea logică foloseşte un fragment din logica de ordinul I


(calculul cu predicate) ca limbaj de reprezentare.

În această reprezentare, programele sunt teorii logice – mulţimi de


formule din calculul cu predicate.

Reamintim că problema constă în căutarea unei derivări a unei


întrebări (formule) dintr-un program (teorie).

4 / 46
Limbaje de ordinul I

Un limbaj L de ordinul I este format din:


o mulţime numărabilă de variabile V = {xn | n ∈ N}
conectorii ¬, →, ∧, ∨
paranteze
cuantificatorul universal ∀ şi cuantificatorul existenţial ∃
o mulţime R de simboluri de relaţii
o mulţime F de simboluri de funcţii
o mulţime C de simboluri de constante
o funcţie aritate ar : F ∪ R → N∗

5 / 46
Logica de ordinul I

L este unic determinat de τ = (R, F, C, ari)


τ se numeşte signatura (vocabularul, alfabetul) lui L

Exemplu
Un limbaj L de ordinul I în care:
R = {P, R}
F = {f}
C = {c}
ari(P) = 1, ari(R) = 2, ari(f) = 2

6 / 46
Sintaxa Prolog

Atenţie!
În sintaxa Prolog
termenii compuşi sunt predicate: father(eddard, jon_snow)
operatorii sunt funcţii: +, *, mod

Sintaxa Prolog nu face diferenţă între simboluri de funcţii şi


simboluri de predicate!

Dar este important când ne uităm la teoria corespunzătoare


programului în logică să facem acestă distincţie.

7 / 46
Logica de ordinul I

Termenii lui L sunt definiţi inductiv astfel:


orice variabilă este un termen;
orice simbol de constantă este un termen;
dacă f ∈ F, ar(f) = n şi t1 , . . . , tn sunt termeni, atunci f(t1 , . . . , tn )
este termen.

Notăm cu TrmL mulţimea termenilor lui L.

Exemplu

c, x1 , f(x1 , c), f(f(x2 , x2 ), c)

8 / 46
Logica de ordinul I

Formulele atomice ale lui L sunt definite astfel:


dacă R ∈ R, ar(R) = n şi t1 , . . . , tn sunt termeni, atunci
R(t1 , . . . , tn ) este formulă atomică.

Exemplu

P(f(x1 , c)), R(c, x3 )

9 / 46
Logica de ordinul I

Formulele lui L sunt definite astfel:


orice formulă atomică este o formulă
dacă φ este o formulă, atunci ¬φ este o formulă
dacă φ şi ψ sunt formule, atunci φ ∨ ψ, φ ∧ ψ, φ → ψ sunt formule
dacă φ este o formulă şi x este o variabilă, atunci ∀x φ, ∃x φ sunt
formule

Exemplu

P(f(x1 , c)), P(x1 ) ∨ P(c), ∀x1 P(x1 ), ∀x2 R(x2 , x1 )

10 / 46
Logica de ordinul I

Exemplu
Fie limbajul L1 cu R = {<}, F = {s, +}, C = {0} şi
ari(s) = 1, ari(+) = ari(<) = 2.
Exemple de termeni:
0, x, s(0), s(s(0)), s(x), s(s(x)), . . .,
+(0, 0), +(s(s(0)), +(0, s(0))), +(x, s(0)), +(x, s(x)), . . .,
Exemple de formule atomice:
< (0, 0), < (x, 0), < (s(s(x)), s(0)), . . .
Exemple de formule:
∀x ∀y < (x, +(x, y))
∀x < (x, s(x))

11 / 46
Semantica

Pentru a stabili dacă o formulă este adevărată, avem nevoie de o


interpretare într-o structură!

12 / 46
Modelarea unei lumi

Presupunem că putem descrie o lume prin:


o mulţime de obiecte
funcţii
relaţii
unde
funcţiile duc obiecte în obiecte
relaţiile cu n argumente descriu proprietăţile a n obiecte

13 / 46
Modelarea unei lumi

Exemplu Example U
NI VER
S

IT
TH

Y
O F

H
G
E

R
Să considerăm o lume în care avem cutii:
D I U
N B

Look at a blocks world:

d
c
a b

base

This can be described using objects O = {base, a, b, c, d, e}.


PutemWedescrie
can say lumea folosind
which object is on obiecte
which other one with a 2-place
relation, on:
O = {base, a, b, c, d, e}.
on = {(e, c), (c, a), (e, d), (d, b), (b, base), (a, base)}.
Putem descrie ce obiect se află deasupra altui obiect folosind un
predicat binar on:
Alan Smaill Logic Programming Nov 2. 2015 11/32

on = {(e, c), (c, a), (e, d), (d, b), (a, base), (b, base)}

Sursa exemplului: https://www.inf.ed.ac.uk/teaching/courses/lp/ 14 / 46


Structură

Definiţie
O structură este de forma A = (A, FA , RA , CA ), unde
A este o mulţime nevidă
FA = {fA | f ∈ F} este o mulţime de operaţii pe A;
dacă f are aritatea n, atunci fA : An → A.
RA = {RA | R ∈ R} este o mulţime de relaţii pe A;
dacă R are aritatea n, atunci RA ⊆ An .
CA = {cA ∈ A | c ∈ C}.

A se numeşte universul structurii A.


fA (respectiv RA , cA ) se numeşte interpretarea lui f (respectiv R, c)
in A.

15 / 46
Structură

Exemplu
Lumea în care avem cutii.
Limbajul L
R = {on}
F=∅
C=∅
ari(on) = 2

O structură A:
A = {base, a, b, c, d, e}
FA = ∅.
CA = ∅.
RA = {onA }, unde
onA = {(e, c), (c, a), (e, d), (d, b), (a, base), (b, base)} ⊆ A2 .

16 / 46
Structură

Exemplu
L1 : R = {<}, F = {s, +}, C = {0} cu ari(s) = 1, ari(+) = ari(<) = 2.

N = (N, sN , +N , <N , 0N ) unde

sN : N → N, sN (n) := n + 1,

+N : N × N → N, +N (n, m) := n + m,

<N ⊆ N × N, <N = {(n, m) | n < m},

0N := 0

17 / 46
Interpretare

Fie L un limbaj de ordinul I şi A o (L-)structură.

Definiţie
O interpretare a variabilelor lui L în A este o funcţie

I : V → A.

Definiţie
Inductiv, definim interpretarea termenului t în A sub I (tA
I ) prin:
dacă t = xi ∈ V, atunci tA
I := I(xi )
dacă t = c ∈ C, atunci tA
I := c
A

dacă t = f(t1 , . . . , tn ), atunci tA A A A


I := f ((t1 )I , . . . , (tn )I )

18 / 46
Interpretare

Definim inductiv faptul că o formulă este adevărată în A sub


interpretarea I astfel:

A, I |= P(t1 , . . . , tn ) dacă PA ((t1 )A A


I , . . . , (tn )I )
A, I |= ¬φ dacă A, I ̸|= φ
A, I |= φ ∨ ψ dacă A, I |= φ sau A, I |= ψ
A, I |= φ ∧ ψ dacă A, I |= φ şi A, I |= ψ
A, I |= φ → ψ dacă A, I ̸|= φ sau A, I |= ψ
A, I |= ∀x φ dacă pentru orice a ∈ A avem A, Ixi ←a |= φ
A, I |= ∃x φ dacă există a ∈ A astfel încât A, Ixi ←a |= φ
{
I(y) dacă y ̸= x
unde pentru orice a ∈ A, Ix←a (y) =
a dacă y = x

19 / 46
Interpretare

O formulă φ este adevărată într-o structură A, notat A |= φ,


dacă este adevărată în A sub orice interpretare.
Spunem că A este model al lui φ.

O formulă φ este adevărată în logica de ordinul I, notat |= φ,


dacă este adevărată în orice structură.

20 / 46
Model

Exemplu
Fie limbajul L cu F = {s}, R = {P}, C = {0} cu ari(s) = ari(P) = 1.
Fie structura N = (N, sN , PN , 0N ) unde 0N := 1 şi
sN : N → N, sN (n) := n2
PN ⊂ N, PN = {n | n este impar }
Demonstraţi că N |= ∀x (P(x) → P(s(x))).
Fie I : V → N o interpretare. Observăm că
N , I |= P(x) dacă PN (I(x)), adică N , I |= P(x) dacă I(x) este impar.
N , I |= ∀x (P(x) → P(s(x))) dacă
N , Ix←n |= P(x) → P(s(x)) oricare n ∈ N
N , Ix←n ̸|= P(x) sau N , Ix←n |= P(s(x)) oricare n ∈ N
Ix←n (x) nu este impar sau Ix←n (s(x)) este impar oricare n ∈ N
n este par sau n2 este impar oricare n ∈ N
ceea ce este întodeauna adevărat.
21 / 46
Consecinţă logică

Definiţie
O formulă φ este o consecinţă logică a formulelor φ1 , . . . , φn , notat
φ1 , . . . , φn |= φ,

dacă pentru orice structură A


dacă A |= φ1 şi . . . şi A |= φn , atunci A |= φ

Problemă semidecidabilă!
Nu există algoritm care să decidă mereu dacă o formula este sau nu
consecinţă logică a altei formule în logica de ordinul I!

22 / 46
Logica clauzelor definite

Alegem un fragment al logicii de ordinul I astfel:

Renunţăm la cuantificatori (dar păstrăm variabilele)

Renunţăm la ¬, ∨ (dar păstrăm ∧, →)


Singurele formule admise sunt de forma:
P(t1 , . . . , tn ), adică formule atomice
α1 ∧ . . . ∧ αn → α,
unde α1 , . . . , αn , α sunt formule atomice.

Astfel de formule se numesc clauze definite (sau clauze Horn).


Acest fragment al logicii de ordinul I se numeşte logica clauzelor definite
(sau logica clauzelor Horn).

23 / 46
Programare logica

Presupunem că putem reprezenta cunoştinţele ca o mulţime de


clauze definite ∆ şi suntem interesaţi să aflăm răspunsul la o
întrebare de forma α1 ∧ . . . ∧ αn , unde toate αi sunt formule atomice.

Adică vrem să aflăm dacă


∆ |= α1 ∧ . . . ∧ αn

Variabilele din ∆ sunt considerate ca fiind cuantificate universal!

Variabilele din α1 , . . . , αn sunt considerate ca fiind cuantificate


existenţial!

24 / 46
Logica clauzelor definite

Exemplu
Fie următoarele clauze definite:
father(jon, ken).
father(ken, liz).
father(X, Y) → ancestor(X, Y)
dauther(X, Y) → ancestor(Y, X)
ancestor(X, Y) ∧ ancestor(Y, Z) → ancestor(X, Z)
Putem întreba:
ancestor(jon, liz)
ancestor(Q, ken) adică ∃Q ancestor(Q, ken)

Răspunsul la întrebare este dat prin unificare!

25 / 46
Substituţii şi unificare

26 / 46
Substituţii

Definiţie
O subtituţie σ este o funcţie (parţială) de la variabile la termeni, adică

σ : V → TrmL

Exemplu
În notaţia uzuală, σ = {x/a, y/g(w), z/b}.

27 / 46
Substituţii

Substituţiile sunt o modalitate de a înlocui variabilele cu alţi


termeni.

Substituţiile se aplică simultan pe toate variabilele.

Exemplu
substituţia σ = {x/a, y/g(w), z/b}
σ(P(x, g(x), y)) = P(a, g(a), g(w))

substituţia ϕ = {x/y, y/g(a)}


ϕ(f(x)) = f(y)
ϕ(f(x)) ̸= f(g(a))

28 / 46
Substituţii

Două substituţii σ1 şi σ2 se pot compune

σ1 ; σ2

(aplicăm întâi σ1 , apoi σ2 ).

Exemplu
t = P(u, v, x, y, z)
τ = {x/f(y), y/f(a), z/u}
µ = {y/g(a), u/z, v/f(f(a))}

(τ ; µ)(t) = µ(τ (t)) = µ(P(u, v, f(y), f(a), u)) =


= P(z, f(f(a)), f(g(a)), f(a), z)

(µ; τ )(t) = τ (µ(t)) = τ (P(z, f(f(a)), x, g(a), z))


= P(u, f(f(a)), f(y), g(a), u)

29 / 46
Unificare

Doi termeni t1 şi t2 se unifică dacă există o substituţie θ astfel încât


θ(t1 ) = θ(t2 ).
În acest caz, θ se numesţe unificatorul termenilor t1 şi t2 .

În programarea logică, unificatorii sunt ingredientele de bază în


execuţia unui program.

Un unificator ν pentru t1 şi t2 este un cel mai general unificator


(cgu,mgu) dacă pentru orice alt unificator ν ′ pentru t1 şi t2 , există o
substituţie µ astfel încât
ν ′ = ν; µ.

30 / 46
Unificator

Exemplu
t = x + (y ⋆ y) = +(x, ⋆(y, y))
t′ = x + (y ⋆ x) = +(x, ⋆(y, x))
ν = {x/y, y/y}
ν(t) = y + (y ⋆ y)
ν(t′ ) = y + (y ⋆ y)
ν este cgu

ν ′ = {x/0, y/0}
ν ′ (t) = 0 + (0 ⋆ 0)
ν ′ (t′ ) = 0 + (0 ⋆ 0)
ν ′ = ν; {y/0}
ν ′ este unificator, dar nu este gcu

31 / 46
Algoritmul de unificare

Pentru o mulţime finită de termeni {t1 , . . . , tn }, n ≥ 2, algoritmul de


unificare stabileşte dacă există un cgu.

Există algoritmi mai eficienţi, dar îl alegem pe acesta pentru


simplitatea sa.
Algoritmul lucrează cu două liste:
Lista soluţie: S
Lista de rezolvat: R

Iniţial:
Lista soluţie: S = ∅
· ·
Lista de rezolvat: R = {t1 = t2 , . . . , tn−1 = tn }

·
= este un simbol nou care ne ajută sa formăm perechi de termeni
(ecuaţii).

32 / 46
Algoritmul de unificare

Algoritmul constă în aplicarea regulilor de mai jos:


SCOATE
·
orice ecuaţie de forma t = t din R este eliminată.

DESCOMPUNE
·
orice ecuaţie de forma f(t1 , . . . , tn ) = f(t′1 , . . . , t′n ) din R este
· ·
înlocuită cu ecuaţiile t1 = t′1 , . . . , tn = t′n .

REZOLVĂ
· ·
orice ecuaţie de forma x = t sau t = x din R, unde variabila x nu
·
apare în termenul t, este mutată sub forma x = t în S.
În toate celelalte ecuaţii (din R şi S), x este înlocuit cu t.

33 / 46
Algoritmul de unificare

Algoritmul se termină normal dacă R = ∅. În acest caz, S dă cgu.

Algoritmul este oprit cu concluzia inexistenţei unui cgu dacă:


1 În R există o ecuaţie de forma
·
f(t1 , . . . , tn ) = g(t′1 , . . . , t′k ) cu f ̸= g.
· ·
2 În R există o ecuaţie de forma x = t sau t = x şi variabila x apare în
termenul t.

34 / 46
Algoritmul de unificare - schemă

Lista soluţie Lista de rezolvat


S R
· ·
Iniţial ∅ t1 = t′1 , . . . , tn = t′n
·
SCOATE S R′ , t = t
S R′
·
DESCOMPUNE S R′ , f(t1 , . . . , tn ) = f(t′1 , . . . , t′n )
· ·
S R′ , t1 = t′1 , . . . tn = t′n
· ·
REZOLVĂ S R′ , x = t sau t = x, x nu apare în t
·
x = t, S[x/t] R′ [x/t]
Final S ∅

S[x/t]: în toate ecuaţiile din S, x este înlocuit cu t

35 / 46
Exemplu

Exemplu
· ·
Ecuaţiile {g(y) = x, f(x, h(x), y) = f(g(z), w, z)} au gcu?

S R
· ·
∅ g(y) = x, f(x, h(x), y) = f(g(z), w, z) REZOLVĂ
· ·
x = g(y) f(g(y), h(g(y)), y) = f(g(z), w, z) DESCOMPUNE
· · · ·
x = g(y) g(y) = g(z), h(g(y)) = w, y = z REZOLVĂ
· · ·
w = h(g(y)), g(y) = g(z), y = z REZOLVĂ
·
x = g(y)
· · ·
y = z, x = g(z), g(z) = g(z) SCOATE
·
w = h(g(z))
· ·
y = z, x = g(z), ∅
·
w = h(g(z))

ν = {y/z, x/g(z), w/h(g(z))} este cgu.

36 / 46
Exemplu

Exemplu
· ·
Ecuaţiile {g(y) = x, f(x, h(y), y) = f(g(z), b, z)} au gcu?

S R
· ·
∅ g(y) = x, f(x, h(y), y) = f(g(z), b, z) REZOLVĂ
· ·
x = g(y) f(g(y), h(y), y) = f(g(z), b, z) DESCOMPUNE
· · · ·
x = g(y) g(y) = g(z), h(y) = b, y = z - EŞEC -

h şi b sunt simboluri de operaţii diferite!


Nu există unificator pentru ecuaţiile din U.

37 / 46
Exemplu

Exemplu
· ·
Ecuaţiile {g(y) = x, f(x, h(x), y) = f(y, w, z)} au gcu?

S R
· ·
∅ g(y) = x, f(x, h(x), y) = f(y, w, z) REZOLVĂ
· ·
x = g(y) f(g(y), h(g(y)), y) = f(y, w, z) DESCOMPUNE
· · · ·
x = g(y) g(y) = y, h(g(y)) = w, y = z - EŞEC -

·
În ecuaţia g(y) = y, variabila y apare în termenul g(y).
Nu există unificator pentru ecuaţiile din U.

38 / 46
Terminarea algoritmului

Propoziţie
Algoritmul de unificare se termină.

Demonstraţie
Notăm cu
N1 : numărul variabilelor care apar în R
N2 : numărul apariţiilor simbolurilor care apar în R
Este suficient să arătăm că perechea (N1 , N2 ) descreşte strict în
ordine lexicografică la execuţia unui pas al algoritmului:
dacă la execuţia unui pas (N1 , N2 ) se schimbă în (N′1 , N′2 ), atunci
(N1 , N2 ) ≥lex (N′1 , N′2 )

39 / 46
Demonstraţie (cont.)
Fiecare regulă a algoritmului modifică N1 şi N2 astfel:
N1 N2
SCOATE ≥ >
DESCOMPUNE = >
REZOLVĂ >

N1 : numărul variabilelor care apar în R


N2 : numărul apariţiilor simbolurilor care apar în R

40 / 46
Corectitudinea algoritmului

Lema 1
Mulţimea unificatorilor pentru reuniunea ecuaţiilor din R şi S nu se
modifică prin aplicarea celor trei reguli ale algoritmului de unificare.

Demonstraţie
Analizăm fiecare regulă:
SCOATE: evident
DESCOMPUNE: Trebuie să arătăm că
ν unificator pt. ⇔ ν unificator pt.
· ·
f(t1 , . . . , tn ) = f(t′1 , . . . , t′n ) ti = t′i , or. i = 1, . . . , n.
·
ν unif. pt. f(t1 , . . . , tn ) = f(t′1 , . . . , t′n )
⇔ ν(f(t1 , . . . , tn )) = ν(f(t′1 , . . . , t′n ))
⇔ f(ν(t1 ), . . . , ν(tn )) = f(ν(t′1 ), . . . , ν(t′n ))
⇔ ν(ti ) = ν(t′i ), or. i = 1, . . . , n
·
⇔ ν unificator pt. ti = t′i , or. i = 1, . . . , n
41 / 46
Demonstraţie (cont.)
REZOLVĂ:
Se observă că or. unificator ν pt. reuniunea ecuaţiile din R şi S, atât
înainte cât şi după aplicarea regulii REZOLVĂ, trebuie să satisfacă:
ν(x) = ν(t).
·
Pt. or. unificator µ pt. x = t observăm că:
(x ← t); µ = µ
unde (x ← t)(x) = t şi (x ← t)(y) = y pentru orice y ̸= x ∈ V.
((x ← t); µ)(x) = µ(t) = µ(x)
((x ← t); µ)(y) = µ(y), or. y ̸= x
Deci,
µ este un unificator pt. ec. din R şi S înainte de REZOLVĂ

µ este un unificator pt. ec. din R şi S după REZOLVĂ


42 / 46
Corectitudinea algoritmului

Lema 2
Variabilele care apar în partea stângă a ecuaţiilor din S sunt distincte
două câte două şi nu mai apar în altă parte în S şi R.

Demonstraţie
Exerciţiu!

43 / 46
Corectitudinea algoritmului

Pres. că algoritmul de unificare se termină cu R = ∅.


·
Fie xi = ti , i = 1, . . . , k, ecuaţiile din S.
Definim substituţia:
ν(xi ) = ti , or. i = 1, . . . , k.
ν este corect definită (vezi Lema 2).
Cum variabilele xi nu apar în termenii ti , deducem că
ν(ti ) = ti = ν(xi ), or. i = 1, . . . , k.
Deci ν este unificator pentru U (vezi Lema 1).

44 / 46
Corectitudinea algoritmului

Lema 3
ν definit mai sus cf. algoritmului de unificare este cgu pentru U.

Demonstraţie
Exerciţiu! 

45 / 46
Pe săptămâna viitoare!

46 / 46

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