在Prolog中调用规则

时间:2017-05-01 17:03:45

标签: prolog combinatorics

我试图解决骑士之旅的问题。 我想调用一个规则来评估可能的运动,但是我不能这样做,我的规则会返回我发送的变量中的下一个位置。

    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。

2 个答案:

答案 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中的正确值。