SMT-LIB/Z3中的溢出处理

SMT-LIB/Z3中的溢出处理,z3,smt,Z3,Smt,我试图使用SMT对下面的表达式进行建模,所有常量a,b,c,d都是相同大小的位向量,约束为以下断言a+b>=c+d。我想以一种不会发生溢出/下溢的方式对其进行建模 这就是我迄今为止所尝试的: (declare-const a (_ BitVec 4)) (declare-const b (_ BitVec 4)) (declare-const c (_ BitVec 4)) (declare-const d (_ BitVec 4)) (assert (bvuge (bvadd a b) (b

我试图使用SMT对下面的表达式进行建模,所有常量
a,b,c,d
都是相同大小的位向量,约束为以下断言
a+b>=c+d
。我想以一种不会发生溢出/下溢的方式对其进行建模

这就是我迄今为止所尝试的:

(declare-const a (_ BitVec 4))
(declare-const b (_ BitVec 4))
(declare-const c (_ BitVec 4))
(declare-const d (_ BitVec 4))

(assert (bvuge (bvadd a b) (bvadd c d)))

; this is an inaccurate, only checks the last operation for underflow
; (a+b-c-d) >= d
; (assert (bvuge (bvsub (bvsub (bvadd a b) c) d) d))
;
; this should model that either both sides overflow, neither,
; or only the expression to the left of the inequality
; (
;     (a + b <= a and c + d <= c and a + b >= c + d) or
;     (a + b >= a and c + d <= c) or
;     (a + b >= a and c + d >= c and a + b >= c + d)
; )
;(assert (or
;        (and (bvule (bvadd a b) a)
;             (bvule (bvadd c d) c)
;             (bvuge (bvadd a b) (bvadd c d)))
;        (and (bvuge (bvadd a b) a)
;             (bvule (bvadd c d) c))
;        (and (bvuge (bvadd a b) a)
;             (bvuge (bvadd c d) c)
;             (bvuge (bvadd a b) (bvadd c d)))))

(assert (bvuge (bvsub (bvsub (bvadd a b) c) d) #x0))

(check-sat)
(get-model)
(声明常量a(uu位向量4))
(声明常量b(ubitvec 4))
(声明常数c(ubitvec 4))
(声明常数d(ubitvec 4))
(断言(bvuge(bvadd a b)(bvadd c d)))
; 这是不准确的,只检查最后一次操作是否有下溢
; (a+b-c-d)>=d
; (assert(bvuge(bvsub)(bvsub(bvsub)(bvadd a b)c)d)d)
;
; 这应该是一个两边都溢出的模型,
; 或者只是不等式左边的表达式
; (
(a+b=a和c+d=a和c+d>=c和a+b>=c+d)
; )
;(断言)

;(b规则(b添加c d)c)
(bvuge(bvadd a b)(bvadd c d)))
和
;(b规则(b添加c d)c)
和
(bvuge(bvadd c d)c)
((bvuge)(bvadd a b)(bvadd c d(()))
(断言(bvuge(bvsub(bvsub(bvsub)a b)c)d)#x0)
(检查sat)
(获取模型)
但我不确定约束是否足够。

更好的策略是“扩展”到更大的位向量,并检查结果是否符合所需的位向量大小。请注意,对位向量进行适当的下溢/溢出检查可能会非常棘手,尤其是在存在乘法的情况下

幸运的是,有一篇优秀的论文描述了如何正确地做到这一点:

(这篇论文有一些小问题:这里和那里有一些打字错误,有符号乘法溢出/下溢公式已经过时。但这是一个很好的开始资源!)

此外,Z3还为流下/流上的乘法提供现成的检查器谓词

一旦你阅读了这篇论文,如果你还有问题的话,请随时就论文的内容提出进一步的问题