我正在努力解决可以描述的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.你是否知道问题在哪里?
你也可以给我解决这个问题的见解吗?
提前致谢。
答案 0 :(得分:0)
有很多问题。
主要是setof / 3应该用于获取所有解决方案,然后需要一个类型'在回溯上生成'的目标,但水平/ 4被编码为确定性列表构造函数。
其他问题是:
M is N-1
而不是传递N-1,并在递归调用中传递M. 你可能会对answer感兴趣我给出了(非常)类似的问题。