与えた条件を満たす候補
Posted feedbacks - Prolog
?- solve([and, or, not, and]). [true, true, true, true] [true, true, fail, true] [true, fail, fail, true] [fail, true, fail, true] [fail, fail, fail, true] と言う感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | solve(Ps) :-
forall((tf(Ps, Pt, T, X), solve(Pt, T, Xs)),
writeln([X|Xs])).
solve([], T, []) :-
T, !.
solve([P|Ps], T, [X|Xs]) :-
tf(Ps, Pt, U, X),
( P = and -> solve(Pt, (T,U), Xs)
; P = or -> solve(Pt, (T;U), Xs)
).
tf([not|Ps], Pt, \+T, X) :-
!, tf(Ps, Pt, T, X).
tf(Ps, Ps, X, X) :-
member(X, [true, fail]).
|

にしお
#3399()
Rating0/0=0.00
元ネタの 充足可能性問題 - Wikipedia は、 同じリテラル(x1とかnot x2とか)が複数回出てくることを想定しているので、 今回の問題のようにそれぞれ別の変数でだと乗法標準形 - Wikipediaにした場合に、答えが…と色々悩みどころでした。
[ reply ]