测量和约束算术子解算器的时间

时间:2015-01-21 12:25:45

标签: timeout z3 groebner-basis

Q1:是否可以查询Z3在不同子解算器中花费的时间?

调用(get-info :all-statistics)给出Z3的总运行时间,但我想将其分解为单个子解算器。

我对与算术相关的子解算器所花费的时间特别感兴趣,更确切地说,是那些产生统计数据的grobnernonlinear-horner


Q2:此外,是否可以在子解算器上设置超时?

我可以想象像每个check-sat和sub-solver定义一个超时,它限制了Z3在该子解算器中可以花费的时间。 Z3将重复调用 n 不同的子解算器,如果达到其中一个的时间限制,它将继续,但仅使用剩余的 n-1 子解算器。

我阅读了战术教程并得到了这样的印象,即实际上这可能是通过

的内容实现的
(repeat
  (par-or
    (try-for <arithmetic-solvers> 500)
    <all-other-solvers>))

但我无法弄清楚要使用哪种求解器。

1 个答案:

答案 0 :(得分:1)

对于Q1:不,你必须添加自己的计时器,我希望这是非常重要的,因为它不清楚究竟应该和不应该计算什么。

Q2:是的,你可以建立自己的自定义策略/策略。请注意,par-or表示 parallel ,或者它将尝试并行运行提供的策略。 并非我们称之为&#34;解算器&#34;有它自己的策略,所以这可能需要一些摆弄。请注意&#34;求解器&#34;在这种情况下,不一定与名为&#34; solver&#34;的Z3 C ++对象相同。一些&#34;求解器&#34;也是SMT内核的组成部分。