所以我试图使用递归方法来找到两个人之间的路径。这里是快速背景: 我定义了一些事实in(X,Y)
。这表明谁是相关的,即。 in(person1,project1)
,in(person2,project1)
等等。现在,任何两个人如果在同一个项目中相互关联,或者他们之间存在人与人之间的链接路径。例如p1工作在A p2上工作在A和B上,p3工作在B上,因此有一条从p1到p3到p2的路径。这些路径可以是任意长度。在递归中使用Prolog列表
我试图递归解决这个(没有看到任何其他方式),但有一个恼人的问题:
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无尽的时代。一个人不应该在路上超过一次。
我试图解决这个问题,我添加了一个列表。如果一个人已经在列表中,他们不能再次添加:
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).
它有点工作,但造成一吨的随机误差,重复一些人多次,有的只有一次,然后失败。这种方法看起来不错吗?我完全使用列表错误吗?
谢谢。
所有的链都是优选的。真正的问题是,一个连锁店可以多次拥有同一个人,需要有一种方法来防止这种情况发生。稍后我会在家时发布样本输出。 我知道如何在Java,C,C#等中轻松完成这个任务,但是prolog正在抛出一个循环。 – Mike