請幫我解決這個問題: 我有一個列表的列表在序言
[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]
請幫我解決這個問題: 我有一個列表的列表在序言
[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]
你可以做這樣的事情:
lists([], []).
lists([[Head|_]|Lists], [Head|L]):-
lists(Lists, L).
lists([[_,Head|Tail]|Lists], L):-
lists([[Head|Tail]|Lists], L).
也就是說,取第一個列表的第一個元素在你的輸入列表,並用剩下的列表遞歸繼續。作爲第二次機會,跳過該元素並用其餘元素重做。
訪問單個列表元素的謂詞,它是最基本的Prolog構件塊:member/2。你想要一個所有列表的元素列表:maplist/3做這樣的映射。因此,我們可以寫
combine(Ls, Rs) :-
maplist(get1, Ls, Rs).
get1(L, E) :-
member(E, L).
注意GET1/2它只是需要交換成員/ 2個參數:因爲(純)Prolog中,我們所描述的參數之間的關係,我們可以交換參數秩序和簡化更:
combine(Ls, Rs) :-
maplist(member, Rs, Ls).
測試輸出:
?- combine([[1,2],[a,b]],X).
X = [1, a] ;
X = [1, b] ;
X = [2, a] ;
X = [2, b].
大量使用構件&的mapli ST!非常令人印象深刻! – DaveEdelstein
+1非常乾淨的解決方案 – false
爲什麼這個命令:findall(X,maplist(member,[[a,b,c],[1,2,3]],X),L)。給出無限的輸出? – rnso
我相信這就是所謂的[笛卡爾乘積(http://en.wikipedia.org/wiki/Cartesian_product) – DaveEdelstein