是z3无视我的一些限制?

时间:2015-12-11 17:40:22

标签: z3 smt sat-solvers

计算器-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忽略了“限制#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

是椅子 - 键盘接口错误吗?我做错了什么?

Run this on Z3 online.

提前致谢!

1 个答案:

答案 0 :(得分:2)

为比较位向量,您应始终使用相应的有符号/无符号变体:bvultbvugtbvulebvuge表示无符号,{{1已签名,{},bvsltbvsgtbvsle。使用bvsge<等无效。所以,你的&#34;限制&#34;实际上目前正在被忽略。如果我在命令行上运行您的基准测试,我会得到以下输出:

>

我不确定为什么&#34;在线&#34;求解者也不是在抱怨。