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

时间:2015-12-02 01:09:50

标签: prolog

我已经修改了这个问题,以便更具体地说明我正在寻找什么。我试图找出(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)的最短路径。

1 个答案:

答案 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)

我注意到像这样混合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足以处理任何事情。现在我们立刻就拥有了有趣的观点和有趣的价值观,并可以随心所欲地做任何事情。

希望这有帮助!