`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 或更大。
如果我在 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 或更大。