我需要帮助来解决迷宫路径。提前致谢
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”并称为“Entry”,另一个连接到“f”并称为“Exit”。添加一组事实以反映两个新房间。使用任务1中的谓词,编写一个谓词,查找Entry和Exit之间的所有可能路径,并创建一个访问过的房间列表。编写另一个谓词,在每次迭代结束时在交互式控制台中显示列表,或者换句话说,每次到达Exit时。编写一份测试计划,显示您的预期结果和实际结果。评估此解决方案并确定可能导致其发生的任何潜在问题和情况。
这个解决方案的问题是循环。如果我想链接(a,f)prolog说不。我的谓词有什么问题。
| ? - 链接(a,b)。 链路(B,C)。 链路(C,d)。 链路(F,C)。 链路(B,E)。 链路(d,e)所示。 链路(E,F)。
路线(X,Y): - 链接(X,Y)。 route(X,Y): - link(X,Z),route(Z,Y)。 是
是
是
是
是
是
是
! ---------------------------------------- !错误20:谓词未定义 !目标:路线(_31102,_31104): - 链接(_31102,_31104)
中止 | ? - 链接(a,f)。 无
| ? - 路线(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
答案 0 :(得分:1)
connected_to( A,B) :-
closure0(link, A,B).
有关closure0/3
的定义,请参阅this question。
或者,使用您的新名称:
route(A0,A) :-
link(A0,A1),
closure0(link, A1,A).