Mandist 谓词未给出预期结果
Mandist predicate not giving expected results
所以我试图找到 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
根据您的问题,您可能希望编写以下子句:
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
但是有一种方法可以做到这一点。如果这是一项要求,请更新您的问题。
编辑:
既然有界限,你可以简单地将它们添加到子句中。 如果你能假设第一对坐标是有效的,那就是:
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.
所以我试图找到 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
根据您的问题,您可能希望编写以下子句:
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
但是有一种方法可以做到这一点。如果这是一项要求,请更新您的问题。
编辑:
既然有界限,你可以简单地将它们添加到子句中。 如果你能假设第一对坐标是有效的,那就是:
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.