如何更改prolog中打印变量的顺序?

时间:2017-11-17 06:49:49

标签: prolog prolog-toplevel

这是一个家庭作业问题,但我只需要回答一个简单的问题。我应该打印一个骑士可以从棋盘上跳下棋盘的所有可能方式。我得到正确的数字,但我似乎没有得到我想要的正确输出。例如:

 ?- 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.

1 个答案:

答案 0 :(得分:3)

?- 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,这总是正确的。

所有这一切,我不相信你的导师会坚持非常准确的命令。