Z3 无法识别没有类型的插入和 Nil

Z3 Doesn't Recognize Insert and Nil Without Type

在下面的代码中,Z3 无法识别第 1 行中的 nil,直到 xs 被声明为 List。如何解决这个问题?在 Z3/SMT-LIB2 中是否有类似 import/include 的结构?

(assert (= nil nil))          ; (error "line 1 column 12: unknown constant nil")
(declare-const xs (List Int))
(assert (= nil nil))          ; OK after declare-const List Int

从文件或使用 z3 -in 进行测试都会看到错误。

不幸的是,这是 SMT-Lib 标准的普遍缺点。将符号引入作用域的唯一方法是通过 set-logic 声明,并且这些逻辑的列表是固定的。当个别求解器(例如 z3)实施新的决策程序时,他们必须以特殊方式引入符号。 z3 似乎只在声明中看到 List 时才将符号 nil 带入范围;至少可以说这是容易出错的。

这个问题在讨论中多次出现,可惜似乎没有人(包括我自己)有足够的动力提出具体建议并制定所有细节。例如,参见此处:http://www.cs.nyu.edu/pipermail/smt-lib/2015/000862.html,其中建议从固定逻辑声明转向更多 import 样式规范。

因此,鉴于目前的情况,您似乎很难先声明 List。希望 SMTLib 将来能够以更灵活的方式支持新功能。