Prolog 序言:平铺程序

Prolog 序言:平铺程序,prolog,Prolog,我是Prolog中的新手,因此对于其他人来说,基本上错误是显而易见的 我的最后一个问题是关于平铺的算法 问题 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) 假设我们有一个边长为S的正

我是Prolog中的新手,因此对于其他人来说,基本上错误是显而易见的

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

问题

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)
假设我们有一个边长为S的正方形和N个边长为X、宽度为Y的矩形瓷砖副本。程序必须显示这些副本在网格中排列的所有方式,以便没有两个副本可以相互接触

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

坐标从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)
查找所有(x,y),其中0>x>S,0
我编写了以下代码(ntiles规则用于计算)

%TX/TY-平铺尺寸
%GridSize-网格边的长度
%N-份数
%P-结果的容器
%Cor-左上角
%静止-不允许放置角点的单元格
剩余(TX/TY,X/Y,剩余):-
(
X-1>0,
追加([NewX/Y],],Rest),
NewX是X-1
)
; (
X+L=0,
追加([X/NewY],[X],Rest),
纽伊是Y-1
)
; (
Y+L=0,Y>0,
剩余(TX/TY、X/Y、剩余),
附加([X/Y]、[X/Y]、Cor)。
ntilesHelper(TX/TY,GridSize,0,P,Cor,Rest):-append(Cor,[],P)。
ntilesHelper(TX/TY、GridSize、N、P、Cor、Rest):-
转角(TX/TY、网格尺寸、Cor、剩余),
ntilesHelper(TX/TY、GridSize、X、P、Cor、Rest),
X是N-1,附加(Cor,[],P)。
ntiles(TX/TY,网格大小,N,P):-
ntilesHelper(TX/TY、GridSize、N、P、[]、[])。
它表明

=</2: Arguments are not sufficiently instantiated.

=由于

not(member(X/Y, Rest)),
not Goal
(通常写为
\+Goal
)撤消证明目标时建立的任何绑定。那么X(以及Y)就不能被测试了

在这种情况下,您可以使用介于(1,GridSize,X)之间的值提供X(和Y),并将其放置在
而不是(成员(…)
之前