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

时间:2011-06-02 14:28:53

标签: list prolog

列表列表

  

列表= [[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),
      
    
  

感谢

4 个答案:

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