我有这个代码,prolog代码。其目的是获得给定方阵的转置矩阵。有人可以向我解释这段代码是一步一步做的吗?
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).
答案 0 :(得分: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
。应该清楚如何产生转置矩阵,因为在迹线中它明确地将3x3矩阵转换为长度为3的向量和2x3矩阵“余数”。
trans/2
是另一个经典的Prolog模式,这个模式设置trans/3
的递归并启动循环。这里更经典的命名政策是致电trans/2
transpose/2
和trans/3
transpose_loop/3
,因为这就是它们的真实含义。
希望这有帮助。