这是一个家庭作业问题,但我只需要回答一个简单的问题。我应该打印一个骑士可以从棋盘上跳下棋盘的所有可能方式。我得到正确的数字,但我似乎没有得到我想要的正确输出。例如:
?- 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.
答案 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
,这总是正确的。
所有这一切,我不相信你的导师会坚持非常准确的命令。