从列表中创建矩阵

时间:2017-05-30 16:05:08

标签: prolog

早上好。 我需要你的帮助。 我想从大小为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]]

1 个答案:

答案 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.

多好啊!