如何在网格中定位n个tile-prolog

如何在网格中定位n个tile-prolog,prolog,tile,Prolog,Tile,我试图解决ntiles问题,可以这样描述,我们有一个网格。然后我们要定位网格中具有给定大小的N个分片。我们有如下规则: ntiles(A/B, Grid, N, Pos1/Pos2) :- 它应该返回我们可以找到瓷砖的可能位置: >ntiles(2/1,3,2,P). P=[1/1,1/3]?; P=[1/1,2/3]?; P=[2/1,1/3]?; P=[2/1,2/3]?; No. 我认为这是一个简单的递归问题,但我无法解决它。首先,我尝试仅在从位置1/1开始的单行上定位瓷砖。这

我试图解决ntiles问题,可以这样描述,我们有一个网格。然后我们要定位网格中具有给定大小的N个分片。我们有如下规则:

ntiles(A/B, Grid, N, Pos1/Pos2) :-
它应该返回我们可以找到瓷砖的可能位置:

>ntiles(2/1,3,2,P).

P=[1/1,1/3]?;
P=[1/1,2/3]?;
P=[2/1,1/3]?;
P=[2/1,2/3]?;
No.
我认为这是一个简单的递归问题,但我无法解决它。首先,我尝试仅在从位置1/1开始的单行上定位瓷砖。这意味着我现在只能呆在第一排。我认为,如果我实现了这一点,就很容易在列中实现它

当您检查我的代码时,您将理解我:

ntiles(A/B, G, N, K) :-
   setof(X/Y, horizontal(A/B, G, N, X/Y), K).

horizontal(A/B, G, N, P1/P2) :-
   N > 0,
   P is A + 2,
   P =< G,
   horizontal(A/B, G, N-1, P/1).
ntiles(A/B、G、N、K):-
一组(X/Y,水平(A/B,G,N,X/Y),K)。
水平(A/B、G、N、P1/P2):-
N>0,
P是A+2,
P=
此代码返回“false”。我想把K的名单还给你。你知道问题出在哪里吗

你也能给我一些见解来解决这个问题吗


提前谢谢。

有很多问题

主要是setof/3应该用于获得所有的解决方案,然后需要一个“回溯时生成”的目标,但是horizontal/4被编码为确定性列表构造函数

其他问题包括:

  • 仅当N>0时,水平/4才会成功。基本情况如何(即N为0)
  • P1、P2是单例:它们不能在解决方案中扮演任何角色
  • 必须显式地计算算术,然后您应该添加-
    M是N-1
    ,而不是传递N-1,并在递归调用中传递M
你可能会对我在一个(非常)类似的问题上给出的答案感兴趣