2017-05-01 70 views
1

我正在尝试解决Knight Tour问题。 我想调用一个规则来评估可能的动作,但我不能这样做,我的规则返回我发送的变量中的下一个位置。在Prolog中调用规则

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

尝试'招(X,Y,X1,Y1): - X1是X + 1,Y1是Y-2。“ –

回答

1

您需要使用新的变量,并添加新的参数,如:

move(X, Y, New_X, New_Y):- 
     New_X is X+1, 
     New_Y is Y-2. 

这是因为,当你调用移动(2,2)X和Y实例化为值2,他们不能改变,所以你可以传递两个新的未被实例化的变量,这些变量将被返回实例化。

比如现在,如果你拨打:move(2,2,X,Y)
X,Y将被实例化(当谓词返回/成功)和谓词将返回正确的价值观在X,Y。

+0

现在有效。谢谢。 – Joseph

+0

很高兴帮助:)!!! – coder

2

除了@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 

如果使用定义谓词中的后一种情况下不能正常工作是/ 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