我需要帮助来解决迷宫路径。提前致谢
link(a,b).
link(b,c).
link(c,d).
link(f,c).
link(b,e).
link(d,e).
link(e,f).
编写一个谓词,该谓词定义任意两个相邻点(例如 X 和 Y)之间的路由,基于它们与递归谓词之间存在链接的事实,该谓词涵盖了任何两个非相邻点(例如 X 和 Z)之间路由的更一般情况,方法是确定 X 与迷宫中的第三个点(例如 Y)和路线之间存在链接的事实在 Y 和 Z 之间。
两个特殊的房间 - 一个连接到"a"并称为"入口",另一个连接到"f"并称为"出口"。 添加一组事实以反映两个新房间。使用任务 1 中的谓词,编写一个谓词,用于查找入口和出口之间的所有可能路由,并创建已访问房间的列表。编写另一个谓词,在每次迭代结束时或在每次到达 Exit 时在交互式控制台中显示列表。编写显示预期结果和实际结果的测试计划。评估此解决方案并确定任何潜在问题以及可能导致其发生的情况。
此解决方案的问题是循环。如果我想链接(a,f),prolog说不。我的谓词有什么问题吗?
| ?- 链接(a,b).链接(b,c)。链接(c,d)。链接(f,c)。链接(b,e)。链接(d,e)。链接(e,f)。
route(X,Y):- link(X,Y).route(X,Y):- link(X,Z), route(Z,Y).是的
是的
是的
是的
是的
是的
是的
! ----------------------------------------!错误 20:未定义谓词!目标 : 路由(_31102,_31104) :- 链接(_31102,_31104)
中止| ?- 链接(a,f).不
| ?- route(X,Y).X = a ,Y = b ;
X = b ,Y = c ;
X = c ,Y = d ;
X = f ,Y = c ;
X = b ,Y = e ;
X = d ,Y = e ;
X = e ,Y = f ;
X = a ,Y = c ;
X = a ,Y = e ;
X = a ,Y = d
;
X = a ,Y = d
| ?- 链接(X,Z).X = a ,Z = b
| ?-| ?- 链接(X,Z).X = a ,Z = b ;
X = b ,Z = c ;
X = c ,Z = d ;
X = f ,Z = c ;
X = b ,Z = e ;
X = d ,Z = e ;
X = e ,Z = f
connected_to( A,B) :-
closure0(link, A,B).
有关closure0/3
的定义,请参阅此问题。
或者,要使用您的新名称:
route(A0,A) :-
link(A0,A1),
closure0(link, A1,A).