如何将n个瓷砖定位到网格 - prolog

时间:2013-06-11 11:40:32

标签: 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(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).

此代码返回'false'。我希望将它归还给K.你是否知道问题在哪里?

你也可以给我解决这个问题的见解吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

有很多问题。

主要是setof / 3应该用于获取所有解决方案,然后需要一个类型'在回溯上生成'的目标,但水平/ 4被编码为确定性列表构造函数。

其他问题是:

  • 水平/ 4只有在N> gt时才会成功0.基本情况怎么样(即N 0)?
  • P1,P2是单身人士:他们无法在您的解决方案中扮演任何角色。
  • 必须显式计算算术,然后你应该添加 - 例如 - M is N-1而不是传递N-1,并在递归调用中传递M.

你可能会对answer感兴趣我给出了(非常)类似的问题。