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

Prolog 测试该术语是一个不同变量的列表,prolog,iso-prolog,Prolog,Iso Prolog,在ISO Prolog中,测试不同变量列表的最紧凑和规范的方法是什么?让我们把这个元逻辑谓词称为\u varset/1 因此,如果它的参数是一系列完全不同的变量,那么它应该会成功。请注意,列表的末尾始终包含一个[]。如果变量在末尾,我们称之为部分列表(因此不是列表)。如果非变量项作为后缀出现,既不是[]也不是变量,那么这既不是部分列表,也不是列表 术语既不是部分列表也不是列表的一个显著特例是无限列表。它们至少包含两个相同的后缀,实际上它们拥有无限多个这样的后缀。无限列表超出了标准的范围-所有创建

在ISO Prolog中,测试不同变量列表的最紧凑和规范的方法是什么?让我们把这个元逻辑谓词
称为\u 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(包括Cor.2:2012)中的定义。

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

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

看起来不错!你能解释一下为什么你没有用一个
=
来代替
=
?这个测试用例
?-是变量集([a,f(B)]。
当使用(=)/2时,它回答了
B=f(B)。
。诚然,我只是根据直觉首先使用了(==)/2,在你的评论之后再次进行测试…如果使用
unified\u with\u occurrence\u check
代替
=
?从逻辑上讲,我认为它可能会破坏轨迹。。。但我对内部机制了解不够,无法进一步推动这一假设……“破坏线索”,这是一些性能特征。但除此之外,成功后的变量不能实例化吗?