如果我在(get-model)之后标记它?
If I mark it after (get-model)?
如果只有 (check-sat) 完成,则标记为 no sat。
但是如果你尝试(get-model),它没有标记,错误马上就出来了。
有什么方法可以不报错的标记我吗?
正如 Patrick 评论的那样,很难理解您的问题。请提供一些代码片段来展示你得到了什么以及你希望实现什么。
话虽如此,我会大胆猜测您所处的求解器是 unsat
,即 (check-sat)
returns 和 unsat
回复。然而,您的脚本在下一行中有 (get-model)
,这当然会出错,因为没有模型。你想要一种避免错误消息的方法。
这是 SMTLib 命令语言的一个已知限制:不幸的是,您无法以编程方式检查命令的输出。解决此类问题的通常方法是与求解器建立 "live" 连接(通常以文本管道的形式),并在发出 (check-sat)
后读取一行,并以编程方式继续,具体取决于响应。这就是大多数建立在 SMT 求解器之上的系统的工作方式。
或者,您可以使用其他语言的高级 API (C/C++/Java/Python/Haskell..) 并以这种方式对 z3 进行编程;并使用宿主语言的功能来指导该交互。这需要您学习 SMTLib 之上的另一个接口,但是对于这项技术的认真使用,您可能无论如何都不想将自己局限于纯 SMTLib 接口。
有关相关讨论,另请参阅此答案:
希望这能解决您的问题,尽管从您的问题中很难判断这是否就是您要解决的问题。
如果只有 (check-sat) 完成,则标记为 no sat。 但是如果你尝试(get-model),它没有标记,错误马上就出来了。 有什么方法可以不报错的标记我吗?
正如 Patrick 评论的那样,很难理解您的问题。请提供一些代码片段来展示你得到了什么以及你希望实现什么。
话虽如此,我会大胆猜测您所处的求解器是 unsat
,即 (check-sat)
returns 和 unsat
回复。然而,您的脚本在下一行中有 (get-model)
,这当然会出错,因为没有模型。你想要一种避免错误消息的方法。
这是 SMTLib 命令语言的一个已知限制:不幸的是,您无法以编程方式检查命令的输出。解决此类问题的通常方法是与求解器建立 "live" 连接(通常以文本管道的形式),并在发出 (check-sat)
后读取一行,并以编程方式继续,具体取决于响应。这就是大多数建立在 SMT 求解器之上的系统的工作方式。
或者,您可以使用其他语言的高级 API (C/C++/Java/Python/Haskell..) 并以这种方式对 z3 进行编程;并使用宿主语言的功能来指导该交互。这需要您学习 SMTLib 之上的另一个接口,但是对于这项技术的认真使用,您可能无论如何都不想将自己局限于纯 SMTLib 接口。
有关相关讨论,另请参阅此答案:
希望这能解决您的问题,尽管从您的问题中很难判断这是否就是您要解决的问题。