从 CNF 转换为喇叭形式
Converting to Horn Form from CNF
如何使用 Prolog 将 CNF 子句转换为 Horn 形式?我正在尝试创建一个以 CNF 作为输入的 SAT 求解器,需要将其转换为 Horn 形式。
Horn 子句是 CNF 的一个子集。即 CNF 可以看作是一般子句的合取,其中每个子句具有以下形式,其中 Ai,Bk 是命题变量,n>=0 和 m>=0:
A1 v .. v An v ~B1 v .. v ~Bm
Ai 是正文字,~Bk 是负文字。 Horn 子句现在是那些最多具有一个正文字的一般子句,即 n=<1。即属于以下形式之一:
A1 v ~B1 v .. v ~Bm
~B1 v .. v ~Bm
现在不可能将每个 CNF 转换为 Horn 子句,即使我们允许更改表示中文字的符号。将这个公式 nae(A,B,C)=(A xor B) v (B xor C) 和相关的符号变化变体作为 CNF:
nae(A,B,C) = (~A v ~B v ~C) & (A v B v C)
nae(A,B,~C) = (~A v ~B v C) & (A v B v ~C)
nae(A,~B,C) = (~A v B v ~C) & (A v ~B v C)
nae(A,~B,~C) = (~A v B v C) & (A v ~B v ~C)
nae(~A,B,C) = (~A v B v C) & (A v ~B v ~C)
nae(~A,B,~C) = (~A v B v ~C) & (A v ~B v C)
nae(~A,~B,C) = (~A v ~B v C) & (A v B v ~C)
nae(~A,~B,~C) = (~A v ~B v ~C) & (A v B v C)
它们都是 non-Horn 子句,因此无法进行重命名翻译。但也许使用其他归约,可能 non-polynomial 个,可用于将 CNF 转换为 Horn 子句。
P.S.: nae(A,B,C) 例子取自here.
如何使用 Prolog 将 CNF 子句转换为 Horn 形式?我正在尝试创建一个以 CNF 作为输入的 SAT 求解器,需要将其转换为 Horn 形式。
Horn 子句是 CNF 的一个子集。即 CNF 可以看作是一般子句的合取,其中每个子句具有以下形式,其中 Ai,Bk 是命题变量,n>=0 和 m>=0:
A1 v .. v An v ~B1 v .. v ~Bm
Ai 是正文字,~Bk 是负文字。 Horn 子句现在是那些最多具有一个正文字的一般子句,即 n=<1。即属于以下形式之一:
A1 v ~B1 v .. v ~Bm
~B1 v .. v ~Bm
现在不可能将每个 CNF 转换为 Horn 子句,即使我们允许更改表示中文字的符号。将这个公式 nae(A,B,C)=(A xor B) v (B xor C) 和相关的符号变化变体作为 CNF:
nae(A,B,C) = (~A v ~B v ~C) & (A v B v C)
nae(A,B,~C) = (~A v ~B v C) & (A v B v ~C)
nae(A,~B,C) = (~A v B v ~C) & (A v ~B v C)
nae(A,~B,~C) = (~A v B v C) & (A v ~B v ~C)
nae(~A,B,C) = (~A v B v C) & (A v ~B v ~C)
nae(~A,B,~C) = (~A v B v ~C) & (A v ~B v C)
nae(~A,~B,C) = (~A v ~B v C) & (A v B v ~C)
nae(~A,~B,~C) = (~A v ~B v ~C) & (A v B v C)
它们都是 non-Horn 子句,因此无法进行重命名翻译。但也许使用其他归约,可能 non-polynomial 个,可用于将 CNF 转换为 Horn 子句。
P.S.: nae(A,B,C) 例子取自here.