我正在尝试制作没有值的列表列表。如果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).
答案 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 张量。
实际上,我们可以对上述内容进行概括,以构造一个任意的,呈矩形的深度级联列表(在每个维度上,列表具有相同数量的元素),但我将其作为练习。