生成可满足且不可满足的公式

时间:2016-04-04 14:35:40

标签: algorithm logic theory boolean-logic

我正在一个项目中,我必须以CNF形式生成命题公式以执行一些测试;我遇到了以下问题:

  1. 如何生成随机可满足的公式?
  2. 如何生成随机有效公式?
  3. 对于第二个问题,我有一个想法,例如我们可以生成一个随机公式p然后采用公式p or not p,然后在CNF中转换生成的公式,但问题是我们可以以这种方式生成所有有效的公式?

    此处允许的布尔运算符为:or,and,not

    感谢您的帮助

1 个答案:

答案 0 :(得分:1)

首先,让L成为预先指定k的{​​{1}}文字l1,l2,l3,...,lk的集合。现在给出一组文字,我们可以从中生成CNF公式。

我建议先选择一些条款 - 即。结合的OR表达式的数量---,比如k,然后是mn_1,...,n_2,其中n_m是OR连接文字的数量。您可以随机选择这些数字,也可以将它们作为参数来更好地控制公式的大小和结构。

例如,对于n_im=2以及n1=2,您有n2=2形式的CNF (l1 OR l2) AND (l3 OR l4)' s是从li中选择的,是否被否定。

现在你知道了公式的样子,迭代文字的位置和每个位置:

  • L随机统一选择文字l;
  • 翻一个公平的硬币来决定是否否定字面意思。

你最终得到一个"随机" CNF中的公式。但是,你不知道它是否可以满足。

更新(2016年4月5日)如果您希望使用给定参数L高效生成随机可满足的CNF, km,你必须能够有效地计算哪些公式是可满足的(因此隐含地解决了ni问题)。出于这个原因,我认为没有多项式时间算法(除非 P = NP )用于生成随机 3-CNF(这样每个人都可以满足具有给定结构的3-CNF同样可能)。因为生成随机3-CNF很难,所以通常会产生CNF。

可能存在用于生成可满足的3-CNF的子集的算法,其可能足以用于实际目的;生成不可满足的实例同样如此。