所以我尝试用递归的方法来寻找两个人之间的路径。这是快速背景:
我定义一些事实in(X,Y)
。这表明谁是相关的,即。in(person1,project1)
, in(person2,project1)
等等。现在,如果任何两个人彼此在同一个项目中,或者他们之间存在人员链接路径,那么他们就是相关的。例如,p1 在 A 上工作,p2 在 A 和 B 上工作,p3 在 B 上工作,因此存在从 p1 通过 p2 到 p3 的路径。这些路径可以是任意长度。
我试图递归地解决这个问题(没有看到任何其他方法),但有一个恼人的问题:
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).
它确实有效,但导致了大量随机错误,有些人重复了多次,有些人只重复了一次,然后就失败了。这种方法看起来正确吗?我使用列表完全错误吗?
谢谢。