Prolog:平铺计划

时间:2013-06-11 19:57:40

标签: prolog

我是Prolog的新手,所以基本上错误可能对其他人来说很明显。

我的最后一个问题是关于平铺的算法。

问题

假设我们有一个边长为S的正方形,以及长度为X且宽度为Y的矩形图块的N个副本。程序必须显示这些副本可以在网格中排列的所有方式,以便没有两个副本可以互相接触

通过显示,我的意思是它必须显示网格中每个副本左上角的坐标集。

坐标从1开始,而不是0。

算法

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.

我找不到错误(我知道其中一个“=&lt;”运算符正在抱怨)。一点帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

由于

而出现错误
not(member(X/Y, Rest)),

not Goal(通常写为\+ Goal)撤消任何已建立的绑定,而证明目标。然后X(和Y)也无法测试。

在这种情况下,您可以使用(1,GridSize,X)之间的X(和Y)提供放置在not(member(...))之前。