Ваша проверка 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).