z3 是否忽略了我的某些限制?
is z3 ignoring some of my restrictions?
Whosebug-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) 如果我取消注释 "Restriction #1"
(assert (> B #x00000000))
我得到以下结果:
A: #x0000a000
B: #x00000007
C: #x00000000
难道是椅子-键盘界面的bug?我做错了什么?
提前致谢!
为了比较位向量,您应该始终使用相应的 signed/unsigned 变体:bvult
、bvugt
、bvule
、bvuge
用于无符号,和 bvslt
、bvsgt
、bvsle
、bvsge
用于签名。使用 <
、>
等是无效的。因此,您的 "restrictions" 目前实际上只是被忽略了。如果我在命令行上 运行 你的基准测试,我得到以下输出:
(error "line 8 column 24: Sort mismatch at argument #1 for function (declare-fun <= (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 9 column 24: Sort mismatch at argument #1 for function (declare-fun <= (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 10 column 24: Sort mismatch at argument #1 for function (declare-fun <= (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 13 column 23: Sort mismatch at argument #1 for function (declare-fun > (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 16 column 24: Sort mismatch at argument #1 for function (declare-fun > (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 19 column 24: Sort mismatch at argument #1 for function (declare-fun <= (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 22 column 15: Sort mismatch at argument #1 for function (declare-fun <= (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 27 column 44: Sort mismatch at argument #1 for function (declare-fun > (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 29 column 52: Sort mismatch at argument #1 for function (declare-fun < (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 30 column 52: Sort mismatch at argument #1 for function (declare-fun < (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 33 column 23: Sort mismatch at argument #1 for function (declare-fun < (Int Int) Bool) supplied sort is (_ BitVec 32)")
sat
((A #x00000000))
((B #x00000000))
((C #x00000000))
((D #x00000000))
((F #x00000000))
我不确定为什么 "online" 求解器没有类似的抱怨。
Whosebug-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) 如果我取消注释 "Restriction #1"
(assert (> B #x00000000))
我得到以下结果:
A: #x0000a000
B: #x00000007
C: #x00000000
难道是椅子-键盘界面的bug?我做错了什么?
提前致谢!
为了比较位向量,您应该始终使用相应的 signed/unsigned 变体:bvult
、bvugt
、bvule
、bvuge
用于无符号,和 bvslt
、bvsgt
、bvsle
、bvsge
用于签名。使用 <
、>
等是无效的。因此,您的 "restrictions" 目前实际上只是被忽略了。如果我在命令行上 运行 你的基准测试,我得到以下输出:
(error "line 8 column 24: Sort mismatch at argument #1 for function (declare-fun <= (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 9 column 24: Sort mismatch at argument #1 for function (declare-fun <= (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 10 column 24: Sort mismatch at argument #1 for function (declare-fun <= (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 13 column 23: Sort mismatch at argument #1 for function (declare-fun > (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 16 column 24: Sort mismatch at argument #1 for function (declare-fun > (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 19 column 24: Sort mismatch at argument #1 for function (declare-fun <= (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 22 column 15: Sort mismatch at argument #1 for function (declare-fun <= (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 27 column 44: Sort mismatch at argument #1 for function (declare-fun > (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 29 column 52: Sort mismatch at argument #1 for function (declare-fun < (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 30 column 52: Sort mismatch at argument #1 for function (declare-fun < (Int Int) Bool) supplied sort is (_ BitVec 32)")
(error "line 33 column 23: Sort mismatch at argument #1 for function (declare-fun < (Int Int) Bool) supplied sort is (_ BitVec 32)")
sat
((A #x00000000))
((B #x00000000))
((C #x00000000))
((D #x00000000))
((F #x00000000))
我不确定为什么 "online" 求解器没有类似的抱怨。