Как проверить, содержит ли термин переменную? - PullRequest
1 голос
/ 01 июля 2019

Я очень новичок в прологе.Я пытаюсь реализовать предикат occurs(Variable, Term), который завершается успешно, если переменная пролога Variable встречается в термине пролога Term и не дает результата в противном случае.

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

Я пытался преобразовать термин в список, а затем сравнивать, он всегда возвращаетправда.

любая помощь будет оценена.

1 Ответ

1 голос
/ 01 июля 2019

Ваша проверка 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).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...