检查位置是否小于或大于另一个位置序言

Check if the position if less then or greater then another position prolog

我已经修改了这个问题,以便更具体地说明我正在寻找的内容。我试图找出 (1,2) 的位置是否大于 (1,1)。使用下面的代码我得到了一个特定的元素,即 what 和 return 的位置。例如,如果我们想在这个迷宫中找到 1,那么我们将执行以下操作:

findMaze([Row|_],What,(0,C)):-
   findRow(Row,What,C).
findMaze([_|Rows],What,R):-
   findMaze(Rows,What,TempR),
   R is TempR + 1.

findRow([What|_],What,0).
findRow([_|Tail],What,Where):-
   findRow(Tail,What,TWhere),
   Where is TWhere + 1.

现在我只想取 (1,1) 并将其与 (1,2) 进行比较,看看它是否大于 (1,1)。最终我想要完成的是找到一个位置的左边和右边。所以 (1,1) 的左边是 (1,0) 而 (1,2) 是右边。我如何将它们变成路径,从而获得从 (1,1) 到 (1,3) 的最短路径。

回答问题的第一部分:

mazeCell(Maze, What, (X,Y)) :-
    nth1(X, Maze, Row),
    nth0(Y, Row, What).

这会捕获您想要的行为:

?- mazeCell([[x,x,x,x,x,x,x],[x,-,-,-,-,-,1,x]], 1, Point).
Point =  (2, 6)

我注意到像这样混合 nth1nth0 并不是非常直观,我想知道您是否混淆了 X 和 Y 坐标,但最终它可能不重要。

这个谓词的好处在于它非常通用;您可以使用它按索引查找事物、按值搜索事物或遍历整个迷宫。因此,例如,您可以像这样检查相邻的单元格:

pointNeighbor((X,Y), (X1,Y)) :- succ(X, X1).
pointNeighbor((X,Y), (X1,Y)) :- succ(X1, X).
pointNeighbor((X,Y), (X,Y1)) :- succ(Y, Y1).
pointNeighbor((X,Y), (X,Y1)) :- succ(Y1, Y).

neighbors(Maze, Point, NeighborPoint, NeighborValue) :-
    pointNeighbor(Point, NeighborPoint),
    mazeCell(Maze, NeighborValue, NeighborPoint).

现在我们可以很容易地找到玩家旁边的单元格:

?- Maze = [[x,x,x,x,x,x,x],[x,-,-,-,-,-,1,x]], 
   mazeCell(Maze, 1, Point), 
   neighbors(Maze, Point, NeighborPoint, NeighborValue).
Maze = [[x, x, x, x, x, x, x], [x, -, -, -, -, -, 1|...]],
Point =  (2, 6),
NeighborPoint =  (1, 6),
NeighborValue = x ;

Maze = [[x, x, x, x, x, x, x], [x, -, -, -, -, -, 1|...]],
Point =  (2, 6),
NeighborPoint =  (2, 7),
NeighborValue = x ;

Maze = [[x, x, x, x, x, x, x], [x, -, -, -, -, -, 1|...]],
Point =  (2, 6),
NeighborPoint =  (2, 5),
NeighborValue =  (-) ;

false.

请注意,我们并不担心我们是否正在生成有效点;如果您请求不存在的点,mazeCell 将简单地失败。我们也不必担心以其他方式穿越迷宫。 mazeCell/3 足够通用,可以处理任何事情。现在我们同时拥有有趣的点和有趣的值,并且可以随心所欲地使用它们。

希望对您有所帮助!