测量和限制在算术子求解器中花费的时间

Measure and bound time spent in arithmetic sub-solvers

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

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

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


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

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

我阅读了战术教程,感觉这可能实际上可以通过

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

但我不知道要使用哪个求解器。

对于问题 1:不,您必须在上面添加自己的计时器,我希望这不是微不足道的,因为不清楚究竟应该计算什么,不应该计算什么。

Q2:是的,您可以构建自己的自定义 strategies/tactics。请注意,par-or 表示 parallel 或者,即它将尝试 运行 并行提供的策略。 并非所有我们称之为 "solver" 的东西都有它自己的策略,所以这可能需要一些小技巧。请注意,此上下文中的 "solver" 不一定与名为 "solver" 的 Z3 C++ 对象相同。有些"solvers"也是SMT内核的组成部分。