Loops 陷入无限循环的Prolog
我试图在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
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)
无效)。原始是对称的,但是无限的。如果我们想要对称性和有限性,我们必须要么在顶部处理不对称性(在我看来更优雅),要么跟踪我们在无向图中穿过的边。你说的“顶部处理不对称性”是什么意思?