Пролог попадает в бесконечный цикл

Я пытаюсь определить правило "Друг моего друга - мой друг" в прологе, и у меня есть следующий код:

friends(john,jake).
friends(mike,hans).
friends(hans,robert).
friends(robert,angela).

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

friendship(X,Y):- 
    mutual_friendship(X,Y),!;
    mutual_friendship(Y,Z), friendship(Z,X).

И он делает это довольно хорошо, он способен обнаружить дружбу между Майком и Анжелой через Ганса и Роберта, проблема в том, что когда я пытаюсь найти дружбу между Джоном и Анжелой, например, которые не связаны, но программа попадает в бесконечный цикл.

1 ответ

mutual_friendship/2 я полагаю, это не имеет к этому никакого отношения.

friendship(X,Y):-
    ( friends(X,Y)
    ; friends(X,Z), friendship(Z,Y)
    ).

И за данные факты

friends(john,jake).
friends(mike,hans).
friends(hans,robert).
friends(robert,angela).

мы могли бы получить

?- friendship(john,angela).
false.

?- friendship(mike,angela).
true .
Другие вопросы по тегам