假设我有一个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的速度。
(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
,但如果能用某种策略完成它会很好。
答案 0 :(得分:0)
不幸的是,使用Z3中现有的一套策略无法做到这一点。