在以下代码中,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
进行测试都会看到错误。
答案 0 :(得分:1)
遗憾的是,这是SMT-Lib标准的一般缺点。将符号引入范围的唯一方法是通过set-logic
声明,并修复这些逻辑的列表。当个体求解器(例如z3)实施新的决策程序时,他们必须以特别的方式引入符号。看来z3在声明中看到nil
时只会将符号List
带入范围;这至少可以说是错误的。
在讨论中出现了各种各样的情况,唉似乎没有任何人有足够的动力(包括我自己)提出具体的提案并制定出所有细节。请参阅此处,例如:http://www.cs.nyu.edu/pipermail/smt-lib/2015/000862.html,其中建议将固定逻辑声明转移到更多import
样式规范。
所以,考虑到目前的状况,你几乎不会首先宣布List
。希望SMTLib将在未来以更灵活的方式发展以支持新功能。