Виновником по сути является:
%% ...
<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 .
Фактически мы можем обобщить вышеприведенное, чтобы построить произвольный глубокий каскад списков, который является "прямоугольным" (в том смысле, что для каждого измерениясписки имеют одинаковое количество элементов), но я оставляю это как упражнение.