产生3D清单

时间:2018-12-12 20:03:56

标签: prolog

我正在尝试制作没有值的列表列表。如果N_meses = 4,我希望列表= [[[A,B,C,D]]]。 我得到了想要的东西(List = [[[]]]),但是每个列表的值都与我所附的打印纸中的值相同。如何更改此代码,以便每个列表都有不同的“值”?

我正在这样做

generate_table(Num_investigadores, Num_actividades, N_Meses, Tabela) :-
    length(Row, Num_actividades),
    length(X,N_Meses),
    maplist(=(X), Row),         
    length(Tabela, Num_investigadores),
    maplist(=(Row), Tabela).

enter image description here

1 个答案:

答案 0 :(得分:0)

罪魁祸首实质上是:

    %% ...
    maplist(=(X), Row),
    %% ...

这里您基本上定义了一个列表X,然后使用maplist/2设置Row中的 all 元素与该X统一。在统一过程中。因此,这意味着Row的所有元素本质上将指向 same 列表。

尽管如此,我认为,如果使谓词不那么雄心勃勃肯定会有所帮助:实现辅助谓词并使每个谓词执行少量操作。

例如,我们可以首先设计谓词lengthlist/2,它是length/2的“交换”版本,因此列表的长度作为第一个参数,列表的第二个参数,如:

lengthlist(N, L) :-
    length(L, N).

现在我们可以构造一个生成二维矩形列表的谓词,例如:

matrix(M, N, R) :-
    lengthlist(M, R),
    maplist(lengthlist(N), R).

因此,这里我们首先使用lengthlist来构建包含N个元素的列表,然后我们使用maplist/2来对每个元素调用lengthlist(N, ...),这样每个元素都是与N元素列表统一。因此,我们用M个元素构造了一个二维列表,其中每个元素都是N个元素的列表。

最后,我们可以构建一个3d张量:

tensor3(L, M, N, T) :-
    lengthlist(L, T),
    maplist(matrix(M, N), T).

在这里我们构造一个 L×M×N 张量。

实际上,我们可以对上述内容进行概括,以构造一个任意的,呈矩形的深度级联列表(在每个维度上,列表具有相同数量的元素),但我将其作为练习。