有没有办法使用SMTLIB2语法检索所有令人满意的赋值?
我使用的解算器是Z3和CVC4。
答案 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 models和Z3py: checking all solutions for equation。