2017-05-01 6 views
1

ナイトツアーの問題を解決しようとしています。 ポーズブルムーブメントを評価するためのルールを呼び出すが、私のルールは送信する変数の次のポジションを返すことはできない。プロローグでルールを呼び出す

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はY2です。 ' –

答えて

1

あなたは新しい変数を使用してのように新しいパラメータを追加する必要があります。です

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

ので、あなたが移動(2,2)XとYの値が2にインスタンス化されると、彼らは変更することはできません呼び出すときに、インスタンス化された2つの新しい変数を渡すことができます。例えば

は今、あなたが呼び出す場合:(述語リターン/成功した場合)move(2,2,X,Y)
をX、Yは、インスタンス化され、述語はあなたにX、Yで正しい値を返します。

+0

これで動作します。ありがとうございました。 – Joseph

+0

喜んで:)!!! – coder

2

@coder(+ s(0))が提供する答えに加えて、ライブラリ(clpfd)の使用、座標のペア表示、およびどの引数がどのようなものかを反映する名前を示唆します。 from_to/2。私はに移動することができます位置3-4、でね

:- 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を使用すると、述語に両方の方法を使用することが可能となり、例えば::次に、あなたの述語は、このような何かを見ることができますか?

?- 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 
関連する問題