我的程序,反应有限状态系统的有限合成器,产生SMT查询以注释(未解释的)系统的产品自动机和规范。本质上,它是一个使用未解释函数检查的模型。如果注释存在=> Z3找到的模型满足规范。查询包含:
一个例子是https://dl.dropboxusercontent.com/u/444947/posts/full_arbiter2.smt2 ('forall'用于编码“不关心”函数的输入)
目前,查询从整数算术中获取严格更大的>
运算符(即排名函数具有Int
范围)。
问题:是否值得在Z3中为此类查询开发自定义理论解算器?它可以利用基于DFS的套索搜索,这可能比整数理论解算器(或差异策略)更快。
或者Z3已经有效地处理了这个问题? (有效地意味着“与基于图表的套索搜索相当”)。
答案 0 :(得分:1)
算术不是您的基准测试的瓶颈。 我们可以使用
来检查valgrind --tool=callgrind z3 full_arbiter2.smt2
kcachegrind
Valgrind和kcachegrind在大多数Linux发行版中都可用。
因此,如果您为订单理论实现求解器,我认为您不会获得显着的性能提升。
一个瓶颈是数据类型理论。如果使用位向量对Q和T类型进行编码,则可能会提高性能。另一个瓶颈是量词推理。在调用Z3之前,您是否尝试过扩展它们?
在Z3中,qe
(量词消除)策略将基本上扩展布尔量词。
我通过替换
(check-sat)
与
(check-sat-using (then qe smt))