Prolog 如何让迷宫程序创建两个路线列表并将其打印到控制台?
尽管阅读了几个小时,我还是很难理解如何让我的程序生成并在控制台窗口中显示列出的路径。有人能提供建议吗?我基本上没有编程经验,prolog可能是我大部分的知识,这是不够的Prolog 如何让迷宫程序创建两个路线列表并将其打印到控制台?,prolog,Prolog,尽管阅读了几个小时,我还是很难理解如何让我的程序生成并在控制台窗口中显示列出的路径。有人能提供建议吗?我基本上没有编程经验,prolog可能是我大部分的知识,这是不够的 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). route(1, 2) :- member(1, [entry,a,b,c,d,e,f,exi
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).
route(1, 2) :-
member(1, [entry,a,b,c,d,e,f,exit]),
member(2, [entry,a,b,e,f,exit]).
route(X, Z, [entry,a,b,c,d,e,f,exit]) :- route(X, Z,[R],[entry,a,b,c,d,e,f,exit]).
route(X, Z, [exit,f,e,d,c,b,a,entry], [entry,a,b,c,d,e,f,exit]) :-
reverse(X, Y, [exit,f,e,d,c,b,a,entry], [entry,a,b,c,d,e,f,exit]),
route(Y, Z),
write(X).
使用如上所述的route
,以下代码按长度的递增顺序搜索路径
route(X, Y, [X, Y]) :- link(X,Y).
route(X, Y, [X | TY]) :-
link(X, T),
route(T, Y, TY).
因为我们并没有约束route
谓词来禁止重复节点,所以我们在路径的更长处有循环
编辑:
以下内容适用于SWI Prolog检查您的系统是否具有dif/2
。在这里使用maplist
可以增加路径长度搜索
?- length(X, _), route(entry,exit, X).
X = [entry, a, b, e, f, exit] ;
X = [entry, a, b, c, d, e, f, exit] ;
X = [entry, a, b, e, f, c, d, e, f, exit] ;
X = [entry, a, b, c, d, e, f, c, d, e, f, exit] ;
X = [entry, a, b, e, f, c, d, e, f, c, d, e, f, exit]
如果您没有dif
请在路径(T,Y,TY)后使用\+成员(X,TY)
这给
route(X, Y, [X, Y]) :- link(X,Y).
route(X, Y, [X|TY]) :-
link(X, T),
maplist(dif(X), TY), % X is different from all nodes in TY
route(T, Y, TY).
在两个解决方案之后,它将无休止地循环。如果希望停止这种情况,可以将路径长度限制为现有节点的数量
?- route(entry, exit, X).
X = [entry, a, b, e, f, exit] ;
X = [entry, a, b, c, d, e, f, exit] ;
我一直试图让它停止重复,但我似乎无法理解,我知道它必须被反转,但我不清楚它是如何工作的,或者反转它到底有什么作用。。。有什么想法吗?顺便说一句,谢谢你的帮助。你重复的意思是停止从入口到出口的路径中的循环?我真的不明白你说的倒车是什么意思。
?- between(2, 8, N), length(X, N), route(entry, exit, X).
N = 6,
X = [entry, a, b, e, f, exit] ;
N = 8,
X = [entry, a, b, c, d, e, f, exit] ;
false.