在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)

我在下面编写了在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(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).