Wir wissen, dass wir Gültigkeit eines Satzes beweisen kann, mit den Worten:beseitigen forall mit unsat
let Demorgan(x, y) = formula1(x,y) iff formula2(x,y)
assert (forall (x,y) . Demorgan(x,y))
Alternativ können wir die forall quantifier beseitigen, indem er sagte, dass:
let Demorgan(x, y) = formula1(x,y) iff formula2(x,y)
(assert (not Demorgan(x,y)))
Also, wenn es zurückgibt Ungesättigt, dann können wir sagen, dass die obige Formel gültig ist.
Jetzt möchte ich diese Idee verwenden, um den forall quantifier aus der folgenden Behauptung zu beseitigen:
assert (exists x1,x2,x3 st .(forall y . formula1(x1,y) iff
formula2(x2,y) iff
formula3(x3,y)))
So ist es eine Möglichkeit, in Z3 (unter Verwendung von C++ API oder SMT-LIB2.0), dass ich behaupten kann etwa wie folgt:
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)))