2

私は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 つがエラーを出していることはわかっています)。少し助けていただければ幸いです。

4

1 に答える 1

2

エラーが原因で発生します

not(member(X/Y, Rest)),

not Goal(通常は と書かれます) は、 Goal を証明する間に\+ Goal確立されたバインディングを元に戻します。その場合、X (および Y も) はテストできません。

この場合、X (および Y) を between(1, GridSize, X) を使用して提供し、 の前に配置できnot(member(...))ます。

于 2013-06-11T23:35:36.547 に答える