Mandist谓词没有给出预期的结果

时间:2017-01-05 15:29:11

标签: prolog 8-puzzle

所以我试图找到8个瓷砖拼图中的空白图块将会滑动的方向,

我正在使用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

我也期望它说Direction = right,因为位置1/1是3x3网格的最左下角,而左下角的唯一移动是向上或向右

1/3 2/3 3/3

1/2 2/2 3/2

1/1 2/1 3/1

1 个答案:

答案 0 :(得分:1)

根据您的问题,您可能希望编写以下子句:

policyDocument

鉴于您将此内容写入文件,它将生成:

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

然而,它不适用于:

?- 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