2015-12-07 51 views
3

我已經寫了下面的下面的代碼矩陣轉置在序言在序言轉置矩陣

listFirst([],[]). 
listFirst([H1|T1],[H2|Z]):- 
    H1 = [H2|_], 
    listFirst(T1,Z). 

listFollowers([],[]). 
listFollowers([H1|T1],[T2|Z]):- 
    H1 = [H2|T2], 
    listFollowers(T1,Z). 

decompose(A,L1,L2):- 
    listFollowers(A,L2),listFirst(A,L1). 

transpose([],[]). 
transpose([H|T],[L1|R]):- 
    decompose([H|T],L1,L2), 
    transpose(L2,R). 

測試用例

transpose([[1,2],[3,4],[5,6]], R). 
R = [[1,3,5],[2,4,6]] ; 

我有轉置謂詞沒有確定的問題,如何實現這個。其他謂詞似乎工作正常。

回答

1

這可能有幫助。 如果您更改基本情況以將列表清單完整列表,它將起作用。儘管它可能不會是最有效的方法,因爲它只能獲得4個列表。這意味着四行的矩陣。

transpose([[X],[Y],[Z],[B]],[[X,Y,Z,B]]). 
transpose([H|T],[L1|R]):-  
    decompose([H|T],L1,L2), 
    transpose(L2,R). 
2

在SWI-Prolog的(見source code獲取更多信息)從library(clpfd)摘自:

transpose([], []). 
transpose([L|Ls], Ts) :- foldl(transpose_, L, Ts, [L|Ls], _). 

transpose_(_, Fs, Lists0, Lists) :- 
     maplist(list_first_rest, Lists0, Fs, Lists). 

list_first_rest([L|Ls], L, Ls). 

例子查詢:

?- transpose([[a,b,c],[d,e,f]], Ts). 
Ts = [[a, d], [b, e], [c, f]]. 
2

我以前的代碼 - 而高效的強硬

transpose_col_row([], []). 
transpose_col_row([U], B) :- gen(U, B). 
transpose_col_row([H|T], R) :- transpose_col_row(T, TC), splash(H, TC, R). 

gen([H|T], [[H]|RT]) :- gen(T,RT). 
gen([], []). 

splash([], [], []). 
splash([H|T], [R|K], [[H|R]|U]) :- 
    splash(T,K,U).