如何从包含流量线的文件构建图表?

时间:2012-12-24 12:19:34

标签: list graph prolog

我在Prolog的项目中苦苦挣扎。我的问题是,给定一个包含line(NameOfLine, Type, ListOfStations)形式的流量线的文件。例如:

line(m1, train, [a,b,c,d,e])
line(m2, train, [h,e,j,i])
...

其中e是两条线的交叉站(实线文件非常复杂,包含十几条带有数百个站的线)。我必须做经典的图形问题,比如找路由,计算成本等。

我知道我必须在开始之前构建一个无向图,所以我尝试过这样的事情:

adjacent(X,Y,[X,Y|_]).
adjacent(X,Y,[_|T]) :- adjacent(X,Y,T).

find_edge(LArret) :- forall(adjacent(X, Y, LArret), assert(edge(X,Y))).

connected(X,Y) :- edge(X,Y) ; edge(Y,X).

graph :-
    forall(ligne(_,_,L),  find_edge(L)).

但是我并没有像预期的那样获得所有优势。你们能给我一些建议吗?或者我最初在解决这类问题时错了吗?


补充问题: 感谢提出的解决方案,我终于成功定义了边缘。然后我尝试了这个算法经典来找到A和B之间的路径,但有时候搜索似乎没有结束,有时候程序仍然停留在搜索中。

connected(X,Y) :- edge(X,Y) ; edge(Y,X).

path(A,B,Path) :-
       travel(A,B,[A],Q), 
       reverse(Q,Path).

travel(A,B,P,[B|P]) :- 
       connected(A,B).
travel(A,B,Visited,Path) :-
       connected(A,C),           
       C \== B,
       \+member(C,Visited),
       travel(C,B,[C|Visited],Path). 

我认为原因可能是图中的循环或者搜索中的无限循环,我怎样才能避免这种问题,但仍然可以找到所有可能的路径?

1 个答案:

答案 0 :(得分:0)

我能够将以下代码与您的line/3定义一起使用来创建edge/2定义列表:

adjacent(X,Y, [X,Y|_]).
adjacent(X,Y, [_|T]) :- adjacent(X,Y, T).

adjacent_lines(X,Y) :- line(_,_,L), adjacent(X,Y, L).

:- forall(adjacent_lines(X, Y), assert(edge(X, Y))).

它创建了edge/2事实所指定的所有适用且有效的line/3个事实 (至少,SWI-Prolog)