测试该术语是不同变量的列表

时间:2014-12-29 00:51:18

标签: prolog iso-prolog

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。

1 个答案:

答案 0 :(得分:8)

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

is_varset(Vs) :- /*is_list(Vs),*/ term_variables(Vs, T), T == Vs.