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

时间:2012-12-03 06:07:12

标签: prolog

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

如何编写获得的谓词 [[1,4][4,7][2,5][5,8][3,6][6,9]]

提前谢谢!

2 个答案:

答案 0 :(得分:3)

在以下逻辑纯的Prolog代码中,我使用definite clause grammars

     2   144       66   77

以下是OP所说的查询:

matrix_adjacentPairs([]) -->
   [].
matrix_adjacentPairs([Xs|Xss]) -->
   list_adjacentPairs(Xs),
   matrix_adjacentPairs(Xss).

list_adjacentPairs([]) -->
   [].
list_adjacentPairs([X|Xs]) -->
   list_adjacentPairs_(Xs,X).                 % use "lagging"

list_adjacentPairs_([],_) -->
   [].
list_adjacentPairs_([X1|Xs],X0) -->
   [[X0,X1]],
   list_adjacentPairs_(Xs,X1).

编辑2015-04-26

将元谓词foldl/4foldadjl/4library(lambda)一起使用,一切归结为:

:- 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]].

答案 1 :(得分:1)

我不知道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]).