2013-04-04 105 views
0

我有這段代碼,序言碼。它的目的是獲得給定方陣的轉置矩陣。有人可以向我解釋這段代碼一步一步做什麼?矩陣矩陣解釋的移調矩陣

trans([], []). 
trans([F|Fs], Ts) :- 
    trans(F, [F|Fs], Ts). 

trans([], _, []). 
trans([_|Rs], Ms, [Ts|Tss]) :- 
     lists_firsts_rests(Ms, Ts, Ms1), 
     trans(Rs, Ms1, Tss). 

lists_firsts_rests([], [], []). 
lists_firsts_rests([[F|Os]|Rest], [F|Fs], [Os|Oss]) :- 
     lists_firsts_rests(Rest, Fs, Oss). 
+1

使用'trace'也許? – 2013-04-04 20:26:24

回答

0

的關鍵在於真正瞭解lists_firsts_rests/3和鮑里斯的言論是即期。讓我們來運行它通過跟蹤:

?- trace. 
[trace] ?- lists_firsts_rests([[a,b,c],[d,e,f],[g,h,i]], X, Y). 

    Call: (6) lists_firsts_rests([[a, b, c], [d, e, f], [g, h, i]], _G1914, _G1915) ? creep 
    Call: (7) lists_firsts_rests([[d, e, f], [g, h, i]], _G2030, _G2033) ? creep 
    Call: (8) lists_firsts_rests([[g, h, i]], _G2036, _G2039) ? creep 
    Call: (9) lists_firsts_rests([], _G2042, _G2045) ? creep 
    Exit: (9) lists_firsts_rests([], [], []) ? creep 
    Exit: (8) lists_firsts_rests([[g, h, i]], [g], [[h, i]]) ? creep 
    Exit: (7) lists_firsts_rests([[d, e, f], [g, h, i]], [d, g], [[e, f], [h, i]]) ? creep 
    Exit: (6) lists_firsts_rests([[a, b, c], [d, e, f], [g, h, i]], [a, d, g], [[b, c], [e, f], [h, i]]) ? creep 
X = [a, d, g], 
Y = [[b, c], [e, f], [h, i]]. 

所以你可以看到這裏發生了什麼是lists_firsts_rests/3剛剛剝離的第一項中的每個參數的清單,並在自己的列表返回他們,另一份與所有其他的。其效果是,當它看到[[a,b,c],[d,e,f],[g,h,i]]時,它真正看到的是[[a|X],[d|Y],[g|Z]],它返回了兩樣東西,列表[a,d,g][X,Y,Z]

trans/3只是一個典型的Prolog歸納循環。它在整個矩陣中摺疊lists_firsts_rests/3。應該清楚這將如何產生轉置矩陣,因爲在軌跡中,它清楚地將3×3矩陣轉換爲長度爲3的向量和2x3矩陣「餘數」。

trans/2是另一種經典的Prolog模式,這個模式設置trans/3的遞歸併啓動循環。這裏更經典的命名策略是撥打trans/2transpose/2trans/3transpose_loop/3,因爲這實際上就是這樣。

希望這會有所幫助。