2

我需要在列表列表中找到组合。例如给出以下列表,

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

这些应该是输出,

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

另一个例子:

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

梳 = [[1,1,1],[1,1,2],[1,1,3],[1,2,1],[1,2,2],[1,2,3] ....ETC]

我知道如何为具有两个子列表的列表执行此操作,但它需要适用于任意数量的子列表。

我是prolog的新手,请帮忙。

4

2 回答 2

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

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

try 返回一个由第一个参数的子列表的元素组成的列表。all 查找所有此类列表。

于 2012-04-20T09:21:13.617 回答
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).

使用定义 answer(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,..]。别客气。

于 2012-04-27T09:15:25.740 回答