簡體   English   中英

在 Prolog 中使用列表列表

[英]Working with list of lists in Prolog

請幫我解決這個問題:我有一個列表列表

[[1,2],[3,4]]

如何得到:

[1,3]

[1,4]

[2,3]

[2,4]

或者如果我有一個列表列表

[[1,2],[3,4],[6,7]]

如何得到:

[1,3,6]

[1,3,7]

[1,4,6]

[1,4,7]

[2,3,6]

[2,3,7]

[2,4,6]

[2,4,7]

訪問單個列表元素的謂詞是最基本的 Prolog 構建塊: member/2

並且您想要一個所有列表元素的列表maplist/3此類映射。 這樣我們就可以寫

combine(Ls, Rs) :-
    maplist(get1, Ls, Rs).
get1(L, E) :-
    member(E, L).

請注意,僅需要get1/2以便我們交換member/2參數。 但是因為在(純)Prolog 中我們描述的參數之間的關系,我們可以交換參數的順序並進一步簡化它:

combine(Ls, Rs) :-
    maplist(member, Rs, Ls).

測試輸出:

?- combine( [[1,2],[a,b]], Xs).
Xs = [1, a] ;
Xs = [1, b] ;
Xs = [2, a] ;
Xs = [2, b].

%% this is the same as:
       %% maplist( member, Xs, [[1,2],[a,b]]) :-
       %%          member( X1,  [1,2]      ),
       %%          member( X2,        [a,b]),  Xs = [X1,X2].

編輯

一個笑話:真的,我的第一個 combine/2 應該是這樣寫的

combine(Ls, Rs) :-
    maplist(rebmem, Ls, Rs).
rebmem(L, E) :-
    member(E, L).

你可以這樣做:

lists([], []).
lists([[Head|_]|Lists], [Head|L]):-
  lists(Lists, L).
lists([[_,Head|Tail]|Lists], L):-
  lists([[Head|Tail]|Lists], L).

也就是說,取輸入列表中第一個列表的第一個元素,然后遞歸地繼續處理剩余的列表。 作為第二次機會,跳過該元素並使用其余元素重做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM