Entry和Exit之间的所有可能路线

时间:2014-11-24 21:39:55

标签: prolog maze transitive-closure

我需要帮助来解决迷宫路径。提前致谢

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

1 个答案:

答案 0 :(得分:1)

connected_to( A,B) :-
   closure0(link, A,B).

有关closure0/3的定义,请参阅this question

或者,使用您的新名称:

route(A0,A) :-
    link(A0,A1),
    closure0(link, A1,A).