如何获取列表';Prolog中的第一个元素?

如何获取列表';Prolog中的第一个元素?,prolog,dcg,Prolog,Dcg,假设我们有一个矩阵,由列表列表表示,例如:[[1,2,3],[4,5,6],[7,8,9] 如何编写一个得到 [[1,4][4,7][2,5][5,8][3,6][6,9]] 提前谢谢你 我不知道SICStus Prolog中是否存在transpose/2,SWI Prolog中是否存在transpose/2转置矩阵,例如: ?- transpose([[1,2,3],[4,5,6],[7,8,9]], R). R = [[1,4,7],[2,5,8],[3,6,9]]. 现在,您可以在SWI

假设我们有一个矩阵,由列表列表表示,例如:
[[1,2,3],[4,5,6],[7,8,9]

如何编写一个得到
[[1,4][4,7][2,5][5,8][3,6][6,9]]


提前谢谢你

我不知道SICStus Prolog中是否存在
transpose/2
,SWI Prolog中是否存在
transpose/2
转置矩阵,例如:

?- transpose([[1,2,3],[4,5,6],[7,8,9]], R).
R = [[1,4,7],[2,5,8],[3,6,9]].
现在,您可以在SWI Prolog中执行以下操作:

:- use_module(library(clpfd)).

combis(L, R) :-
    transpose(L, L1),
    create_lst_combis(L1, R).

create_lst_combis([], []).   
create_lst_combis([H | T], R) :-
    create_lst_combis(T, R1),
    create_combis(H, CH),
    append(CH, R1, R).    

create_combis([H , T], [[H, T]]) :- !.  
create_combis([H | T], R) :-
    maplist(create_one_combi(H), T, T1),
    create_combis(T, R1),
    append(T1, R1, R).

create_one_combi(H, V, [H, V]).

我不知道SICStus Prolog中是否存在
transpose/2
,SWI Prolog中是否存在
transpose/2
转置矩阵,例如:

?- transpose([[1,2,3],[4,5,6],[7,8,9]], R).
R = [[1,4,7],[2,5,8],[3,6,9]].
现在,您可以在SWI Prolog中执行以下操作:

:- use_module(library(clpfd)).

combis(L, R) :-
    transpose(L, L1),
    create_lst_combis(L1, R).

create_lst_combis([], []).   
create_lst_combis([H | T], R) :-
    create_lst_combis(T, R1),
    create_combis(H, CH),
    append(CH, R1, R).    

create_combis([H , T], [[H, T]]) :- !.  
create_combis([H | T], R) :-
    maplist(create_one_combi(H), T, T1),
    create_combis(T, R1),
    append(T1, R1, R).

create_one_combi(H, V, [H, V]).

在我使用的以下逻辑纯Prolog代码中:

以下是OP提出的问题:

:- use_module(library(clpfd)).                % SWI-Prolog transpose/2
:- use_module(library(lists)).                % SICStus Prolog transpose/2

?- transpose([[1,2,3],[4,5,6],[7,8,9]],Tss),
   phrase(matrix_adjacentPairs(Tss),Pss).
Tss = [[1,4,7],[2,5,8],[3,6,9]],
Pss = [[1,4],[4,7],[2,5],[5,8],[3,6],[6,9]].

编辑2015-04-26 使用元谓词和with,可以归结为:

:- use_module(library(apply)).
:- use_module(library(lambda)).

?- transpose([[1,2,3],[4,5,6],[7,8,9]],Tss),
   phrase(foldl(foldadjl(\X^Y^[[X,Y]|Xs]^Xs^true),Tss),Pss).
Tss = [[1,4,7],[2,5,8],[3,6,9]],
Pss = [[1,4],[4,7],[2,5],[5,8],[3,6],[6,9]].

在我使用的以下逻辑纯Prolog代码中:

以下是OP提出的问题:

:- use_module(library(clpfd)).                % SWI-Prolog transpose/2
:- use_module(library(lists)).                % SICStus Prolog transpose/2

?- transpose([[1,2,3],[4,5,6],[7,8,9]],Tss),
   phrase(matrix_adjacentPairs(Tss),Pss).
Tss = [[1,4,7],[2,5,8],[3,6,9]],
Pss = [[1,4],[4,7],[2,5],[5,8],[3,6],[6,9]].

编辑2015-04-26 使用元谓词和with,可以归结为:

:- use_module(library(apply)).
:- use_module(library(lambda)).

?- transpose([[1,2,3],[4,5,6],[7,8,9]],Tss),
   phrase(foldl(foldadjl(\X^Y^[[X,Y]|Xs]^Xs^true),Tss),Pss).
Tss = [[1,4,7],[2,5,8],[3,6,9]],
Pss = [[1,4],[4,7],[2,5],[5,8],[3,6],[6,9]].