序言列表和找到图路径的递归

时间:2018-08-29 22:40:10

标签: list recursion graph prolog

我是Prolog的新手,但我坚持此练习,您能给我一些如何简单解决问题的建议吗?

给出一个图,找到从Node1到Node2的任何路径,并返回路径列表,如果路径很多,则必须一一显示,如示例输出所示。 如果存在e(N1,N2),则存在从N1到N2的路径。 如果可以从N1到达N3,则从N1到N2的路径是有效的,然后递归地存在从N2到N3的路径。

find_any_path(+Graph, +Node1, +Node2, -ListPath)

预期输出如下:

find_any_path([e(1,2),e(1,3),e(2,3)],1,3,L).
– L/[e(1,2),e(2,3)]
– L/[e(1,3)]

这是我的实现方式

reaching([], N, []):-!.
reaching(G, N, L):-findall(X, member(e(N,X), G), L).

dropAny(X,[X|T],T).
dropAny(X,[H|Xs],[H|L]):-dropAny(X,Xs,L).

find_any_path([],N1,N2,[]).
find_any_path(G,N1,N2,L):-  member(e(N1,N2),G),
                            reaching(G,N1,R), %R=[2,3]
                            dropAny(N2,R,M), %M=[2] numbers found between N1 and N3
                            anypath(G,N1,N2,M,L).

find_any_path(G,N1,N2,[],[e(N1,N2)]).
find_any_path(G,N1,N2,[M|Ms],[e(N1,M),e(M,N2)|L]):- member(e(M,N2),G),
                                                find_any_path(G,N1,N2,Ms,L).

以下显示的输出与预期结果不同:

L / [e(1,2),e(2,3),e(1,3)]

0 个答案:

没有答案
相关问题