检查位置是否小于或大于另一个位置序言
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)
我注意到像这样混合 nth1
和 nth0
并不是非常直观,我想知道您是否混淆了 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
足够通用,可以处理任何事情。现在我们同时拥有有趣的点和有趣的值,并且可以随心所欲地使用它们。
希望对您有所帮助!
我已经修改了这个问题,以便更具体地说明我正在寻找的内容。我试图找出 (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)
我注意到像这样混合 nth1
和 nth0
并不是非常直观,我想知道您是否混淆了 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
足够通用,可以处理任何事情。现在我们同时拥有有趣的点和有趣的值,并且可以随心所欲地使用它们。
希望对您有所帮助!