我们知道,我们可以通过说:
来证明定理的有效性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)))
答案 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,因为我们可以选择X
为3
。另一方面,公式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。但是,在这种情况下,得到的公式通常难以解决,因为它包含了一个通用的量化器。