N未绑定时的'nth0 / 3`行为

时间:2015-05-29 12:16:42

标签: prolog swi-prolog iso-prolog

如果我在SWI Prolog中输入“nth0”查询,结果是:

?- nth0(N,X,a).
N = 0,
X = [a|_G282] ;
N = 1,
X = [_G281, a|_G285] ;
N = 2,
X = [_G281, _G284, a|_G288] ;
... etc

然而,SWI手册说:

Errors
  type_error(integer, Index) if Index is not an integer or unbound.

所以,如果我对这个文本的理解是正确的(?),那么似乎应该触发错误而不是之前的结果。

此外,我想知道哪一项行为是正确的,考虑到ISO标准。

(我知道堆栈溢出不允许引用的问题,所以,我不会要求标准的链接,但我希望不要违反规则,如果我问:ISO标准公开可用吗?如果没有,有任何等效的RFC?)。

2 个答案:

答案 0 :(得分:4)

如果我读得正确,那就是

nth0(?Index, ?List, ?Elem)

“......如果索引不是整数或未绑定。”

在示例中,索引未绑定:

?- nth0(N, L, E).
N = 0,
L = [E|_G1103] ;
N = 1,
L = [_G1102, E|_G1106] ;
N = 2,
L = [_G1102, _G1105, E|_G1109] .

那么你会误读手册吗?

只是为了确保:手册应该被理解为“......如果索引不是(或(整数,未绑定))”。 索引未绑定时的作用是它开始枚举Index可以为0或更大的有效列表。

答案 1 :(得分:3)

谓词nth0/3不是ISO Prolog的一部分,因此没有明确的参考。但是,标准中定义了报告错误的方式和时间。特别是,由于参数未被充分实例化,因此从不报告类型错误。 SWI手册中的具体配方有点不幸。应该阅读nth0(N, Xs, E)

  

N既不是变量也不是整数
   - type_error(integer, N)

现在会对N实例化有限制(在这种情况下不是这样,但我们假设它),那么就会出现错误情况:

  

N是变量
   - instantiation_error

自1983年以来,谓词nth0/3曾经是DECsystem 10库listut(也写成ListUt)的一部分。最初,该定义仅用于{{1是一个整数。但是,正如我们现在所做的那样,错误现在还不存在,而且系统只是(并且错误地)失败了,并且没有实例化的变量。

后来Quintus Prolog在1984年左右通过(并更正)。

现在,我们有一个精心设计的error classification能够捕捉各种错误情况之间的细微语义差异。

More标准中如何定义谓词。