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

`nth0/3` behaviour when N is unbound

如果我在 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 标准,哪一种行为是正确的。

(我知道 stack-overflow 不允许引用问题,所以,我不会要求 link 到标准,但我希望如果我问:is ISO standard公开可用?如果没有,是否有等效的 RFC?)。

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

N is neither a variable nor an integer
type_error(integer, N).

现在对 N 的实例化是否有限制(在这种情况下不是,但让我们假设),然后会出现错误情况:

N is a variable
instantiation_error.

自 1983 年以来,谓词 nth0/3 曾经是 DECsystem 10 库 listut(也写成 ListUt)的一部分。最初,该定义仅打算与 N 是一个整数。然而,我们现在遇到的错误还不存在,系统简单地(错误地)因未实例化的变量而失败。

它后来在 1984 年左右被 Quintus Prolog 采用(并更正)。

现在,我们有一个详尽的 error classification 能够捕获各种错误情况之间的细微语义差异。

More谓词在标准中是如何定义的。

如果我没看错的话,上面写着,

nth0(?Index, ?List, ?Elem)

"...如果 Index 不是整数或 unbound。"

在示例中,Index 未绑定:

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

那你是不是误读了手册?

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