2017-11-17 9 views
2

これは宿題の問題ですが、私は単純な質問に答えるだけです。私は騎士がその位置からチェス盤に飛びつく可能性のあるすべての方法を印刷することになっています。正しい数値が得られていますが、正しい出力が得られないようです。たとえば:変数がプロローグで印刷される順序を変更する方法は?

?- knight(8,1,R,C) 

は、次のように出力をプリントアウトすることになっている:

C = 3 
R = 7; 
C = 2 
R = 6; 

しかし、私はのように正反対の取得:

R = 7, 
C = 3; 
R = 6, 
C = 2. 

ここに私のコードです:

knight(C, R, C2, R2):- 
     C2 is C - 1,R2 is R + 2, 
     withinBoard(C2,R2) 
    ; C2 is C + 1,R2 is R + 2, 
     withinBoard(C2,R2) 
    ; C2 is C + 2, R2 is R + 1, 
     withinBoard(C2,R2) 
    ; C2 is C + 2, R2 is R - 1, 
     withinBoard(C2,R2) 
    ; C2 is C + 1, R2 is R - 2, 
     withinBoard(C2,R2) 
    ; C2 is C - 1, R2 is R - 2, 
     withinBoard(C2,R2) 
    ; C2 is C - 2, R2 is R - 1, 
     withinBoard(C2,R2) 
    ; C2 is C - 2, R2 is R + 1, 
     withinBoard(C2,R2). 

withinBoard(Col,Row):- 
     Row < 9, Row > 0, Col < 9, Col > 0. 

答えて

2
?- C=C,knight(8,1,R,C). 
    C = 3, 
    R = 7 
; C = 2, 
    R = 6. 

両方の注文は問題なく、まったく同じです。

多くの現在のPrologシステムは、用語を読むために使用するread_term(Query, [variable_names(VN_list)]).によって決まる順序で変数を出力します。そのため、一番左に出現する変数が最初の回答置換を出力します。

従来、一部のシステムでは、変数の名前でVN_listを注文しました。注文書が規格によって不特定のまま残されているため、実際には意味をなさない。その間、これはCor.3で修正されました。あなたの宿題は、'C' @< 'R'から早い時期に始まったようです。非常に正確な順序を得るには、人工的な目標を前面に追加する必要があります。私はC=Cをとりました。これは常に真です。

私はあなたのインストラクターが非常に正確な順序を主張するとは思わないと言いました。

関連する問題