evals/3 — evaluare pe o listă de valuări
Definiți un predicat evals/3 astfel încât, pentru orice formulă X și orice listă de evaluări Es, avem că pentru orice As, evals(X, Es, As) este adevărat atunci când As este lista rezultatelor evaluării lui X în fiecare dintre elementele lui Es.
?- evals(imp(d, b), [[(a, 1), (b, 0), (d, 1)], [(a, 1), (b, 1), (d, 0)]], As).
As = [0, 1]
Hint: recursie simplă pe lista de evaluări. Cazul recursiv apelează
eval/3pe capul listei.
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, R) :- bnon(P, NP), bor(NP, Q, R).
band(P, Q, R) :- bnon(P, NP), bnon(Q, NQ), bor(NP, NQ, NR), bnon(NR, R).
eval(X, L, R) :- val(X, L, R).
eval(non(P), L, R) :- eval(P, L, RP), bnon(RP, R).
eval(imp(P, Q), L, R) :- eval(P, L, RP), eval(Q, L, RQ), bimp(RP, RQ, R).
eval(and(P, Q), L, R) :- eval(P, L, RP), eval(Q, L, RQ), band(RP, RQ, R).
eval(or(P, Q), L, R) :- eval(P, L, RP), eval(Q, L, RQ), bor(RP, RQ, R).
evals(_, [], []) :- !.
evals(P, [H | T], [HR | TR]) :-
eval(P, H, HR),
evals(P, T, TR).
?-
Tastează o interogare (ex. father_of(sandra, X).) și apasă Enter — sau apasă pe un caz de test de mai jos.
Cazuri de test (1 — apasă pe unul ca să îl rulezi, sau Verifică pentru toate)
?
evals(imp(d, b), [[(a, 1), (b, 0), (d, 1)], [(a, 1), (b, 1), (d, 0)]], As).
așteptat: As = [0,1]