如何检查术语是否包含变量?

时间:2019-06-30 22:02:52

标签: prolog

我对序言很陌生。我正在尝试实现谓词occurs(Variable, Term),如果序言变量Variable,该谓词将成功 出现在序言术语Term中,否则失败。

occurs(Variable,Term) :-
    Term =.. List.
occurs(Variable, List).
occurs(Variable,[_|L]) :- 
    occurs(Variable,L).

我尝试将Term转换为列表,然后进行比较,它始终返回true。

将提供任何帮助。

1 个答案:

答案 0 :(得分:1)

由于您写了一个occurs/2满足所有值的事实,因此无论术语是什么,您的occurs(Variable, List).检查都将成功。

基本上有两种情况需要考虑:

  1. 该术语是一个变量,该变量等于我们要查询的变量;和
  2. 该术语是一个函子,其中一个参数包含该变量。

因此,我们可以将其实现为:

occurs(Variable, Variable) :-
    var(Variable).
occurs(Variable, Term) :-
    \+ var(Term),
    Term =.. [_|Args],
    occurring(Args, Variable).

occurring([H|_], Variable) :-
    occurs(Variable, H).
occurring([_|T], Variable) :-
    occurring(T, Variable).

但是,我们可以使用term_variables/2 [swi-doc],然后执行member/2 [swi-doc]来枚举列表:

occurs(Variable, Term) :-
    term_variables(Term, Vars),
    member(Variable, Vars).