在this program上运行Windows x64版本的Z3 4.3.2(官方下载)和Z3 4.4 0ab54b9e0c33(不幸的是很长)会产生invalid rational value passed as an integer
。
问题似乎不是类型检查器问题,因为明显违规的公式(程序中的最后check-sat
)在类型上看起来很好:
(declare-const i@99 Int)
(declare-const k@38 Int)
...
(assert (not (and (<= 0 i@99) (< i@99 (+ k@38 1)))))
(check-sat) ; ERROR
我的猜测是在证明搜索期间出现问题,因为稍微更改程序会使错误消失。我尝试更改Z3的配置选项,并观察如果smt.arith.nl
分别设置为false
,如果smt.qi.eager_threshold
设置为低于10
的值,则错误消失。此外,基本上删除最后push-pop
之前的任何check-sat
范围也会使错误消失(尽管我实际上并没有尝试删除每个范围)。这两个观察结果都让我相信,在证据搜索期间和搜索空间的“区域”中,只有在特定情况下才会出现错误。
违规行以及我尝试过的行标有[XXX]
。
这是一个错误还是其他事情发生在这里?