如果我在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?)。
答案 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标准中如何定义谓词。