Prolog 从CNF转换为喇叭形式

Prolog 从CNF转换为喇叭形式,prolog,sat-solvers,Prolog,Sat Solvers,如何使用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=如果您定义Horn格式以及它与您正在使用的CNF格式的区别,可能会有所帮助,因为C

如何使用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=如果您定义Horn格式以及它与您正在使用的CNF格式的区别,可能会有所帮助,因为CNF可以用于编码Horn公式。这在imho中没有多大意义。非常非正式:解决CNF是NP难的,解决HornSat是P。这意味着(通过矛盾使用基本参数):就复杂性而言,此转换与解决原始CNF-SAT(NP难)一样困难,并且输出可能是指数大小的(使用HornSat解算器,您可以做的不多)!Kyle Jones,CNF如何用于编码Horn公式?sascha,你建议我只在CNFI中使用吗?别提任何建议,但每个好的sat解算器都在CNF上工作!当然,cnf可以对horn公式进行编码,因为每个horn公式都是有效的cnf(horn=低得多/受约束得多)。'有什么不清楚的地方?
A1 v ~B1 v .. v ~Bm

~B1 v .. v ~Bm
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)