我们知道,我们可以通过说来证明定理的有效性:
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) ) )
所以如果它返回 unsat,那么我们可以说上面的公式是有效的。
现在我想用这个想法从以下断言中消除 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)))