Создайте 3d список - PullRequest
       2

Создайте 3d список

0 голосов
/ 12 декабря 2018

Я пытаюсь составить список списков списков без значений.Если N_meses = 4, я хочу List = [[[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 голосов
/ 12 декабря 2018

Виновником по сути является:

    %% ...
    <b>maplist(=(X), Row),</b>
    %% ...

Здесь вы в основном определили список X, а затем вы установили с помощью maplist/2, что все элементов в Rowобъединены с этим X.В процессе объединения.Таким образом, это означает, что все элементы Row по существу будут указывать на один и тот же список .

Тем не менее, я думаю, что это определенно поможет, если вы сделаете предикат менее амбициозным.: внедрить вспомогательные предикаты и позволить каждому предикату делать небольшое количество вещей.

Мы можем, например, сначала спроектировать предикат 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 элементов.Таким образом, мы создаем 2d список с M элементами, где каждый элемент является списком N элементов.

Затем, наконец, мы можем построить 3D-тензор:

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

Здесь мы таким образомпостроить тензор L × M × N .

Фактически мы можем обобщить вышеприведенное, чтобы построить произвольный глубокий каскад списков, который является "прямоугольным" (в том смысле, что для каждого измерениясписки имеют одинаковое количество элементов), но я оставляю это как упражнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...