2012-01-25 20 views
2
與列表清單工作

請幫我解決這個問題: 我有一個列表的列表在序言

[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

我相信這就是所謂的[笛卡爾乘積(http://en.wikipedia.org/wiki/Cartesian_product) – DaveEdelstein

回答

1

你可以做這樣的事情:

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

也就是說,取第一個列表的第一個元素在你的輸入列表,並用剩下的列表遞歸繼續。作爲第二次機會,跳過該元素並用其餘元素重做。

7

訪問單個列表元素的謂詞,它是最基本的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]. 
+0

大量使用構件&的mapli ST!非常令人印象深刻! – DaveEdelstein

+0

+1非常乾淨的解決方案 – false

+0

爲什麼這個命令:findall(X,maplist(member,[[a,b,c],[1,2,3]],X),L)。給出無限的輸出? – rnso