Prolog Mandist谓词未给出预期结果 P> >我试图找出8瓦片拼图中空白瓷砖滑动的方向,

Prolog Mandist谓词未给出预期结果 P> >我试图找出8瓦片拼图中空白瓷砖滑动的方向,,prolog,sliding-tile-puzzle,Prolog,Sliding Tile Puzzle,我使用X/Y来确定瓷砖 这是我的密码 mandist( X /Y , X1 / Y1 , D, Direction):- D is abs(X - X1 )+ abs(Y - Y1 ), Y is Y1 ->( ( X is X1 +1 -> Direction ='left') ; ( X1 is X +1 -> Direction = 'right')) ;

我使用X/Y来确定瓷砖

这是我的密码

mandist( X /Y , X1 / Y1 , D, Direction):-
       D is abs(X - X1 )+ abs(Y - Y1 ),
       Y is Y1  ->(
           (   X is X1 +1 -> Direction ='left')
           ;
           (   X1 is X +1 -> Direction = 'right'))
       ;  X is X1 ->(
               (   Y1 is Y +1 -> Direction ='up')
           ;
           (   Y is Y1 +1 -> Direction ='down')).
我遇到的问题是,当调用mandist谓词时,它并没有给出我所希望的结果

我确信问题出在if语句上,我已经写了一些伪代码,这样你就可以理解我想做什么

if(Y == Y1){
    // Change the X Axis
    if(X == X1 +1){
        This is a left move
    }
    else{
        This is a right move
    }
}else if (X == X1){
    // Change the Y Axis 
    if(Y == Y1 + 1){
        This is an up move
    }
    else{
        This is a down move
    }
}
例如:

move([1/1, 3/1, 1/3, 2/3, 3/3, 1/2, 2/2, 3/2,2,1], X, Direction)
然后调用mandist谓词

将D设置为1,这样可以确保其合法移动

以下是意外的结果:

mandist(1/1, X,1, Direction).
Direction = up ;
false
我还希望它说
方向=右
,因为位置1/1是3x3网格的最左下角,从左下角开始的唯一移动是向上或向右

1/32/33/3

1/22/23/2


1/12/13/1

基于您的问题,您可能需要编写以下条款:

mandist(X/Y,XD/Y,D,right) :-
    XD is X+D.
mandist(X/Y,X/YD,D,up) :-
    YD is Y+D.
mandist(X/Y,XD/Y,D,left) :-
    XD is X-D.
mandist(X/Y,X/YD,D,down) :-
    YD is Y-D.
如果将其写入文件,它将生成:

?- mandist(1/1,X,1,Direction).
X = 2/1,
Direction = right ;
X = 1/2,
Direction = up ;
X = 0/1,
Direction = left ;
X = 1/0,
Direction = down.
此外,它还可以验证两个坐标是否位于给定的
D
us实例化的特定方向上:

?- mandist(1/1,1/2,1,Direction).
Direction = up ;
false.
但是,它不适用于:

?- mandist(1/1,1/2,D,Direction).
ERROR: is/2: Arguments are not sufficiently instantiated
然而,有一种方法可以做到这一点。如果需要,请更新您的问题

编辑:

由于有边界,您可以简单地将它们添加到子句中如果您可以假设第一对坐标是有效的,那么它只是:

mandist(X/Y,XD/Y,D,right) :-
    XD is X+D,
    XD < 4.
mandist(X/Y,X/YD,D,up) :-
    YD is Y+D,
    YD < 4.
mandist(X/Y,XD/Y,D,left) :-
    XD is X-D,
    XD > 0.
mandist(X/Y,X/YD,D,down) :-
    YD is Y-D,
    YD > 0.
mandist(X/Y,XD/Y,D,右):-
XD是X+D,
XD<4。
曼迪斯特(X/Y,X/YD,D,向上):-
YD是Y+D,
YD<4。
下颌(X/Y,XD/Y,D,左):-
XD是X-D,
XD>0。
曼迪斯特(X/Y,X/YD,D,向下):-
YD是Y-D,
YD>0。

什么是final
else
case?没有final else@WillemVanOnsemso在这种情况下谓词应该失败?如果
Y
不等于
Y1
或者
X
不等于
X1
,会发生什么?那么这是一个非法的举动,所以应该失败。你写道“它没有给我我希望的结果”,但是。。。你能给我们举个意外结果的例子吗?你期望什么?你得到什么?但是假设1/1在平铺的左下角,那么我们就不能向下或向左移动
1/3 2/3 3/3
1/2/2 3/2
1/1 2/1 3/1
啊,所以有边界。这些界限仅仅大于或等于一?或者也有上界吗?它必须在3/3网格的范围内,所以不大于3/3,也不小于1/1@user3667111:请参阅更新的答案。这能解决问题吗?