如果我在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?)。
该谓词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
)。最初,该定义仅打算N
作为整数使用。但是,错误(如我们现在所看到的)尚不存在,并且系统只是(并且错误地)由于未实例化的变量而失败。
后来在1984年左右被Quintus Prolog采纳(并更正)。
现在,我们有一个精心设计的错误分类,它能够捕获各种错误情况之间的细微语义差异。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句