我试图解决骑士之旅的问题。 我想调用一个规则来评估可能的运动,但是我不能这样做,我的规则会返回我发送的变量中的下一个位置。
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。
答案 0 :(得分:3)
除了@coder(+ s(0))提供的答案之外,我建议使用库(clpfd),坐标的对表示和反映哪个参数是什么的名称,例如: from_to / 2。然后你的谓词看起来像这样:
?- from_to(3-4,T).
T = 4-2 ? ;
T = 5-3
使用clpfd可以两种方式使用谓词,例如:我在3-4位置,我可以移动到哪里?
?- from_to(F,3-4).
F = 2-6 ? ;
F = 1-5
或者:我在3-4号位置,我可以来自哪里?
?- 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
如果使用is / 2定义谓词,则后一种情况不起作用,因为在这种情况下,右侧的表达式应该被实例化:
# two one or more digits separated by comma and none or more spaces, wrapped in parenthesis
\((\d+),\s*(\d+)\)
答案 1 :(得分:2)
您需要使用新变量并添加新参数,例如:
move(X, Y, New_X, New_Y):-
New_X is X+1,
New_Y is Y-2.
那是因为当你调用move(2,2)时,X和Y被实例化为值2并且它们不能改变,所以你可以传递两个新的未实例化的变量,这些变量将被实例化返回。
例如,现在如果您致电:move(2,2,X,Y)
X,Y将被实例化(当谓词返回/成功时),谓词将返回X,Y中的正确值。