vars/2 — mulțimea variabilelor unei formule
Definiți un predicat vars/2 care este adevărat exact atunci când primul argument este o formulă, iar al doilea argument este lista care reprezintă mulțimea variabilelor care apar în ea.
?- vars(imp(non(a), imp(a, b)), S).
S = [a, b]
Utilizați, pentru implementare, predicatul predefinit atom/1, respectiv predicatul union/3, care calculează reuniunea a două liste, considerate ca fiind mulțimi.
Reamintim reprezentarea formulelor:
non/1,and/2,or/2,imp/2.
Te-ai blocat?
editor
soluție
vars(X, [X]) :- atom(X).
vars(non(P), Res) :- vars(P, Res).
vars(imp(P, Q), Res) :-
vars(P, ResP),
vars(Q, ResQ),
union(ResP, ResQ, Res).
vars(and(P, Q), Res) :-
vars(P, ResP),
vars(Q, ResQ),
union(ResP, ResQ, Res).
vars(or(P, Q), Res) :-
vars(P, ResP),
vars(Q, ResQ),
union(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)
?
vars(imp(non(a), imp(a, b)), S).
așteptat: S = [a,b]
?
vars(a, S).
așteptat: S = [a]
?
vars(and(p, or(q, non(p))), S).
așteptat: S = [p,q]