Q1:是否可以查询Z3在不同子解算器中花费的时间?
调用(get-info :all-statistics)
给出Z3的总运行时间,但我想将其分解为单个子解算器。
我对与算术相关的子解算器所花费的时间特别感兴趣,更确切地说,是那些产生统计数据的grobner
和nonlinear-horner
。
Q2:此外,是否可以在子解算器上设置超时?
我可以想象像每个check-sat和sub-solver定义一个超时,它限制了Z3在该子解算器中可以花费的时间。 Z3将重复调用 n 不同的子解算器,如果达到其中一个的时间限制,它将继续,但仅使用剩余的 n-1 子解算器。
我阅读了战术教程并得到了这样的印象,即实际上这可能是通过
的内容实现的(repeat
(par-or
(try-for <arithmetic-solvers> 500)
<all-other-solvers>))
但我无法弄清楚要使用哪种求解器。
答案 0 :(得分:1)
对于Q1:不,你必须添加自己的计时器,我希望这是非常重要的,因为它不清楚究竟应该和不应该计算什么。
Q2:是的,你可以建立自己的自定义策略/策略。请注意,par-or表示 parallel ,或者它将尝试并行运行提供的策略。 并非我们称之为&#34;解算器&#34;有它自己的策略,所以这可能需要一些摆弄。请注意&#34;求解器&#34;在这种情况下,不一定与名为&#34; solver&#34;的Z3 C ++对象相同。一些&#34;求解器&#34;也是SMT内核的组成部分。