如何从一个节点返回图表中的边缘列表?

时间:2016-12-05 17:26:15

标签: algorithm graph prolog

以下是我要解决的问题:

  

编写并测试关系的子句:   listForPath(X,Y,L)%X和Y之间的路径是列表L.

以下是我们正在使用的图表:

edge(a,b,2).
edge(b,c,2).
edge(c,d,2).
edge(d,a,2).

以及

edge(a, c, 2). 
edge(b, e, 2).
edge(d, e, 1).
edge(c, d, 2).
edge(a, b, 2). 
edge(a, d, 3).
edge(b, a, 1).
edge(a, a, 2).

我们的预期输出如下:

?- listForPath(a,d,L).

L = [edge(a,b,2),edge(b,c,2),edge(c,d,2)] ;
L = [edge(a,b,2),edge(b,c,2),edge(c,d,2),edge(d,a,2),edge(a,b,2),edge(b,c,2),edge(c,d,2)] ;

我已经玩了一段时间了,这就是我所拥有的:

listForPath(X,Y,L):-
  edge(X,Y,Z),
  L=[edge(X,Y,Z)].

listForPath(X,Y,L):-
  edge(X,Z,W),
  listForPath(Z,Y,L2),
  append([edge(X,Z,W)],L2,L).

由此,我得到了这个输出:

89 ?- listForPath(a,d,L).
L = [edge(a, d, 3)] ;
L = [edge(a, b, 2), edge(b, c, 2), edge(c, d, 2)] ;
L = [edge(a, b, 2), edge(b, c, 2), edge(c, d, 2)] ;
L = [edge(a, b, 2), edge(b, c, 2), edge(c, d, 2), edge(d, a, 2), edge(a, d, 3)] ;
L = [edge(a, b, 2), edge(b, c, 2), edge(c, d, 2), edge(d, a, 2), edge(a, b, 2), edge(b, c, 2), edge(c, d, 2)] ;
L = [edge(a, b, 2), edge(b, c, 2), edge(c, d, 2), edge(d, a, 2), edge(a, b, 2), edge(b, c, 2), edge(c, d, 2)] ;
L = [edge(a, b, 2), edge(b, c, 2), edge(c, d, 2), edge(d, a, 2), edge(a, b, 2), edge(b, c, 2), edge(c, d, 2), edge(d, a, 2), edge(..., ..., ...)] .

所以,我认为我很接近,因为我得到了类似于所需输出的东西,但看起来好像我陷入了循环而我无法脱身!谁能帮忙。请?

0 个答案:

没有答案