stackoverflow-ers(?),
我正在玩 z3,我正在尝试解决以下限制:
(declare-const A (_ BitVec 32))
(declare-const B (_ BitVec 32))
(declare-const C (_ BitVec 32))
(declare-const D (_ BitVec 32))
(declare-const E (_ BitVec 32))
(declare-const F (_ BitVec 32))
(assert (<= A #xFFFFFFFF))
(assert (<= B #xFFFFFFFF))
(assert (<= C #xFFFFFFFF))
(assert (> A #x00000000))
;(Commented) Restriction #1 (assert (> B #x00000000))
(assert (> C #x00000000))
(assert (= D (bvand (bvmul (bvmul A B) #x00000008) #xFFFFFFFF) ))
(assert (<= D #xFFFFFFFF))
(assert (= E (bvand (bvmul (bvmul A C) #x00000008) #xFFFFFFFF)))
(assert (<= D E))
(assert (= F (bvand (bvmul A #x00000008) #xFFFFFFFF)))
;(Uncommented) Restriction #2
(assert (> (bvand (bvmul F B) #xFFFFFFFF) D))
(assert (< (bvand (bvmul A B) #xFFFFFFFF) #x7FFFFFFF))
(assert (< (bvand (bvmul A C) #xFFFFFFFF) #x7FFFFFFF))
(assert (< D #x01000000))
(check-sat)
(get-value(A))
(get-value(B))
(get-value(C))
(get-value(D))
(get-value(F))
我在这些约束方面遇到了一些麻烦:a)第一个问题是 z3 忽略了“Restriction #2”
(assert (> (bvand (bvmul F B) #xFFFFFFFF) D))
,我得到的值如下:
A: #x000070e0
B: #x0000000a
C: #x00000014
D: #x00234600
F: #x00038700
尽管有限制,但 F*B = D。
b)如果我取消注释“限制 #1”
(assert (> B #x00000000))
我得到以下结果:
A: #x0000a000
B: #x00000007
C: #x00000000
它是椅子 - 键盘界面错误吗?我究竟做错了什么?
提前致谢!