z3 - z3 是否忽略了我的一些限制?

标签 z3 smt sat-solvers

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

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

Run this on Z3 online.

提前致谢!

最佳答案

为了比较位向量,您应该始终使用相应的有符号/无符号变体:bvult , bvugt , bvule , bvuge对于未签名的,和 bvslt , bvsgt , bvsle , bvsge供签署。使用< , >等无效。所以,你的“限制”实际上目前被简单地忽略了。如果我在命令行上运行基准测试,我会得到以下输出:

(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))

我不确定为什么“在线”求解器没有类似的提示。

关于z3 - z3 是否忽略了我的一些限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34229405/

相关文章:

z3 - 通过假设时的 check-sat 错误

.net - 正在寻找 SMT Z3 用例(如 DbC)和 Z3 的开源替代品的实际示例?

z3 - Microsoft Z3中如何进行sin cos运算

logic - Z3 中的平等与双条件

Z3 支持非线性算术

z3 - 如何估计在 z3 for SMT 中解决 SAT 部分所花费的时间?

z3 - 有没有办法将输入作为正常表达式提供给 Z3 求解器?

z3 - 使用 Z3 确定 BV 查询的量词消除难度