[英]is_list/1 and free variables
这是第一个观察:
?- is_list([]), is_list([_,_,_]).
true.
这是另一个观察:
?- [] = _, [_,_,_] = _.
true.
因此,为什么要实现is_list/1
?- is_list(_).
false.
要么
?- is_list([_|_]).
false.
什么时候_
可以清楚地与列表统一? 它是否true
在逻辑上更健全?
在SWI-Prolog的is_list/1
文档中 ,注释说:
在5.0.1之前的版本中,
is_list/1
只检查了[]
或[_|_]
而proper_list/1
具有当前is_list/1
。 目前的定义符合事实上的标准。
为什么这是事实上的标准?
正如您所正确观察到的那样, is_list/1
是不健全的 ,或者说是不 完整的 ,因为它错误地表示在提出最常规查询时没有任何解决方案 。
?- is_list(Ls). false.
没有列表? 来吧!
所有遗传类型检查谓词如atom/1
, integer/1
等都有这个不幸的特征,当这些谓词在被正确地反对他们建议的语义作为“纯粹主义者”的标记之后被构思出来时,其错误已经很明显了。那个时候,缺少这个词自获得后的免费角色)。
例如:
?- is_list(Ls), Ls = []. false. ?- Ls = [], is_list(Ls). Ls = [].
清楚地说明从这种非单调测试的逻辑观点来看,某些事情从根本上被打破了。 “Prolog的(,)/2
不是逻辑连接”,是的,如果您在代码中首先使用不合逻辑的谓词。 否则, (,)/2
始终是目标的逻辑结合。
一个干净且逻辑上正确的方法是在无法确定的情况下抛出实例化错误 。
library(error)
,特别是must_be/2
进入声音方向后,继承的不合逻辑的谓词的不正确已经变得无法忍受,即使对于Prolog的临时用户:
?- must_be(list, X). Arguments are not sufficiently instantiated ?- must_be(list, [_|_]). Arguments are not sufficiently instantiated ?- must_be(list, [a,b,c]). true.
must_be/2
易于使用,是迈向更正确的逻辑程序的良好的第一步。 其他结构也出现在地平线上,我希望其他人对当前状态发表评论。
现在对于实际的措辞:抛开上面概述的基本问题,SWI文档中提到的争论是,检查最外面的函子是否足以将术语视为列表,或列表是否必须实际符合归纳定义一个列表,它是:
[]
是一个列表。 Ls
是一个列表,则'.'(_, Ls)
是一个列表。 请注意,在最近的SWI版本中, []
甚至不是原子,所以它再次打破了这个概念。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.