- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是第一个观察结果:
?- is_list([]), is_list([_,_,_]).
true.
?- [] = _, [_,_,_] = _.
true.
is_list/1
实现,使得
?- is_list(_).
false.
?- is_list([_|_]).
false.
_
能明确统一用一个list吗?从逻辑上讲,它是
true
不是更合理吗? ?
is_list/1
,一张纸条说:
In versions before 5.0.1,
is_list/1
just checked for[]
or[_|_]
andproper_list/1
had the role of the currentis_list/1
. The current definition conforms to the de facto standard.
最佳答案
正如您正确观察到的,is_list/1
是 不健全 ,或者更确切地说 不完整 ,因为它错误 说当提出最一般的查询时,没有任何解决方案。
?- is_list(Ls)。
错误的。
不存在列表? 来吧!
这个不幸的特性是所有遗传类型检查谓词(如 atom/1
)共有的。 , integer/1
等等,当这些谓词被构思出来时,他们的错误就已经很明显了,但在将那些正确反对他们建议的语义的人标记为“纯粹主义者”(当时,该词缺乏该词所获得的互补性)之后,他们的错误已经很明显了。
像这样的案例:
?- is_list(Ls), Ls = []。
错误的。
?- Ls = [], is_list(Ls)。
ls = []。
从逻辑的角度清楚地说明,这种非单调测试从根本上打破了某些东西。 “Prolog 的 (,)/2
不是逻辑合取”,是的,如果您在代码中首先使用不合逻辑的谓词。否则,(,)/2
始终是目标的逻辑结合。
一个干净且逻辑上正确的出路是抛出 实例化错误 在尚不能确定的情况下。library(error)
特别是 must_be/2
即使对于 Prolog 的临时用户来说,在继承的不合逻辑谓词的不正确性变得无法忍受之后,进入一个合理的方向:
?- must_be(list, X)。
参数未充分实例化
?- must_be(list, [_|_])。
参数未充分实例化
?- must_be(list, [a,b,c])。
真的。must_be/2
易于使用,是迈向更正确的逻辑程序的良好开端。其他构造也出现在地平线上,我希望其他人对当前状态发表评论。
现在对于实际措辞:撇开上面概述的基本问题,SWI 文档中提到的争论是检查最外层仿函数是否足以将术语视为列表,或者列表是否必须实际上符合归纳定义一个列表,它是:
[]
是一个列表。 Ls
是一个列表,然后 '.'(_, Ls)
是一个列表。 []
甚至不是一个原子,所以它再次打破了这个概念。
关于list - is_list/1 和自由变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38147574/
这是第一个观察结果: ?- is_list([]), is_list([_,_,_]). true. 这是另一个观察结果: ?- [] = _, [_,_,_] = _. true. 因此,为什么要i
我是一名优秀的程序员,十分优秀!