我已经修改了这个问题,以便更具体地说明我正在寻找什么。我试图找出(1,2)的位置是否大于(1,1)。使用以下代码,我得到一个特定元素, what ,并返回位置。例如,如果我们想在这个迷宫中找到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)的最短路径。
答案 0 :(得分:2)
回答问题的第一部分:
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
足以处理任何事情。现在我们立刻就拥有了有趣的观点和有趣的价值观,并可以随心所欲地做任何事情。
希望这有帮助!