私はPrologの初心者なので、基本的にエラーは他の人には明らかかもしれません。
私の最後の質問は、タイリングに関するアルゴリズムに関するものでした。
問題
一辺の長さが S の正方形と、長さが X で幅が Y の N 個の長方形のタイルがあるとします。プログラムは、2 つのコピーが互いに接触しないように、これらのコピーをグリッドに配置する方法をすべて示さなければなりません。
表示とは、グリッド内のすべてのコピーの左上隅の座標のセットを表示する必要があることを意味します。
座標は 0 ではなく 1 から始まります。
アルゴリズム
Find all (x, y) where 0 > x > S, 0 < y < S such that
(x - 1, y) not in A, (x + 1, y) not in A, (x + 2, y) not in A..., (x + X + 1, Y) not in A...
(same for y's)
次のコードを書きました (計算には ntiles ルールが使用されます)。
% TX/TY - tile dimensions
% GridSize - length of grid side
% N - number of copies
% P - container for result
% Cor - upper left corners
% Rest - cells where it is not allowed to place corner
rest(TX/TY, X/Y, Rest) :-
(
X - 1 > 0,
append([NewX/Y], [], Rest),
NewX is X - 1
)
; (
X + L =< GridSize,
X + L =< X + TX,
append([NewX/Y], [], Rest),
NewX is X + L
)
; (
Y - 1 > 0,
append([X/NewY], [], Rest),
NewY is Y - 1
)
; (
Y + L =< GridSize,
Y + L =< Y + TY,
append([X/NewY], [], Rest),
NewY is X + L
).
corners(TX/TY, GridSize, Cor, Rest) :-
not(member(X/Y, Rest)),
X =< GridSize, Y =< GridSize,
X > 0, Y > 0,
rest(TX/TY, X/Y, Rest),
append([X/Y], [], Cor).
ntilesHelper(TX/TY, GridSize, 0, P, Cor, Rest) :- append(Cor, [], P).
ntilesHelper(TX/TY, GridSize, N, P, Cor, Rest) :-
corners(TX/TY, GridSize, Cor, Rest),
ntilesHelper(TX/TY, GridSize, X, P, Cor, Rest),
X is N - 1, append(Cor, [], P).
ntiles(TX/TY, GridSize, N, P) :-
ntilesHelper(TX/TY, GridSize, N, P, [], []).
それが示している
=</2: Arguments are not sufficiently instantiated.
エラーが見つかりません (「=<」演算子の 1 つがエラーを出していることはわかっています)。少し助けていただければ幸いです。