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

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)

以下是ISO/IEC 13211-1:1995中内置插件概述,包括Cor.2:2012.

Cap*_*liC 8

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

is_varset(Vs) :- /*is_list(Vs),*/ term_variables(Vs, T), T == Vs.
Run Code Online (Sandbox Code Playgroud)

  • 看起来不错!你能证明你为什么不用`=`来代替`==`吗? (2认同)
  • 这个测试用例`? - is_varset([A,f(B)]).`当使用(=)/ 2时,它回答`B = f(B).`.不可否认,我基于直觉首先使用了(==)/ 2,并在评论后再次测试... (2认同)
  • 如果使用`unify_with_occurs_check`来代替`==`怎么办? (2认同)
  • 在逻辑上有效,我认为它可能会破坏这条线索...但我不知道内部工作是否足以推动这一假设...... (2认同)
  • "捣乱",这是一些表现特征.但除此之外,成功变量实例化后难道不会发生吗? (2认同)