我正在编写一个程序,以在国际象棋游戏中找到骑士可以移动到的所有方格。
例如:validKnightMove(X1/Y1, X2/Y2).
其中每个参数都是一个坐标对。
谓词 有效 ,但我无法从Prolog shell中以理想的方式查询它。
我想创建一个查询,找到我可以从给定位置移动到的所有有效方块。例如,?- validKnightMove(4/4, X/Y)
,然后shell将搜索满足谓词的X
和Y
值。
然而,当我进行查询时,它只返回false.
,尽管有有效的解决方案。
以下是shell的一些输出来演示问题:
1 ?- validKnightMove(4/4, 6/3).
true.
2 ?- validKnightMove(4/4, X/Y).
false.
这段代码确实很冗长,但应该很容易理解。
validKnightMove(X1/Y1, X2/Y2) :- % Right 1, Down 2
onBoard(X2/Y2),
X2 =:= X1 + 1,
Y2 =:= Y1 + 2,
!.
validKnightMove(X1/Y1, X2/Y2) :- % Right 2, Down 1
onBoard(X2/Y2),
X2 =:= X1 + 2,
Y2 =:= Y1 + 1,
!.
validKnightMove(X1/Y1, X2/Y2) :- % Left 2, Down 1
onBoard(X2/Y2),
X2 =:= X1 - 2,
Y2 =:= Y1 + 1,
!.
validKnightMove(X1/Y1, X2/Y2) :- % Left 1, Down 2
onBoard(X2/Y2),
X2 =:= X1 - 1,
Y2 =:= Y1 + 2,
!.
validKnightMove(X1/Y1, X2/Y2) :- % Right 1, Up 2
onBoard(X2/Y2),
X2 =:= X1 + 1,
Y2 =:= Y1 - 2,
!.
validKnightMove(X1/Y1, X2/Y2) :- % Right 2, Up 1
onBoard(X2/Y2),
X2 =:= X1 + 2,
Y2 =:= Y1 - 1,
!.
validKnightMove(X1/Y1, X2/Y2) :- % Left 2, Up 1
onBoard(X2/Y2),
X2 =:= X1 - 2,
Y2 =:= Y1 - 1,
!.
validKnightMove(X1/Y1, X2/Y2) :- % Left 1, Up 2
onBoard(X2/Y2),
X2 =:= X1 - 1,
Y2 =:= Y1 - 2,
!.
onBoard(X/Y) :-
between(1, 8, X),
between(1, 8, Y),
!.
我的问题是:为什么无法找到确定性谓词的所有解决方案?
注意:我的prolog版本是SWI-Prolog(多线程,32位,版本6.2.2)