Boolean Grobner Bases の実装を使用して、結合正規形 (CNF) から変換する SAT ソルバーを作成しようとしています。
a) 特定の変数の否定。たとえば、-x
に変換され1+x
ます。
b) 同じ変数を追加すると、結果は 0 になりますx + x = 0
。(XOR を使用する必要があります)。
c) 同じ変数を乗算すると、同じ変数になります。例えばx*x = x
。
現時点では、入力は次のようにSATコンペティションのようにテキストファイルにある必要があるため、開始方法をまだ理解しようとしています。
p cnf 3 4
1 3 -2 0
3 1 0
-1 2 0
2 3 1 0
ありがとう。
編集
parser :-
open(File, read, Stream),
read_literals(Stream,Literals),
close(Stream),
read_clauses(Literals,[],Clauses),
write(Clauses).
read_literals(Stream,Literals) :-
get_char(Stream,C),
read_literals(C,Stream,Literals).
read_literals(end_of_file,_Stream,Literals) :-
!,
Literals = [].
read_literals(' ',Stream,Literals) :-
!,
read_literals(Stream,Literals).
read_line_then_literals('\n',Stream,Literals) :-
!,
read_literals(Stream,Literals).
read_line_then_literals(_C,Stream,Literals) :-
read_line_then_literals(Stream,Literals).
read_literal_then_literals(Stream,As,Literals) :-
get_char(Stream,C),
read_literal_then_literals(C,Stream,As,Literals).
read_literal_then_literals(C,Stream,As,Literals) :-
digit(C),
!,
name(C,[A]),
read_literal_then_literals(Stream,[A|As],Literals).
read_literal_then_literals(C,Stream,As,Literals) :-
reverse(As,RevAs),
name(Literal,RevAs),
Literals = [Literal|Rest_Literals],
read_literals(C,Stream,Rest_Literals).
digit('0').
digit('1').
digit('2').
digit('3').
digit('4').
digit('5').
digit('6').
digit('7').
digit('8').
digit('9').
read_clauses([],[],[]).
read_clauses([0|Literals],Clause,Clauses) :-
!,
reverse(Clause,RevClause),
Clauses=[RevClause|RestClauses],
read_clauses(Literals,[],RestClauses).
read_clauses([Literal|Literals],Clause,Clauses) :-
read_clauses(Literals,[Literal|Clause],Clauses).