Я не совсем понял решение, которое вы предлагаете, но у меня есть другое. Я постараюсь описать, как это работает, и, возможно, чем вы сможете понять, что не так с вашим решением и почему оно не работает.
Давайте рассмотрим пример [[1,2], [3,4]]. Идея состоит в том, чтобы пройти через первый подсписок [1,2] и создать неполный результат [[1], [2]], затем перейти к следующему [3,4] и подготовить (что проще, чем добавить). в прологе) каждый элемент в нем для каждого подсписка в результате. Мы закончим с [[3,1], [4,1]]. Затем подсписки меняются местами, и мы получаем результат [[1,3], [1,4]].
Теперь реализация:
Предикат vertical
является ядром, он проходит через список списков, и результат поэтапно накапливается в переменной Acc.
Для каждого из подсписков предикат vertical
вызывает предикат addfirst
, который берет каждый элемент этого подсписка и добавляет его к списку, в котором были накоплены предыдущие результаты.
vertical([X|Xs],Result):-
createempty(X, Acc),
vertical([X|Xs], Acc, ReversedResults),
reverseall(ReversedResults, Result).
reverseall([], []).
reverseall([X|Xs], [XReversed|Rest]):-
reverse(X, XReversed),
reverseall(Xs, Rest).
createempty([], []).
createempty([X|Xs], [[]|R]):-createempty(Xs,R).
vertical([], Result, Result).
vertical([X|Xs], Acc, Result):-
addfirst(X, Acc2, Acc),
vertical(Xs, Acc2, Result).
addfirst([], [], []).
addfirst(
[Y|Ys],
[[Y|YVerticalRest]|ResultRest],
[YVerticalRest|VerticalsRest]):-
addfirst(Ys, ResultRest, VerticalsRest).