0

我正在尝试解决可以描述为的 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).

此代码返回“假”。我希望将其返回 K 列表。您知道问题出在哪里吗?

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

提前致谢。

4

1 回答 1

0

有很多问题。

主要是应该使用 setof/3 来获取所有解决方案,然后需要一种“在回溯上生成”的目标,但是 Horizo​​ntal/4 被编码为确定性列表构造函数。

其他问题是:

  • 仅当 N > 0 时,horizo​​ntal/4 才会成功。基本情况(即 N0)呢?
  • P1,P2 是单例:它们在您的解决方案中不能发挥任何作用。
  • 算术必须显式评估,然后您应该添加 - 例如 - 而不是传递 N-1 M is N-1,并在递归调用中传递 M 。

您可能会对我就(非常)类似的问题给出的答案感兴趣。

于 2013-06-11T12:04:14.383 回答