消除forall使用不饱和度

时间:2013-05-26 18:26:13

标签: z3

我们知道,我们可以通过说:

来证明定理的有效性
let Demorgan(x, y) = formula1(x,y) iff formula2(x,y)
assert ( forall (x,y) . Demorgan(x,y) )

或者我们可以通过以下方式消除forall量词:

let Demorgan(x, y) = formula1(x,y) iff formula2(x,y)
( assert (not  Demorgan(x,y) ) )

因此,如果它返回不饱和度,那么我们可以说上面的公式是有效的。

现在我想用这个想法从以下断言中消除forall量词:

assert ( exists x1,x2,x3 st .( forall y . formula1(x1,y) iff
                                          formula2(x2,y) iff
                                          formula3(x3,y) ) )

在Z3(使用C ++ API或SMT-LIB2.0)中有什么方法可以断言如下:

assert (exists x1,x2,x3 st. ( and ((not ( formula1(x1,y) iff formula2(x2,y) )) == unsat)
                                  ((not ( formula2(x2,y) iff formula3(x3,y) )) == unsat))) 

1 个答案:

答案 0 :(得分:8)

是的,当我们通过证明其否定是不可满足的来证明公式的有效性时。 例如,要显示Forall X. F(X)有效,我们只需要表明not (Forall X. F(X))不可满足。公式not (Forall X. F(X))相当于(Exists X. not F(X))。公式(Exists X. not F(X)) 等于等于公式not F(X),其中绑定变量X被新常量X替换。如果满足要求,我的意思是如果第二个是第二个,那么第一个是可以满足的。删除存在量词的这一步通常称为skolemization。 请注意,最后两个公式是等效。 例如,考虑将{ X -> 2 }分配给X的解释2。公式Exists X. not (X = 2)在此解释中仍然评估为true,因为我们可以选择X3。另一方面,公式not (X = 2)在此解释中评估为假。 我们通常使用术语量词消除程序来为给定公式F生成等效无量词的公式F'的过程。因此,skolemization不被视为量词消除程序,因为结果不是等效公式。

话虽如此,我们不必手动应用skolemization步骤。 Z3可以为我们做到这一点。以下是一个示例(也可在线提供here)。

(declare-sort S)
(declare-fun F (S) Bool)
(declare-fun G (S) Bool)
(define-fun Conjecture () Bool 
    (forall ((x S)) (= (and (F x) (G x)) (not (or (not (F x)) (not (G x)))))))
(assert (not Conjecture))
(check-sat)

现在,让我们考虑Exists X. Forall Y. F(X, Y)形式的公式。为了证明这个公式的有效性,我们可以证明否定not Exists X. Forall Y. F(X, Y)是不可满足的。否定等同于Forall X. Exists Y. not F(X, Y)。现在,如果将skolemization应用于此公式,我们将获得Forall X. not F(X, Y(X))。在这种情况下,绑定变量Y已替换为Y(X),其中Y是结果公式中的新函数符号。直觉是函数Y是“选择函数”。对于每个X,我们可以选择不同的值来满足公式F。 Z3会自动为我们执行所有这些步骤。我们不需要手工应用skolemization。但是,在这种情况下,得到的公式通常难以解决,因为它包含了一个通用的量化器。