我正在尝试解决 Knight Tour 问题。 我想调用一个规则来评估可能的移动,但我无法让我的规则返回我发送的变量中的下一个位置。
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)、坐标的对表示和反射(reflect)哪个参数是什么的名称,例如从_到/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
如果您使用 is/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
关于prolog - 在 Prolog 中调用规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43723118/