有没有什么方法可以防止这段代码中的循环。
move(a,b).move(b,a).move(a,c).move(b,d).move(b,e).move(d,h).move(d,i).move(e,j).move(e,k).move(c,f).move(c,g).move(f,l).move(f,m).move(g,n).move(g,o).goal(n).goSolveTheMaze(Start,Way) :- dfs(Start, Way),!.dfs(Goal, [Goal]) :- goal(Goal),!.dfs(Start, [Start|Way]) :- move(Start, N), dfs(N, Way).
所以当move(a,b)
移动到(b,c)
时,不要返回到(b,a)
,当运行goSolveTheMaze(a,path)
时。输出应该是path=[a,c,g,n]
。
回答:
如果你给dfs
添加第三个参数,这个参数是一个你已经访问过的地点列表呢?你可以使用\+/1和member/2来避免返回到你已经去过的地方。
例如,如果你使用以下代码:
move(a,b).move(b,a).move(a,c).move(b,d).move(b,e).move(d,h).move(d,i).move(e,j).move(e,k).move(c,f).move(c,g).move(f,l).move(f,m).move(g,n).move(g,o).goal(n).goSolveTheMaze(Start,Way) :- dfs(Start, Way, [Start]),!.dfs(Goal, [Goal], _) :- goal(Goal),!.dfs(Start, [Start|Way], Visited) :- move(Start, N), \+ member(N, Visited), dfs(N, Way, [N|Visited]).
那么查询:
?- goSolveTheMaze(a, X).
将产生结果:
X = [a, c, g, n]
回应评论“可以告诉我\+是什么意思吗?”的更新:
\+谓词在其参数无法被证明时为真。因此在上面的例子中,\+ member(N, Visited)
这行代码的意思是“当N不是Visited列表中的成员时”。