以下是我要解决的问题:
编写并测试关系的子句: 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(..., ..., ...)] .
所以,我认为我很接近,因为我得到了类似于所需输出的东西,但看起来好像我陷入了循环而我无法脱身!谁能帮忙。请?