Бесконечный цикл Prolog: двунаправленные предикаты

#prolog

#пролог

Вопрос:

Я использую https://swish.swi-prolog.org / как онлайн-песочница Prolog, но с помощью простого кода ниже, где я пытаюсь определить двунаправленный оператор, чтобы проверить, есть ли 2 атома (я думаю?) поделитесь с другом, программа, похоже, застряла в бесконечном цикле. Что я сделал не так?

 friends(lisa, jack).
friends(lisa, jane).

friends(X, Y) :- friends(Y, X).

mutual_friends(X, Y) :- friends(X, Z), friends(Y, Z).
 

Когда я запрашиваю mututal_friends(jack, jane) , я получаю бесконечный цикл.

Ответ №1:

Дело в том, что ваше правило может расширяться бесконечно. Вы должны определить friend_ предикат для определения дружеских отношений, а затем friend(X, Y) :- friend_(X, Y) ; friend_(Y, X).

Комментарии:

1. Зачем добавлять подчеркивание? Я определяю два полностью отдельных предиката? Просто дублирование кода? Потому что мне это не нравится.

2. @HarithShah вы ничего не дублируете, вы просто заставляете работать двунаправленные отношения, не вызывая бесконечных вычетов

3. Но я прав, говоря, что вы определяете скрытый friend_(X, Y) предикат, а затем используете friend(X, Y) предикат, чтобы замаскировать его и заставить работать двунаправленную функциональность, верно? Или подчеркнутый предикат является чем-то особенным и поддерживается в Prolog ?…

4. @HarithShah действительно