fal*_*lse 14 prolog iso-prolog
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.
Run Code Online (Sandbox Code Playgroud)
SWI-Prolog中的这个简单定义似乎可以满足要求
is_varset(Vs) :- /*is_list(Vs),*/ term_variables(Vs, T), T == Vs.
Run Code Online (Sandbox Code Playgroud)