-2

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

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 中的谓词,编写一个谓词,查找入口和出口之间的所有可能路线,并创建已访问房间的列表。编写另一个谓词,在每次迭代结束时,或者换句话说,每次到达 Exit 时,在交互式控制台中显示列表。编写一个测试计划,显示您的预期结果和实际结果。评估此解决方案并确定任何潜在问题以及可能导致其发生的情况。

这个解决方案的问题是循环。如果我想链接(a,f)序言说不。我的谓词有什么问题。

| ?-链接(a,b)。链接(b,c)。链接(c,d)。链接(f,c)。链接(b,e)。链接(d,e)。链接(e,f)。

路线(X,Y):-链接(X,Y)。路线(X,Y):- 链接(X,Z),路线(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

4

1 回答 1

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

有关的定义,请参阅此问题closure0/3

或者,使用您的新名称:

route(A0,A) :-
    link(A0,A1),
    closure0(link, A1,A).
于 2014-11-24T21:50:27.527 回答