所以我试图使用递归方法来找到两个人之间的路径。这是快速背景:我定义了一些事实in(X,Y)
。那个节目谁是相关的,即。in(person1,project1)
, , in(person2,project1)
, 等等。现在任何两个人如果他们在同一个项目中,或者他们之间有一个人的链接路径,他们就是相关的。例如 p1 在 A 上工作 p2 在 A 和 B 上工作,p3 在 B 上工作,因此有一条从 p1 到 p3 通过 p2 的路径。这些路径可以是任意长度。
我正在尝试以递归方式解决这个问题(看不到任何其他方式),但是有一个烦人的问题:
related(A,B) :-
in(A,X),
in(B,X),
not(A=B).
chain(A,B) :-
related(A,B).
chain(A,B) :-
related(A,Y),
chain(Y,B).
问题是路径可以重演。它可以从 p1 到 p2 无限次返回 p1。一个人在路径上的次数不应超过 1 次。
我试图用我添加的列表来解决这个问题。如果某人已在列表中,则无法再次添加:
related(A,B,L) :-
in(A,X),
in(B,X),not(A=B).
chain(A,B,L) :-
related(A,B,L).
chain(A,B,L) :-
related(A,Y,L),
not(member(Y,L)),
append(L,[Y],Q),
chain(Y,B,Q).
它有点工作,但导致了大量随机错误,重复一些人多次,有些人只重复一次,然后失败。这种方法看起来对吗?我完全使用列表错误吗?
谢谢你。