Z3中Horn子句的慢不变推理

时间:2013-07-09 11:30:35

标签: z3

我在Z3 / Horn(unstable分支)

中玩过以下示例
(set-logic HORN)
(declare-fun inv (Int) Bool)
(assert (inv 0))
(assert (forall ((I Int)) (=> (and (<= I 1000) (inv I)) (inv (+ I 1)))))
(assert (forall ((I Int)) (=> (inv I) (<= I 10000))))
(check-sat)
(get-model)

推断不变x≤1001需要8.5秒。这出乎意料地长了......

如果我将1000替换为1500,则时间增加到19秒,如果我用2000替换1000,则时间增加到34秒。这似乎表示相对于循环边界的二次行为。

我觉得很奇怪,需要花费很多时间来验证一个明显具有归纳感的断言......

1 个答案:

答案 0 :(得分:0)

关闭此问题的循环。 首先,这是一个很好的例子来说明一些观点。

Z3中的PDR引擎使用单片策略进行生成 中介断言。直觉上,它基于近似不足 最强的后置条件。它不会尝试在频谱内搜索 插值强度 该示例收敛得更快(即时) 如果应用魔法集变换(例如,反转过渡系统):

(set-logic HORN)
(declare-fun inv (Int) Bool)
(assert (forall ((I Int)) (=> (not (<= I 10000)) (inv I))))
(assert (forall ((I Int)) (=> (and (<= I 1000) (inv (+ I 1))) (inv I))))
(assert (forall ((I Int)) (=> (inv I) (not (= I 0)))))
(check-sat)
(get-model)