我对序言很陌生。我正在尝试实现谓词occurs(Variable, Term)
,如果序言变量Variable,该谓词将成功
出现在序言术语Term中,否则失败。
occurs(Variable,Term) :-
Term =.. List.
occurs(Variable, List).
occurs(Variable,[_|L]) :-
occurs(Variable,L).
我尝试将Term转换为列表,然后进行比较,它始终返回true。
将提供任何帮助。
答案 0 :(得分:1)
由于您写了一个occurs/2
满足所有值的事实,因此无论术语是什么,您的occurs(Variable, List).
检查都将成功。
基本上有两种情况需要考虑:
因此,我们可以将其实现为:
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).