gpt4 book ai didi

list - is_list/1 和自由变量

转载 作者:行者123 更新时间:2023-12-04 18:32:32 25 4
gpt4 key购买 nike

这是第一个观察结果:

?- is_list([]), is_list([_,_,_]).
true.

这是另一个观察结果:
?- [] = _, [_,_,_] = _.
true.

因此,为什么要 is_list/1实现,使得
?- is_list(_).
false.

或者
?- is_list([_|_]).
false.

_能明确统一用一个list吗?从逻辑上讲,它是 true 不是更合理吗? ?

SWI-Prolog's documentation for is_list/1 ,一张纸条说:

In versions before 5.0.1, is_list/1 just checked for [] or [_|_] and proper_list/1 had the role of the current is_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)是一个列表。

  • 请注意,在最近的 SWI 版本中, []甚至不是一个原子,所以它再次打破了这个概念。

    关于list - is_list/1 和自由变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38147574/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com