Prolog 解决特定循环

Prolog 解决特定循环,prolog,Prolog,这是找路迷宫 我要像这样打印出来 near(a1,b1). near(b1,c1). near(c1,d1). near(d1,e1). near(e1,f1). near(f1,g1). near(a1,a2). near(a2,a3). near(a3,a4). near(a4,a5). near(a5,a6). near(a6,a7). near(a7,a8). near(a8,a9). near(b1,b2). ne

这是找路迷宫

我要像这样打印出来

near(a1,b1).    near(b1,c1).    near(c1,d1).    near(d1,e1).    near(e1,f1).
near(f1,g1).    near(a1,a2).    near(a2,a3).    near(a3,a4).    near(a4,a5).
near(a5,a6).    near(a6,a7).    near(a7,a8).    near(a8,a9).    near(b1,b2).
near(b2,b3).    near(b3,b4).    near(b4,b5).    near(b5,b6).    near(b6,b7).
near(b7,b8).    near(b8,b9).    near(c4,d4).    near(d1,e4).    near(e4,f4).
near(f4,g4).    near(g4,h4).    near(g1,g2).    near(g2,g3).    near(g3,g4).
near(f4,f5).    near(f5,f6).    near(f6,f7).    near(f7,f8).    near(f8,f9).
near(a6,b6).    near(b6,c6).    near(a9,b9).    near(b9,c9).    near(c9,d9).
near(d9,f9).    near(f9,g9).    near(g9,h9).    near(h9,i9).

path(X,X).
path(X,Y):-
   near(X,Z), path(Z,Y),
   write(X),
   write('->'),
   write(Z).

maze(X,Y):-findall(X,path(X,Y),Path_List),write(Path_List).
并显示其他4条路线


我想用割伤?或者回溯。但是我不能碰这段代码。

一般来说,写出回溯算法实际解决问题所需的中间步骤是一项非常无用的技术。path/2second子句产生的大多数输出是“noise”

这也是导致trace/0成为Prolog主要调试工具的动机。跟踪携带附加信息,如嵌套级别,这对于理解输出是必不可少的

然后,我建议去掉path/2中的write,添加一个参数“带回”路径,并编写一个服务谓词来打印:

 Route1 [18] a1 -> b1 -> c1 -> d1 -> e1 -> f1 -> g1 -> g2 -> g3 -> g4 -> h4 -> h5 -> h6 -> h7 -> h8 -> h9 -> i9
不是很吸引人,但肯定更有用

请注意,路径/3(以及路径/2)将在存在循环时永远循环

使用此代码段进行编辑

path(X,X, [X]).
path(X,Y, [X|Cs]):-
    near(X,Z), path(Z,Y, Cs).

maze(X,Y):- forall(path(X,Y,Ps),writeln(Ps)).

?- maze(a1,i9).
[a1,b1,c1,d1,e4,f4,f5,f6,f7,f8,f9,g9,h9,i9]
[a1,b1,b2,b3,b4,b5,b6,b7,b8,b9,c9,d9,f9,g9,h9,i9]
[a1,a2,a3,a4,a5,a6,a7,a8,a9,b9,c9,d9,f9,g9,h9,i9]
[a1,a2,a3,a4,a5,a6,b6,b7,b8,b9,c9,d9,f9,g9,h9,i9]
true.
然后是
?-maze_g(a1,i9)。
,得到

maze_g(X,Y) :-
    graph_window(maze_g(X,Y),[]).

maze_g(X,Y,G) :-
    forall(path(X,Y,Ns),
        (maplist(make_node(G),Ns,Ps)
        ,nodes_chain(Ps,Cs)
        ,make_edges(G,Cs))).