#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 действительно