在尝试在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.0
,4.8.3
和4.8.5
),所有这些都显示了此行为。