prolog - 从列表创建矩阵

标签 prolog

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

相关文章:

prolog - 使用 Prolog CLPFD 实现 32 位数字的 XOR 功能

prolog - 在 SWI-Prolog 中,是否有一种使用 REPL 将数字从一个基数转换为另一个基数的简单方法?

list - 在 Prolog 中创建一个 N x N 矩阵(使用列表?)

list - 在指定元素处拆分列表

prolog - 在序言中生成一首诗的诗句的问题

bash - 使用 prolog 输出到 bash shell

list - 在序言中编写上下文无关语法

list - Prolog 查找列表中的中间元素

prolog - 未捕获异常 : error(existence_error(procedure, likes/0),friend/0)(七种语言)

Prolog:如何查找和删除最小列表元素?