Loops 陷入无限循环的Prolog

Loops 陷入无限循环的Prolog,loops,recursion,prolog,infinite,transitivity,Loops,Recursion,Prolog,Infinite,Transitivity,我试图在prolog中定义“我朋友的朋友就是我的朋友”的规则,我有以下代码: 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_f

我试图在prolog中定义“我朋友的朋友就是我的朋友”的规则,我有以下代码:

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).

它做得很好,它能够通过汉斯和罗伯特来检测迈克和安吉拉之间的友谊,问题是当我试图找到约翰和安吉拉之间的友谊时,比如说,他们没有联系,但程序陷入了一个无限循环。

相互的友谊/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 .

我明白你的意思,但是考虑到已经定义的朋友,这个规则肯定不会与任何人匹配吗?有些不对劲。但你现在能做些什么吗?(迈克,安吉拉)@цММцМАЛББb的解决方案(+1)是不对称但有限的(这就是为什么
友谊(mike,angela)
有效,而
友谊(angela,mike)
无效)。原始是对称的,但是无限的。如果我们想要对称性和有限性,我们必须要么在顶部处理不对称性(在我看来更优雅),要么跟踪我们在无向图中穿过的边。你说的“顶部处理不对称性”是什么意思?