我正在尝试优化从我的模型生成的z3 python输入。我能够在15k约束(200个状态)的模型上运行它,然后z3在合理的时间内停止完成(<10分钟)。有没有办法优化从我的模型生成的约束?
3种状态的模型:
答案 0 :(得分:2)
使用自定义策略可以提高脚本http://pastebin.com/F5iuhN42的性能。 Z3允许用户定义自定义策略/解算器。 This tutorial展示了如何使用Z3 Python API定义策略/策略。在脚本http://pastebin.com/F5iuhN42中,如果我们替换行
s = Solver()
与
s = Then('simplify', 'elim-term-ite', 'solve-eqs', 'smt').solver()
运行时间将从30秒减少到1秒(在我的机器上)。
程序Then
正在创建一个由4个步骤组成的策略/策略:
简化器(即应用x + 1 - x + y
==&gt; 1 + y
删除If(a, b, c)
格式的表达式,其中b
和c
不是布尔值。该脚本广泛使用这种表达方式。策略elim-term-ite
将应用消除这种表达的转换。
等式求解器。它适用于x = a And F[x]
==&gt;等转换。 F[a]
。在上面的脚本中,这种策略可以消除1000多个变量。
策略smt
在Z3中调用通用SMT求解器。
方法.solver()
将Z3策略/策略转换为提供add
和check
方法的求解器对象。我在消息开头包含的教程有更多详细信息。