仅在超时后才使用软约束/假设的策略?

时间:2013-12-02 13:39:07

标签: timeout constraints z3

假设我有一个Z3前导码,其中包括几个函数声明和定义公理(带有显式模式),例如我自己的序列公理:

(declare-sort $Seq)
(declare-fun $Seq.nil () $Seq)
(declare-fun $Seq.len ($Seq) Int)
(declare-fun $Seq.con (Int $Seq) $Seq)
(declare-fun $Seq.at ($Seq Int) Int)
(declare-fun $Seq.in ($Seq Int) Bool)
...
(assert (forall ((xs $Seq)) (! ... )
(assert (forall ((xs $Seq) (x Int)) (! ... )
...

在发布了这个序言之后,许多断言被推送到Z3,穿插了对check-set的调用,看看是否可以显示某些否定的公式unsat(仅供参考:我的上下文是使用软件验证象征性执行)。 大多数这些断言很简单,不反驳它们不需要序列公理。然而,从一些简单的测试中我得到的印象是,他们的存在会减慢Z3的速度。

因此,我用一个假布尔常数作为暗示的左侧(如this answer所建议的那样)来保护定义公理,例如,

(declare-const $useSeq Bool)
(assert (=> ($useSeq (forall ((xs $Seq)) (! ... )

并将需要推理序列的每个check-sat更改为假定为$useSeq的序列,即

(check-sat $useSeq)

问题:是否有一种策略/方法可以让Z3仅在超时后使用某些断言?如,

(check-sat-using (or-else (try-for smt 500) (smt $useSeq)))

我当然可以首先手动发出一个有时间限制的check-sat,然后根据需要发出check-sat useSeq $useSeq,但如果能用某种策略完成它会很好。

1 个答案:

答案 0 :(得分:0)

不幸的是,使用Z3中现有的一套策略无法做到这一点。

相关问题