13

ISO Prolog 中测试不同变量列表的最紧凑和规范的方法是什么?我们称之为元逻辑谓词is_varset/1

因此,如果它的参数是一个完全不同的变量列表,它应该会成功。请注意,列表始终[]在其末尾包含 a。如果变量位于末尾,我们称其为部分列表(因此不是列表)。如果一个非变量项作为既不是[]也不是变量的后缀出现,那么这既不是部分列表也不是列表

术语既不是部分列表也不是列表的一个值得注意的特殊情况是无限列表。它们包含至少两个相同的后缀,实际上它们拥有无限这样的后缀。无限列表超出了标准的范围——所有创建它们的尝试都会导致结果未定义的 STO 统一。尽管如此,一些系统仍然支持它们,因此对于那些无限列表来说,理想情况下is_varset/1应该会失败。

?- is_varset([A|nonlist]).
false.

?- is_varset([A,B]), is_varset([B,A]).
true.

?- is_varset([A,B,A]).
false.

?- is_varset([A,f(B)]).
false.

?- is_varset([A|_]).
false.

?- L = [_|L], is_varset(L).  % may loop, should rather terminate
false.

以下是ISO/IEC 13211-1:1995 中内置函数的概述,包括 Cor.2:2012。

4

1 回答 1

8

SWI-Prolog 中的这个简单定义似乎满足了要求

is_varset(Vs) :- /*is_list(Vs),*/ term_variables(Vs, T), T == Vs.
于 2014-12-29T09:30:53.260 回答