早上好。 我需要你的帮助。 我想从大小为N的列表中列出一个列表(大小为SQRT(N)* SQRT(N)的矩阵)
我受到了尝试,但它对我不起作用:(
gen(L,T,Matrix)
其中T是Matrix的大小 如果需要,您可以自由添加更多参数
例如
gen([1,2,3,4,5,6,7,8,9],3,Matrix)
Matrix = [[1,2,3],[4,5,6],[7,8,9]]
答案 0 :(得分:3)
这实际上是一个相当简单的问题。诀窍是要记住append/3
有许多实例化模式,并且不仅可以用于将列表粘合在一起,还可以用于将它们分开:
?- append(X, Y, [1,2,3,4]).
X = [],
Y = [1, 2, 3, 4] ;
X = [1],
Y = [2, 3, 4] ;
X = [1, 2],
Y = [3, 4] ;
X = [1, 2, 3],
Y = [4] ;
X = [1, 2, 3, 4],
Y = [] ;
false.
您也可以使用length/2
来控制所制作列表的大小:
?- append(X, Y, [1,2,3,4]), length(X, 3).
X = [1, 2, 3],
Y = [4] ;
false.
这几乎就是你需要的一切。其余的只是在递归调用中包装它。你需要一个基本案例:
gen([], _, []).
这基本上说,如果我没有平面表示或矩阵表示,那么我的维度并不重要。
现在是递归案例:
gen(List, T, [Start|Rest]) :-
append(Start, Remainder, List),
length(Start, T),
gen(Remainder, T, Rest).
这是一个非常基本的递归谓词。 append/3
后跟length/2
步骤与上述步骤相同;它们将List的长度T
前缀建立为结果的下一个块。然后我们递归地将自己应用于剩余的List以生成结果的其余部分。
作为一个很酷的附带好处,这个谓词有两种方式:
?- gen(X, 3, [[1, 2, 3], [4, 5, 6], [7, 8, 9]]).
X = [1, 2, 3, 4, 5, 6, 7, 8, 9] ;
false.
多好啊!