シンプルな Prolog SAT ソルバーを構築しようとしています。私の考えでは、ユーザーは Prolog リストを使用して CNF (Conjucutive Normal Form) で解くブール式を入力する必要があります。たとえば、(A または B) および (B または C) は sat([[A, B] 、[B、C]]) であり、Prolog は A、B、C の値を見つけます。
次のコードが機能せず、その理由がわかりません。トレース呼び出しのこの行: (7) sat([[true, true]]) ? start_solve_clause([_G609, _G612]]) を期待していました。
免責事項:数日前の Prolog や SAT の問題についても知らなかったくだらないコードで申し訳ありません。
PS: SAT の解決に関するアドバイスは大歓迎です。
痕跡
sat([[X, Y, Z], [X, Y]]).
Call: (6) sat([[_G609, _G612, _G615], [_G609, _G612]]) ? creep
Call: (7) start_solve_clause([_G609, _G612, _G615]) ? creep
Call: (8) solve_clause([_G615], _G726) ? creep
Call: (9) or(_G725, _G615, true) ? creep
Exit: (9) or(true, true, true) ? creep
Exit: (8) solve_clause([true], true) ? creep
Call: (8) or(_G609, _G612, true) ? creep
Exit: (8) or(true, true, true) ? creep
Exit: (7) start_solve_clause([true, true, true]) ? creep
Call: (7) sat([[true, true]]) ?
プロローグソース
% Knowledge base
or(true, true, true).
or(false, false, false).
or(true, false, true).
or(false, true, true).
or(not(true), true, true).
or(not(false), false, true).
or(not(true), false, false).
or(not(false), true, true).
or(true, not(true), true).
or(false, not(false), true).
or(true, not(false), true).
or(false, not(true), false).
% SAT solver
sat([]).
sat([Clause | Tail]) :- start_solve_clause(Clause), sat(Tail).
% Clause solver
start_solve_clause([Var1, Var2 | Tail]) :- solve_clause(Tail, Result), or(Var1, Var2, Result).
solve_clause([X | []], Result) :- or(Result, X, true).
solve_clause([X | Tail], Result) :- solve_clause(Tail, Result2), or(Result, X, Result2).