我有两个使用实数的 SMT2-Lib 脚本,它们在道德上是等效的。唯一的区别是一个也使用位向量,而另一个不使用。
这是同时使用实数和位向量的版本:
; uses both reals and bit-vectors
(set-option :produce-models true)
(define-fun s2 () Real (root-obj (+ (^ x 2) (- 2)) 2))
(define-fun s3 () Real 0.0)
(define-fun s6 () Real (/ 1.0 1.0))
(declare-fun s0 () (_ BitVec 1))
(declare-fun s1 () (_ BitVec 1))
(assert
(let ((s4 (- s3 s2)))
(let ((s5 (ite (= #b1 s1) s2 s4)))
(let ((s7 (+ s5 s6)))
(let ((s8 (- s5 s6)))
(let ((s9 (ite (= #b1 s0) s7 s8)))
(let ((s10 (ite (>= s9 s3) #b1 #b0)))
(= s10 #b1))))))))
(check-sat)
(get-model)
这是道德上等效的脚本,使用Bool
而不是大小为 1 的位向量,否则基本相同:
; uses reals only
(set-option :produce-models true)
(define-fun s2 () Real (root-obj (+ (^ x 2) (- 2)) 2))
(define-fun s3 () Real 0.0)
(define-fun s6 () Real (/ 1.0 1.0))
(declare-fun s0 () (Bool))
(declare-fun s1 () (Bool))
(assert
(let ((s4 (- s3 s2)))
(let ((s5 (ite s1 s2 s4)))
(let ((s7 (+ s5 s6)))
(let ((s8 (- s5 s6)))
(let ((s9 (ite s0 s7 s8)))
(let ((s10 (ite (>= s9 s3) #b1 #b0)))
(= s10 #b1))))))))
(check-sat)
(get-model)
对于前者,我unknown
从 z3(Mac 上的 v4.1)获得,而后者很好地生产sat
和模型。
虽然 SMT-Lib2 不允许混合实数和位向量,但我认为 Z3 可以很好地处理这些组合。我弄错了吗?有解决方法吗?
(请注意,这些是生成的脚本,因此仅使用Bool
而不是(_ BitVec 1)
相当昂贵,因为它需要在其他地方进行大量更改。)