进行一些练习;我正在尝试创建一个模拟迷宫的程序,显示入口和出口之间的每一条可能的路线。代码创建其中一个列表,但它不会同时显示这两个列表,并且在找到它们时也不会停止(路由1:入口,a,b,e,f,出口和路由2:进入,a,b,c,d,e,f,出口(,并不断循环到越来越大的路由中。
% length(X, _), route(entry,exit, X).
%Facts, indicating an adjacent link between one room and another.
link(entry, a).
link(a, b).
link(b, c).
link(c, d).
link(d, e).
link(b, e).
link(e, f).
link(f, c).
link(f, exit).
%Searches for the path in an increasing order of length 'route'.
route(X, Y, [X, Y]) :- link(X,Y).
route(X, Y, [X | TY]) :- link(X, T), route(T, Y, TY).
控制台示例:
|?-路线(入口、出口、A(。A=[入口,A,b,c,d,e,f,出口];
A=[入口,A,b,c,d,e,f,c,d,e,f,出口];
A=[入口,A,b,c,d,e,f,c,d,e,f,c,d,e,f,出口];
A=[入口,A,b,c,d,e,f,c,d,e,f,c,d,e,f,c,d,e,f,出口]
有人能帮我吗?
使迭代深化路径搜索在第一次搜索后停止寻找进一步成功的最简单方法是在目标结束时进行切割:
?- length(X, _), route(entry,exit, X), !.
X = [entry,a,b,e,f,exit].
一旦成功,Prolog的";手指;超过!
,任何重做和向左向后移动手指的尝试都被禁止。所以Prolog在第一次成功后就停止了。
对于多个解决方案:希望有类似库(solution_equences(的东西。
我们有limit(+Count,:Goal)
:
?- limit(2,route(entry, exit, A)).
A = [entry,a,b,c,d,e,f,exit] ;
A = [entry,a,b,c,d,e,f,c,d,e,f,exit].
极限的源代码,它是用Prolog编写的。它使用了改变状态的谓词,但是可以在没有这些谓词的情况下编写吗?
1。第一个path predicate
是基本情况。
2.第二个path predicate
为给定的Start
和End Node
搜索所有可能的路由。
link(entry, a).
link(a, b).
link(b, c).
link(c, d).
link(d, e).
link(b, e).
link(e, f).
%link(f, c).
link(f, exit).
path(Node,Node,[Node]):-!.
path(StartN,EndN,[StartN|List]):-
link(StartN,NextN),
path(NextN,EndN,List).
示例:
?-path(entry,exit,Route).
Route = [entry, a, b, c, d, e, f, exit]
Route = [entry, a, b, e, f, exit]
?-path(entry,a,Route).
Route = [entry, a]
?-path(entry,b,Route).
Route = [entry, a, b]
?-path(entry,c,Route).
Route = [entry, a, b, c]
false
?-path(entry,d,Route).
Route = [entry, a, b, c, d]
false
?-path(entry,e,Route).
Route = [entry, a, b, c, d, e]
Route = [entry, a, b, e]
?-path(entry,f,Route).
Route = [entry, a, b, c, d, e, f]
Route = [entry, a, b, e, f]
注意:我必须注释链接(f,c(才能获得正确的退出路线,否则会超出堆栈限制,我不知道为什么。