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 将来能够以更灵活的方式支持新功能。
在下面的代码中,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 将来能够以更灵活的方式支持新功能。