我正在尝试解决Knight Tour问题。 我想调用一个规则来评估可能的动作,但我不能这样做,我的规则返回我发送的变量中的下一个位置。在Prolog中调用规则
move(X,Y):-
X is X+1,
Y is Y-2.
move(X,Y):-
X is X+2,
Y is Y-1.
在控制台我发送move(2,2)例如,我希望返回3,0和4,1但返回false。
我正在尝试解决Knight Tour问题。 我想调用一个规则来评估可能的动作,但我不能这样做,我的规则返回我发送的变量中的下一个位置。在Prolog中调用规则
move(X,Y):-
X is X+1,
Y is Y-2.
move(X,Y):-
X is X+2,
Y is Y-1.
在控制台我发送move(2,2)例如,我希望返回3,0和4,1但返回false。
除了@coder(+ s(0))提供的答案之外,我还建议使用库(clpfd),坐标的对表示和反映哪个参数是什么的名称,例如from_to/2。然后您可以断言这个样子:
:- use_module(library(clpfd)).
from_to(X-Y,X1-Y1):-
X1 #= X+1,
Y1 #= Y-2.
from_to(X-Y,X1-Y1):-
X1 #= X+2,
Y1 #= Y-1.
使用clpfd能够使用谓词两种方式,例如:我在3-4位置,我在哪里可以移动到?
?- from_to(3-4,T).
T = 4-2 ? ;
T = 5-3
或者:我在3-4位置,在那里我能来的?
?- from_to(F,3-4).
F = 2-6 ? ;
F = 1-5
如果使用定义谓词中的后一种情况下不能正常工作是/ 2,因为在这种情况下,右侧的表达有望被实例化:
?- X is 3+4.
X = 7
?- 7 is X+4.
ERROR!!
INSTANTIATION ERROR- in arithmetic: expected bound value
?- 7 is 3+X.
ERROR!!
INSTANTIATION ERROR- in arithmetic: expected bound value
尝试'招(X,Y,X1,Y1): - X1是X + 1,Y1是Y-2。“ –