2012-04-20 28 views
2

我需要在列表中找到組合。 例如給出下面的列表,LIsts列表中的組合序號

列表= [[1,2],[1,2,3]]

這些應該是輸出,

梳= [[1,1- ],[1,2],[1,3],[2,1],[2,2],[2,3]]

又如:

列表= [[1,2- ],[1,2],[1,2,3]]

Comb = [[1,1,1],[1,1,2],[1,1,3],[ 2,1],[1,2,2],[1,2, 3] ....等]

我知道如何做一個列表有兩個子列表,但它需要適用於任何數量的子列表。

我是新來的prolog,請幫忙。

回答

2
try([],[]). 
try([L|Ls],[M|Ms]):- 
    member(M,L), 
    try(Ls,Ms). 

all(L,All) :- findall(M, try(L,M), All).  

嘗試返回一個由第一個參數的子列表元素組成的列表。所有這些名單都可以找到。

0

下面是你的答案,作爲一個新的prolog程序員自己裁剪和乾燥。

%elementInList(input list, output answer) 
answer(ListOfList, AnswerInList) :- 
    findall(Ans, combList(ListOfList, Ans), AnswerInList). 

%combList(ListOfList, Comb) :- 
combList([], []). 

combList([Head|Tail], Comb) :- 
    combList(Tail, [Element|Tempcomb]), 
    elementInList(Head, Element). 

%elementInList(List, Element) 
elementInList([Head|_], Head). 

elementInList([Head|Tail], Element) :- 
    elementInList(Tail, Element). 

使用定義答案(InputList,OutputResult),例如,

answer([[1,2],[7,8]],Comb). 
Comb = [[1, 7], [2, 7], [1, 8], [2, 8]]. 

和例如

answer([[1,2],[2,8],[3,6,9]],Comb). 
Comb = [[1, 2, 3], [2, 2, 3], [1, 8, 3], [2, 8, 3], [1, 2, 6], [2, 2, 6], [1, 8|...], [2|...], [...|...]|...]. 

等[X,Y,Z,..]適用於任何數量的子列表。別客氣。