列表列表
列表= [[1,2,3], [4,5,6] [7,8,3]]
我想在这种情况下得到所有垂直列表,如
[1,4,7],[2,5,8],[3,6,3]
怎么做?我想到两个魔法师一起工作就像两个“为了做”重复。 如果[1,4,7]是一组或[3,6,3]当然不是,我需要检查“is_set”。
像这样:el_at(LLIST,GL,1),
el_at(EList, Llist,1),
globalListVertikalCheck(ListVertikal), addlist(Elist,ListVertikal,NewListVertikal),
el_at(LLIST,GL,2),
el_at(EList, Llist,2),
globalListVertikalCheck(ListVertikal), addlist(Elist,ListVertikal,NewListVertikal),
感谢
答案 0 :(得分:3)
所有垂直列表的列表称为转置矩阵。 SWI's library(clpfd)包含此类代码。
答案 1 :(得分:0)
我没有完全理解你提出的解决方案,但我有另一个解决方案。我将尝试描述它是如何工作的,也许你可以看到你的解决方案出了什么问题以及为什么它不起作用。
让我们考虑[[1,2],[3,4]]的一个例子。想法是通过第一个子列表[1,2]并创建一个不完整的结果[[1],[2]],然后通过下一个[3,4]和前置(这比追加更容易)在Prolog中)它中的每个项目到结果中的每个子列表。我们最终将[[3,1],[4,1]]结束。然后反转子列表,我们得到结果[[1,3],[1,4]]。
现在实施:
vertical
谓词是核心,它遍历列表列表,结果在Acc varible中逐步累积。
对于每个子列表,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).
答案 2 :(得分:0)
这里有一个转置的小实现: 它的工作原理是获取每个子列表的第一个元素。当它完成时,它递归地执行相同的操作但现在使用每个列表的下一个项目,依此类推。
transpose(M, T):-
transpose(M, [], T).
transpose([], [], []).
transpose([], S, [[]|T]):-
S \= [] ->
(reverse(S, M), transpose(M, [], T)).
transpose([[]|MTail], S, T):-
transpose(MTail, S, T).
transpose([[Item|Tail]|MTail], S, [[Item|NTail]|T]):-
transpose(MTail, [Tail|S], [NTail|T]).
答案 3 :(得分:-1)
transpose([[]|_],[]) :- !.
transpose(L,[L1|R2]) :-
transpose(L,L2,L1),
transpose(L2,R2).
transpose([],[],[]) :- !.
transpose([[A|R1]|R2],[R1|R3],[A|R4]) :-
transpose(R2,R3,R4).