次のように言うことで、定理の有効性を証明できることがわかっています。
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)))