2011-06-02 112 views
1

解釋的一樣在序言中獲取列表的列表的垂直列表?

解釋= [[1,2,3], [4,5,6], [7,8,3]

和I A列表要在這種情況下,讓所有的垂直列表像

[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

我沒有完全理解你提出的解決方案,但我有另一個。我會試着描述它是如何工作的,也許你會看到你的解決方案出了什麼問題,爲什麼它不起作用。

讓我們考慮一個[[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). 
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]). 
-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).