List 在prolog中获取列表的垂直列表?

List 在prolog中获取列表的垂直列表?,list,prolog,List,Prolog,一个列表,如 列表=[[1,2,3], [4,5,6], [7,8,3]] 在这种情况下,我想得到所有垂直列表,比如 [1,4,7],[2,5,8],[3,6,3] 怎么做?我想有两个计数器像两个“for to do”重复一样一起工作。 如果[1,4,7]是一个集合,或者[3,6,3]不是,我需要检查“is_set” 像这样: el_at(利斯特,德国劳埃德船级社,1) el_at(利斯特,德国劳埃德船级社,2) 谢谢所有垂直列表的列表称为转置矩阵。 包含这样的代码 我不完全理解你提出的解决方案

一个列表,如

列表=[[1,2,3], [4,5,6], [7,8,3]]

在这种情况下,我想得到所有垂直列表,比如

[1,4,7],[2,5,8],[3,6,3]

怎么做?我想有两个计数器像两个“for to do”重复一样一起工作。 如果[1,4,7]是一个集合,或者[3,6,3]不是,我需要检查“is_set”

像这样:

el_at(利斯特,德国劳埃德船级社,1)

el_at(利斯特,德国劳埃德船级社,2)


谢谢

所有垂直列表的列表称为转置矩阵。
包含这样的代码

我不完全理解你提出的解决方案,但我有另一个。我将试着描述它是如何工作的,也许你能看到你的解决方案有什么问题,为什么它不起作用

让我们考虑[[1,2],[3,4] ]的一个例子。其思想是遍历第一个子列表[1,2],并创建一个不完整的结果[1],[2],然后遍历下一个子列表[3,4],并将其中的每个项目预先添加到结果的每个子列表中(这比在Prolog中追加要容易)。我们将得到[[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).

下面是转置的一个小实现: 它通过获取每个子列表的第一个元素来工作。当它完成时,它递归地执行相同的操作,但现在处理每个列表的下一项,依此类推

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]).
el_at(EList, Llist,2),
       globalListVertikalCheck(ListVertikal),
       addlist(Elist,ListVertikal,NewListVertikal),
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).
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]).

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).