ISO Prolog中用于测试不同变量列表的最紧凑和规范的方法是什么?我们称之为元逻辑谓词is_varset/1
。
如果它的参数是一个完全不同的变量列表,它应该会成功。请注意,列表的末尾始终包含[]
。如果变量在最后,我们将其称为部分列表(因此不是列表)。如果非变量项作为后缀既不是[]
也不是变量,则既不是部分列表也不是列表。
一个明显的特殊情况,一个术语既不是部分列表也不是列表是无限列表。它们包含至少两个相同的后缀,实际上它们拥有无限的后缀。无限列表超出了标准的范围 - 所有创建它们的尝试都会导致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中的overview of the built-ins,包括Cor.2:2012。
答案 0 :(得分:8)
SWI-Prolog中的这个简单定义似乎完成了要求
is_varset(Vs) :- /*is_list(Vs),*/ term_variables(Vs, T), T == Vs.