Prolog程序,用于查找';右';和';向上';在10X10网格上移动

Prolog程序,用于查找';右';和';向上';在10X10网格上移动,prolog,Prolog,我没有用prolog或任何其他逻辑编程语言编写过很多程序,我正在努力掌握它的窍门,所以我正在做一个我发现的练习 练习是:你有一个10X10的网格,你只能从网格中的一个位置点向右或向上移动(位置表示为一个包含2个元素[2,3]的列表,其中2个在x轴上,3个在y轴上,就像一个常规图形) 第一步是定义两个称为step的谓词,它们描述您可以进行的两种移动 以下是正确的步骤谓词: step([D1, D2], 'right', [Z, D2]) :- Z is D1 + 1. step([D1, D2],

我没有用prolog或任何其他逻辑编程语言编写过很多程序,我正在努力掌握它的窍门,所以我正在做一个我发现的练习

练习是:你有一个10X10的网格,你只能从网格中的一个位置点向右或向上移动(位置表示为一个包含2个元素[2,3]的列表,其中2个在x轴上,3个在y轴上,就像一个常规图形)

第一步是定义两个称为step的谓词,它们描述您可以进行的两种移动

以下是正确的步骤谓词:

step([D1, D2], 'right', [Z, D2]) :- Z is D1 + 1.
step([D1, D2], 'up', [D1, Z]) :- Z is D2 + 1.
使用上面的步骤谓词,让我们在下面给出一个查询示例:

step([4, 4], 'up', [4, X]).
上述示例查询将返回以下输出:

X = 5.
下一步是定义一个递归的路径谓词,并使用步骤谓词来确定到达10X10网格终点位置所应采取的路径(由步骤列表“向上”或“向右”表示,如[“向上”、“向上”、“向右”、“向右”])

下面是一个示例查询,该路径谓词如何为步骤列表提供适当的输出绑定

path([4,4],X).
上面的这个示例查询应该返回X的所有可能绑定,作为到达[10,10]所采取步骤的列表。例如,is应该返回X=['up','up','up','up','up','up','right','right','right','right','right','right','right']

所以,我试图编写路径谓词来服务于这个函数,但我不明白为什么下面的谓词代码不起作用,并且总是给出错误。 这是我的尝试

path([StartX, StartY], [Move|Rest]) :- StartX =< 8, StartY =< 8, step([StartX, StartY], Move, [NextX, NextY]), path([NextX, NextY], Rest).
路径([StartX,StartY],[Move | Rest]):-StartX=<8,StartY=<8,步骤([StartX,StartY],Move,[NextX,NextY]),路径([NextX,NextY],Rest)。
如果有人能解释我该怎么做,那真是太棒了


此外,还有最后一个步骤,即假设网格点存在阻塞,实施阻塞:(4,1)、(4,2)、(6,3)、(1,2)、(7,6),以便您无法单步通过这些阻塞点。最后一步是编写谓词,对这些块进行建模。

通过非常小的重新写入操作,可以更轻松地找到路径:

step(right, X, Y, X1, Y) :- succ(X, X1), between(1, 10, X1).
step(up, X, Y, X, Y1) :- succ(Y, Y1), between(1, 10, Y1).

path(X, Y, X, Y, []) :- !.
path(X0, Y0, X, Y, [Step|Path]) :-
    step(Step, X0, Y0, X1, Y1),
    path(X1, Y1, X, Y, Path).
它只检查网格上的新位置,假定当前位置有效

可以使用它查找两点之间的所有路径,例如从7,9开始到10,10:

?- path(7, 9, 10, 10, P).
P = [right, right, right, up] ;
P = [right, right, up, right] ;
P = [right, up, right, right] ;
P = [up, right, right, right] ;
false.
您可以通过多种方式在网格上添加“阻塞”位置。您是希望它们“永久”地出现在字段中,还是希望在运行时将它们交给路径算法?在运行时,使用此“路径”定义(“步骤”不变):

现在可以在第五个参数中列出阻塞的位置

?- path(7, 9, 10, 10, [7-10, 9-10], P).
P = [right, right, right, up] ;
false.

?- path(7, 9, 10, 10, [7-10, 10-9], P).
P = [right, right, up, right] ;
P = [right, up, right, right] ;
false.
?- path(7, 9, 10, 10, [7-10, 9-10], P).
P = [right, right, right, up] ;
false.

?- path(7, 9, 10, 10, [7-10, 10-9], P).
P = [right, right, up, right] ;
P = [right, up, right, right] ;
false.