在prolog中转置矩阵
我在下面编写了在prolog中转置矩阵的代码在prolog中转置矩阵,prolog,Prolog,我在下面编写了在prolog中转置矩阵的代码 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([],[]).
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]] ;
我对转置谓词有问题,不知道如何实现。其他谓词似乎工作正常。取自SWI Prolog中的库(clpfd)
(有关更多信息,请参阅):
查询示例:
?- transpose([[a,b,c],[d,e,f]], Ts).
Ts = [[a, d], [b, e], [c, f]].
我的旧代码-相当有效-很难
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).
这可能会有帮助。
如果您更改基本情况以使列表列表成为一个完整的列表,它将起作用。尽管它可能不是最有效的方法,因为它最多只能得到4个列表。这意味着一个由四行组成的矩阵
transpose([[X],[Y],[Z],[B]],[[X,Y,Z,B]]).
transpose([H|T],[L1|R]):-
decompose([H|T],L1,L2),
transpose(L2,R).
transpose([[X],[Y],[Z],[B]],[[X,Y,Z,B]]).
transpose([H|T],[L1|R]):-
decompose([H|T],L1,L2),
transpose(L2,R).