在 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