如何在z3中的任意大小的位向量上声明谓词?

时间:2019-05-03 10:29:22

标签: z3

在尝试在z3中的位向量上定义一些规则时遇到问题。如果我尝试使用z3解决以下文件

(declare-rel FunnyFun ((_ BitVec 64)))
(declare-var A (_ BitVec 64))
(declare-var B (_ BitVec 64))
(rule (=> (= B (bvadd A #x0000000000000001))
    (FunnyFun B)))

(declare-rel q1 ())

(rule (=> (FunnyFun #x0000000000000001) q1))

(query q1)

我得到了错误

(error "query failed: Rule contains infinite sorts in rule <null>:
FunnyFun(#0) :- 
 (= (:var 0) (bvadd (:var 1) #x0000000000000001)).
")

有趣的是,当使用较小的位宽时,足够多的z3立即给出预期的结果(饱和):

(declare-rel FunnyFun ((_ BitVec 60)))
(declare-var A (_ BitVec 60))
(declare-var B (_ BitVec 60))
(rule (=> (= B (bvadd A #x000000000000001))
    (FunnyFun B)))

(declare-rel q1 ())

(rule (=> (FunnyFun #x000000000000001) q1))

(query q1)

这是错误还是我缺少一些约束(我假设BitVec可以具有任意位宽)?

我尝试了不同的z3版本(4.6.04.8.34.8.5),所有这些都显示了此行为。

1 个答案:

答案 0 :(得分:0)

此限制是设计使然。看到这里:https://github.com/Z3Prover/z3/issues/1698