Exerciții de unificare
Fie limbajul de ordinul I L = (F, R, C, ari) unde F := {h, g, f, ∗, +, p}, C := {a, b, c}, iar x, y, z, u, v ∈ Var, descrise astfel:
x, y, z, u, v ∈ Vara, b, c ∈ C(constantele pot fi privite ca funcții de aritate 0)h, g ∈ F₁f, ∗, + ∈ F₂p ∈ F₃
Decideți dacă există unificatori pentru următorii termeni și verificați că Prolog răspunde conform rezultatului pe care l-ați obținut. În Prolog, folosim predicatul unify_with_occurs_check/2.
Recomandare. Definiți un alias mai scurt:
eq(X, Y) :- unify_with_occurs_check(X, Y).
Exemple:
?- eq(h(a, X), h(Y, b)).
X = b, Y = a
?- eq(A, f(A)).
false
De ce false în al doilea caz? Occurs check — A apare în f(A).
Continuați cu exercițiile:
f(h(a), g(x))cuf(y, y)p(a, x, g(x))cup(a, y, y)p(x, y, z)cup(u, f(v, v), u)p(x, f(x, x))cuf(g(y), f(z, g(a)))x + (y * y)cu(y * y) + zf(g(x), x)cuf(y, y)p(a, u, h(x))cup(y, f(y, z), z)
Atenție la specificația de limbaj! Variabilele din limbaj sunt și cele din Prolog, deci se scriu cu Majusculă. În exemplele de mai sus, variabilele
x, y, z, u, vdevin în PrologX, Y, Z, U, V.
Te-ai blocat?
editor
soluție
% "Soluția" constă în a apela eq și a compara cu răspunsul algoritmului de unificare
% aplicat pe hârtie.
eq(X, Y) :- unify_with_occurs_check(X, Y).
% Exemple rezolvate:
%
% 1. f(h(a), g(x)) cu f(y, y)
% ?- eq(f(h(a), g(X)), f(Y, Y)).
% false — ar trebui y = h(a) și y = g(X), dar h/1 ≠ g/1
%
% 2. p(a, x, g(x)) cu p(a, y, y)
% ?- eq(p(a, X, g(X)), p(a, Y, Y)).
% false — Y = X și Y = g(X) → X = g(X), occurs check
%
% 3. p(x, y, z) cu p(u, f(v, v), u)
% ?- eq(p(X, Y, Z), p(U, f(V, V), U)).
% X = U, Y = f(V, V), Z = U
%
% 4. p(x, f(x, x)) cu f(g(y), f(z, g(a)))
% ?- eq(p(X, f(X, X)), f(g(Y), f(Z, g(a)))).
% false — p/2 ≠ f/2
%
% 5. x + (y * y) cu (y * y) + z
% ?- eq(X + (Y * Y), (Y * Y) + Z).
% X = Y*Y, Z = Y*Y
%
% 6. f(g(x), x) cu f(y, y)
% ?- eq(f(g(X), X), f(Y, Y)).
% false — Y = g(X) și Y = X → X = g(X), occurs check
%
% 7. p(a, u, h(x)) cu p(y, f(y, z), z)
% ?- eq(p(a, U, h(X)), p(Y, f(Y, Z), Z)).
% Y = a, U = f(a, h(X)), Z = h(X)
?-
Tastează o interogare (ex. father_of(sandra, X).) și apasă Enter — sau apasă pe un caz de test de mai jos.
Cazuri de test (4 — apasă pe unul ca să îl rulezi, sau Verifică pentru toate)
?
eq(h(a, X), h(Y, b)).
așteptat: X = b, Y = a
?
eq(A, f(A)).
așteptat: false
?
eq(f(g(A), h(B, C, v)), f(g(u), h(g(w), w, g(A)))).
așteptat: false
?
eq(f(g(A), h(B, C, D)), f(g(u), h(g(w), w, g(A)))).
așteptat: A = u, B = g(w), C = w, D = g(u)