我有一个AIG(和 - 逆变器图),我一直在修改它,我需要使用Z3以增量方式检查它的可满足性。我可以生成AIG的CNF表示,并且理想情况下将这些子句直接提供给求解器并从我的代码中重复调用它。有没有什么方法可以通过C / C ++ API直接向Z3求解器添加子句(或AIG)?
答案 0 :(得分:0)
是的,您可以简单地声明新的断言,这些断言在内部翻译成子句。
请注意,对于许多增量解决问题,Z3不使用现成的专用SAT求解器,但它自带的SMT求解器包含了SAT求解器的一些功能,但并非全部,并且本地处理非布尔问题。因此,不一定是直接攻击求解器注入条款的情况将转化为显着改善的性能。
Z3还有一个专用的布尔型SAT求解器,如果您正在解决纯粹的布尔问题,这个求解器可能会快得多。您可以强制它使用此解算器,将(check-sat)
替换为(check-sat-using sat)
,或运行名为“坐着”的策略。这个解算器的实现在sat_solver.h/.cpp,如果您想要破解它,这将是开始环顾四周的主要场所。
Z3还使用它自己的AIG实现作为某些策略中的预处理步骤,请参阅aig_tactic.h/.cpp。