如何在SMTLIB2中检索所有令人满意的作业?

如何在SMTLIB2中检索所有令人满意的作业?,smt,sat,Smt,Sat,有没有一种方法可以使用SMTLIB2语法检索所有令人满意的赋值 我使用的解算器是Z3和CVC4。尽管在“纯”SMTLIB2中无法做到这一点,即只需一个文件,无需外部输入,但如果您有一个可以与解算器交互的应用程序,则有一个标准技巧可以做到这一点。您可以在交互模式下运行解算器,在该模式下,您可以一次向解算器发送一个SMTLIB2命令,然后通过以下方式(伪代码)与解算器交互: def get_all_分配(实例): 以交互模式创建解算器 对于实例中的每个声明、断言等: 将断言发送到解算器 let响应:

有没有一种方法可以使用SMTLIB2语法检索所有令人满意的赋值


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

尽管在“纯”SMTLIB2中无法做到这一点,即只需一个文件,无需外部输入,但如果您有一个可以与解算器交互的应用程序,则有一个标准技巧可以做到这一点。您可以在交互模式下运行解算器,在该模式下,您可以一次向解算器发送一个SMTLIB2命令,然后通过以下方式(伪代码)与解算器交互:

def get_all_分配(实例):
以交互模式创建解算器
对于实例中的每个声明、断言等:
将断言发送到解算器
let响应:=无
虽然响应不是未发送的:
向解算器发送命令“(检查sat)”并获得响应
如果回答是SAT:
向解算器发送命令“(获取模型)”并获取模型
打印模型
向解算器发送一个新断言,该断言是对模型的否定

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

有关此主题和Z3实现的进一步阅读,请参阅和