ブール式 (NNF、CNF ではない) のモデルを単純に検索するアルゴリズムを作成しようとしています。
私が持っているコードは既存のモデルをチェックできますが、モデルを見つけるように求められたときに失敗します (または終了しません) member(X, Y)
。[X|_], [_,X|_], [_,_,X|_]...
私がこれまでに持っているのはこれです:
:- op(100, fy, ~).
:- op(200, xfx, /\).
:- op(200, xfx, \/).
:- op(300, xfx, =>).
:- op(300, xfx, <=>).
formula(X) :- atom(X).
formula(~X) :- formula(X).
formula(X /\ Y) :- formula(X), formula(Y).
formula(X \/ Y) :- formula(X), formula(Y).
formula(X => Y) :- formula(X), formula(Y).
formula(X <=> Y) :- formula(X), formula(Y).
model(1, _).
model(X, F) :- atom(X), member([X, 1], F).
model(~X, F) :- atom(X), member([X, 0], F). % NNF
model(A /\ B, F) :- model(A, F), model(B, F).
model(A \/ B, F) :- (model(A, F); model(B, F)).
model(A => B, F) :- model(~A \/ B, F).
model(A <=> B, F) :- model((A => B) /\ (B => A), F).
sat(A) :- model(A, F), \+ (member([X, 1], F), member([X, 0], F)).
%%% examples:
% formula(~(~ (a /\ b) \/ (c => d))).
% model(a, [[a,1]]).
のより良いデータ構造F
、または部分的にインスタンス化されたリストを切り捨てることができる他の方法はありますか?
編集: 定義と例を追加しました。