的關鍵在於真正瞭解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/2
transpose/2
和trans/3
transpose_loop/3
,因爲這實際上就是這樣。
希望這會有所幫助。
使用'trace'也許? – 2013-04-04 20:26:24