我正在一个项目中,我必须以CNF形式生成命题公式以执行一些测试;我遇到了以下问题:
对于第二个问题,我有一个想法,例如我们可以生成一个随机公式p
然后采用公式p or not p
,然后在CNF中转换生成的公式,但问题是我们可以以这种方式生成所有有效的公式?
此处允许的布尔运算符为:or,and,not
感谢您的帮助
答案 0 :(得分:1)
首先,让L
成为预先指定k
的{{1}}文字l1,l2,l3,...,lk
的集合。现在给出一组文字,我们可以从中生成CNF公式。
我建议先选择一些条款 - 即。结合的OR表达式的数量---,比如k
,然后是m
,n_1
,...,n_2
,其中n_m
是OR连接文字的数量。您可以随机选择这些数字,也可以将它们作为参数来更好地控制公式的大小和结构。
例如,对于n_i
和m=2
以及n1=2
,您有n2=2
形式的CNF (l1 OR l2) AND (l3 OR l4)
' s是从li
中选择的,是否被否定。
现在你知道了公式的样子,迭代文字的位置和每个位置:
L
随机统一选择文字l
; 你最终得到一个"随机" CNF中的公式。但是,你不知道它是否可以满足。
更新(2016年4月5日)。如果您希望使用给定参数L
高效生成随机可满足的CNF, k
和m
,你必须能够有效地计算哪些公式是可满足的(因此隐含地解决了ni
问题)。出于这个原因,我认为没有多项式时间算法(除非 P = NP )用于生成随机 3-CNF(这样每个人都可以满足具有给定结构的3-CNF同样可能)。因为生成随机3-CNF很难,所以通常会产生CNF。
可能存在用于生成可满足的3-CNF的子集的算法,其可能足以用于实际目的;生成不可满足的实例同样如此。