早上好。 我需要你的帮助。 我想从大小为 N 的列表中创建列表列表(大小为 SQRT(N)*SQRT(N) 的矩阵)
我已经尝试过,但它对我不起作用:(
gen(L,T,Matrix)
其中T是矩阵的大小 如果您愿意,您可以自由添加更多参数
例如
gen([1,2,3,4,5,6,7,8,9],3,Matrix)
Matrix = [[1,2,3],[4,5,6],[7,8,9]]
最佳答案
这实际上是一个相当简单的问题。诀窍是记住 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
前缀作为结果的下一个 block 。然后我们递归地将自己应用于剩余的列表以生成结果的其余部分。
作为一个很酷的副作用,这个谓词有两种作用:
?- gen(X, 3, [[1, 2, 3], [4, 5, 6], [7, 8, 9]]).
X = [1, 2, 3, 4, 5, 6, 7, 8, 9] ;
false.
这多好啊!
关于prolog - 从列表创建矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44267022/