Z3量词关联传播

Z3量词关联传播,z3,smt,Z3,Smt,我见过一些例子,它们在解决方案中设法返回“不在乎”。我认为这利用了Z3的相关性传播。(见,) 这允许: (set-option :smt.auto-config false) (declare-const x Bool) (declare-const y Bool) (assert (or x y)) (assert x) (check-sat) (echo "Expect x is true") (eval x) ; returns true (echo "Expect y is don

我见过一些例子,它们在解决方案中设法返回“不在乎”。我认为这利用了Z3的相关性传播。(见,)

这允许:

(set-option :smt.auto-config false)

(declare-const x Bool)
(declare-const y Bool)

(assert (or x y))
(assert x)

(check-sat)
(echo "Expect x is true")
(eval x) ; returns true
(echo "Expect y is don't care")
(eval y) ; returns y - i.e don'tcare
返回:

sat
Expect x is true
true
Expect y is don't care
y
sat
red car has working engine, expect true
true
red car has broken transmission, expect true
true
green car has working engine, expect false
false
green car has broken transmission, expect don't care
true
当涉及量词时,我如何实现类似的效果?例如,在下面的示例中,绿色汽车的变速器是否损坏并不重要

(set-option :smt.auto-config false)

(declare-sort Car)

(declare-fun working_engine (Car) Bool)
(declare-fun broken_transmission (Car) Bool)

(define-fun allCarsNeedFixing () Bool
  (forall ((c Car))
    (or
      (not (working_engine c))
      (broken_transmission c))))

(declare-const redCar Car)
(assert (working_engine redCar))

(declare-const greenCar Car)
(assert (not (working_engine greenCar)))

(assert allCarsNeedFixing)
(check-sat)

(echo "red car has working engine, expect true")
(eval (working_engine redCar)) ; returns true
(echo "red car has broken transmission, expect true")
(eval (broken_transmission redCar)) ; returns true

(echo "green car has working engine, expect false")
(eval (working_engine greenCar)) ; returns false
(echo "green car has broken transmission, expect don't care")
(eval (broken_transmission greenCar)) ; could return true or false
返回:

sat
Expect x is true
true
Expect y is don't care
y
sat
red car has working engine, expect true
true
red car has broken transmission, expect true
true
green car has working engine, expect false
false
green car has broken transmission, expect don't care
true
我如何才能得到返回“不在乎”而不是“真”的最终结果


这些示例应该通过

执行,如果您还指定发生了什么以及您期望(或希望)发生什么,则会有所帮助。@alias我编辑了这个问题,试图让它更清晰。MT解算器通常不会提供此类信息,我也不会指望z3永远支持此类信息。一个好方法是明确地尝试这两个选项。也就是说,通过建立
premises/\y->conclusions
premises/\not y->conclusions来证明
y
的值是无关的。如果你能证明两者,那么你就知道
y
与原始问题陈述无关。这显然是更多的工作,但它应该可以跨SMT解决方案移植。(尽管与量词结合使用,您的里程数可能会有所不同。)