为什么我不能找到所有解决方案"对于确定性谓词?

时间:2016-12-15 21:06:54

标签: prolog

我正在编写一个程序,以在国际象棋游戏中找到骑士可以移动到的所有方格

例如:validKnightMove(X1/Y1, X2/Y2).其中每个参数都是一个坐标对。

我做了什么:

  • 写出谓词。
  • 使用剪切确定它。
  • 用PL-Unit进行单元测试。

谓词 有效 ,但我无法从Prolog shell中以理想的方式查询它。

我想做什么:

我想创建一个查询,找到我可以从给定位置移动到的所有有效方块。例如,?- validKnightMove(4/4, X/Y),然后shell将搜索满足谓词的XY值。

然而,当我进行查询时,它只返回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)

0 个答案:

没有答案