eval/3 — evaluarea unei formule într-o valuare
Definiți un predicat eval/3 astfel încât pentru orice formulă X și orice evaluare E, avem că pentru orice A, eval(X, E, A) este adevărat exact atunci când A este E⁺(X) (extensia valuării la formule).
?- eval(imp(b, d), [(a, 1), (b, 0), (d, 1)], A).
A = 1
?- eval(imp(d, b), [(a, 1), (b, 0), (d, 1)], A).
A = 0
Hint: cinci cazuri — atomul (folosești
val/3),non(P)(apelezibnon),and/or/imp(apelezi predicatul corespunzătorband/bor/bimpdupă evaluarea subformulelor).
Te-ai blocat?
editor
soluție
val(X, [(X, E) | _], E) :- !.
val(X, [_ | T], E) :- val(X, T, E).
bnon(0, 1) :- !.
bnon(1, 0) :- !.
bor(1, _, 1) :- !.
bor(_, 1, 1) :- !.
bor(0, 0, 0) :- !.
bimp(P, Q, Res) :- bnon(P, NonP), bor(NonP, Q, Res).
band(P, Q, Res) :-
bnon(P, NonP), bnon(Q, NonQ),
bor(NonP, NonQ, NonRes), bnon(NonRes, Res).
eval(X, List, Res) :- val(X, List, Res).
eval(non(P), List, Res) :-
eval(P, List, ResP),
bnon(ResP, Res).
eval(imp(P, Q), List, Res) :-
eval(P, List, ResP),
eval(Q, List, ResQ),
bimp(ResP, ResQ, Res).
eval(and(P, Q), List, Res) :-
eval(P, List, ResP),
eval(Q, List, ResQ),
band(ResP, ResQ, Res).
eval(or(P, Q), List, Res) :-
eval(P, List, ResP),
eval(Q, List, ResQ),
bor(ResP, ResQ, Res).
?-
Tastează o interogare (ex. father_of(sandra, X).) și apasă Enter — sau apasă pe un caz de test de mai jos.
Cazuri de test (3 — apasă pe unul ca să îl rulezi, sau Verifică pentru toate)
?
eval(imp(b, d), [(a, 1), (b, 0), (d, 1)], A).
așteptat: A = 1
?
eval(imp(d, b), [(a, 1), (b, 0), (d, 1)], A).
așteptat: A = 0
?
eval(and(a, non(b)), [(a, 1), (b, 0)], A).
așteptat: A = 1