如何在SMTLIB2中检索所有令人满意的分配?

时间:2015-11-16 14:59:42

标签: smt sat

有没有办法使用SMTLIB2语法检索所有令人满意的赋值?

我使用的解算器是Z3和CVC4。

1 个答案:

答案 0 :(得分:0)

虽然没有办法在“纯”SMTLIB2中执行此操作,即只使用单个文件而没有外部输入,但如果您有一个可以与解算器交互的应用程序,则执行此操作有一个标准技巧。您以交互模式运行解算器,您可以在其中一次发送一个SMTLIB2命令,然后按以下方式与其进行交互(伪代码):

def get_all_assignments(instance): create solver in interactive mode for each declaration, assertion, etc. in instance: send assertion to solver let response := None while response is not UNSAT: send command '(check-sat)' to solver and get response if response is SAT: send command '(get-model)' to solver and get model print model send the solver a new assertion which is the negation of the model

实际上,每次找到令人满意的赋值时,都会向模型添加一个新约束,阻止求解器再次找到该赋值,并要求它重新求解。当解算器返回UNSAT时,您知道您已找到每个令人满意的任务。

有关此主题和Z3实施的进一步阅读,请参阅Z3: finding all satisfying modelsZ3py: checking all solutions for equation