Prolog国际象棋骑士算法

Prolog chess knight algorithm

我正在尝试解决自定义矩阵的国际象棋骑士问题,但我不知道问题出在哪里。 一个象棋骑士必须每个地方都走一遍,当他设法走遍所有领域时,程序就结束了。目前,他一直在寻找正确的字段组合,需要很长时间…… 我不知道下一步该做什么或要更改什么

append([], POINT, [POINT]).
append([H|T], POINT, [H|R]) :- 
    append(T, POINT, R).

member(POINT,[POINT|_]).
member(POINT,[_|R]) :- 
    member(POINT, R).

try(X, Y, Xmax, Ymax, A, B) :- 
    (X + 1 < Xmax, Y + 2 < Ymax, A is X + 1, B is Y + 2).
try(X, Y, Xmax, Ymax, A, B) :- 
    (X + 2 < Xmax, Y + 1 < Ymax, A is X + 2, B is Y + 1).
try(X, Y, Xmax, Ymax, A, B) :- 
    (X + 2 < Xmax, Y - 1 >= Ymax - Ymax, A is X + 2, B is Y - 1).
try(X, Y, Xmax, Ymax, A, B) :- 
    (X + 1 < Xmax, Y - 2 >= Ymax - Ymax, A is X + 1, B is Y - 2).
try(X, Y, Xmax, Ymax, A, B) :-  
    (X - 1 >= Xmax - Xmax, Y - 2 >= Ymax - Ymax, A is X - 1, B is Y - 2).
try(X, Y, Xmax, Ymax, A, B) :- 
    (X - 2 >= Xmax - Xmax, Y - 1 >= Ymax- Ymax, A is X - 2, B is Y - 1).
try(X, Y, Xmax, Ymax, A, B) :-  
    (X - 2 >= Xmax - Xmax, Y + 1 < Ymax, A is X - 2, B is Y + 1).
try(X, Y, Xmax, Ymax, A, B) :- 
    (X - 1 >= Xmax - Xmax, Y + 2 < Ymax, A is X - 1, B is Y + 2).


move(X, Y, Xmax, Ymax, L) :-
    not(member([X, Y], L)),
    write('X='), write(X),
    write('Y='), write(Y), nl,
    try(X, Y, Xmax, Ymax, A, B),
    append(L, [X, Y], L2),
    move(A, B, Xmax, Ymax, L2).

示例:移动(0, 0, 3, 3, []).

输出

X=0Y=0
X=1Y=2
X=2Y=0
X=0Y=1
X=2Y=2
X=1Y=0
X=0Y=2
X=2Y=1
X=2Y=1
X=0Y=2
X=1Y=0
X=2Y=2
X=0Y=1
X=2Y=0
X=1Y=2
false

没错,因为它永远不会在矩阵的中心。 但是对于矩阵 5x5 他找不到组合...

新的尝试。此代码:

move(X,Y,Xmax,Ymax,L) :-
  ( try(X,Y,Xmax,Ymax,A,B), not(member([A,B],L)) ->
    write('X='), write(A), write(' '), write('Y='), write(B), nl,
    append(L,[A,B],L2),
    move(A,B,Xmax,Ymax,L2)
  ; true ).

给我(move(0,4,5,5,[])):

X=2 Y=3
X=4 Y=4
X=3 Y=2
X=4 Y=0
X=2 Y=1
X=3 Y=3
X=4 Y=1
X=2 Y=0
X=0 Y=1
X=1 Y=3
X=3 Y=4
X=4 Y=2
X=3 Y=0
X=1 Y=1
X=0 Y=3
X=2 Y=4
X=4 Y=3
X=3 Y=1
X=1 Y=0
X=2 Y=2
X=1 Y=4
X=0 Y=2

这不是您所期待的吗?