在 Prolog 中调用规则
Call a rule in Prolog
我正在尝试解决 Knight Tour 问题。
我想调用一个规则来评估可能的移动,但我不能这样做我的规则 returns 我发送的变量中的下一个位置。
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) 例如,我希望 returns 3,0 和 4,1 但 returns false。
您需要使用新变量并添加新参数,例如:
move(X, Y, New_X, New_Y):-
New_X is X+1,
New_Y is Y-2.
那是因为当你调用 move(2,2) 时,X 和 Y 被实例化为值 2 并且它们不能改变,所以你可以传递两个新的未实例化变量,它们将被 returned 实例化.
例如,现在如果您调用:move(2,2,X,Y)
X,Y 将被实例化(当谓词 returns/succeeds 时)并且谓词将 return 您在 X,Y 中的正确值。
除了@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
如果您使用 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
我正在尝试解决 Knight Tour 问题。 我想调用一个规则来评估可能的移动,但我不能这样做我的规则 returns 我发送的变量中的下一个位置。
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) 例如,我希望 returns 3,0 和 4,1 但 returns false。
您需要使用新变量并添加新参数,例如:
move(X, Y, New_X, New_Y):-
New_X is X+1,
New_Y is Y-2.
那是因为当你调用 move(2,2) 时,X 和 Y 被实例化为值 2 并且它们不能改变,所以你可以传递两个新的未实例化变量,它们将被 returned 实例化.
例如,现在如果您调用:move(2,2,X,Y)
X,Y 将被实例化(当谓词 returns/succeeds 时)并且谓词将 return 您在 X,Y 中的正确值。
除了@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
如果您使用 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