我是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;”运算符正在抱怨)。一点帮助将不胜感激。
答案 0 :(得分:1)
由于
而出现错误not(member(X/Y, Rest)),
not Goal
(通常写为\+ Goal
)撤消任何已建立的绑定,而证明目标。然后X(和Y)也无法测试。
在这种情况下,您可以使用(1,GridSize,X)之间的X(和Y)提供放置在not(member(...))
之前。