我對Prolog非常陌生,我試圖編寫一個簡單的方法來確定一個棋盤上的騎士是否可以跳到另一個方塊,或者輸出所有的一個騎士可以跳到正方形的方格。對於這個方法,假設第一個參數必須總是被實例化。它工作正常,給定兩個參數,但我不知道爲什麼它不會輸出只給定一個。Prolog - 參數沒有被充分實例化 - Knight/chessboard
% validSquare/2
% validSquare(X1/Y1, X2/Y2) iff the coordinate is a valid position on an 8x8 chessboard.
validSquare(X1/Y1, X2/Y2) :-
X1 >= 1, X1 =< 8,
Y1 >= 1, Y1 =< 8,
X2 >= 1, X2 =< 8,
Y2 >= 1, Y2 =< 8.
% jump/2
% jump(Square1, Square2) iff a knight could jump to the coordinate
% Square1/Square2 on a chessboard.
jump(X1/Y1, X2/Y2) :-
validSquare(X1/Y1, X2/Y2),
X2 is X1 + 1,
Y2 is Y1 + 2.
jump(X1/Y1, X2/Y2) :-
validSquare(X1/Y1, X2/Y2),
X2 is X1 + 2,
Y2 is Y1 + 1.
jump(X1/Y1, X2/Y2) :-
validSquare(X1/Y1, X2/Y2),
X2 is X1 + 1,
Y2 is Y1 - 2.
jump(X1/Y1, X2/Y2) :-
validSquare(X1/Y1, X2/Y2),
X2 is X1 + 2,
Y2 is Y1 - 1.
jump(X1/Y1, X2/Y2) :-
validSquare(X1/Y1, X2/Y2),
X2 is X1 - 1,
Y2 is Y1 - 2.
jump(X1/Y1, X2/Y2) :-
validSquare(X1/Y1, X2/Y2),
X2 is X1 - 2,
Y2 is Y1 - 1.
jump(X1/Y1, X2/Y2) :-
validSquare(X1/Y1, X2/Y2),
X2 is X1 - 1,
Y2 is Y1 + 2.
jump(X1/Y1, X2/Y2) :-
validSquare(X1/Y1, X2/Y2),
X2 is X1 - 2,
Y2 is Y1 + 1.
就像我說的,我對Prolog非常陌生,所以我不確定如何格式化查詢。這個查詢是錯誤的。
?- jump(1/1, X2/Y2).
ERROR: >=/2: Arguments are not sufficiently instantiated
感謝您的幫助。
如果您只是簡單地使用CLP(FD)約束而不是低級整數算術,那麼它的工作原理與預期完全相同:使用更通用的'(#=)/ 2'而不是'(is)/ 2'。而不是'(> =)/ 2',使用更通用的'(#> =)/ 2'。而不是'(= <)/ 2',使用更通用的'(#= <)/ 2'。 – mat 2014-11-22 21:40:21
將validSquare/2重寫爲validSquare/1! – false 2014-11-22 21:42:02