実数を使用した SMT2-Lib スクリプトが 2 つありますが、これらは道徳的に同等です。唯一の違いは、一方はビットベクトルも使用し、他方は使用しないことです。
実数とビットベクトルの両方を使用するバージョンは次のとおりです。
; 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)
はかなりコストがかかります。他の場所でかなりの変更が必要になるためです。)