从列表列表中创建列表

时间:2010-01-21 09:02:13

标签: prolog

我需要执行以下操作:给定列表列表,我需要找到列表的所有可能组合,这样如果这些列表中的某些列表属于这样的组合,那么它们没有共同的元素,并且列表由在组合中附加列表具有给定长度。有什么想法吗?

示例:

Say P= [[1,2,3],[4,5,6],[2,5],[7,9],[7,10],[8],[10]]. 

N给定数字,比如说N = 10。我需要搜索P才能找到合适的列表,没有共同的元素,并将它们添加到列表L中,使得L的并集长度为10.所以在上面的示例中:

L=[[1,2,3],[4,5,6],[7,9],[8],[10]].这可能很容易,但我是Prolog的新手

1 个答案:

答案 0 :(得分:0)

鉴于没有人回答,而且已经有一段时间了,因为我在Prolog中写了任何东西,我想我需要练习,这就是你的做法。

首先,为了更容易地生成组合,我们创建了一个术语来预处理列表,使它们与它们的长度配对,以避免必须多次获取长度。切割避免了不必要的回溯:

with_lengths([], []) :- !.
with_lengths([H|T1], [(Len, H)|T2]) :-
    length(H, Len),
    with_lengths(T1, T2).

这是comb/3谓词,用于生成组合:

comb(L, R, Max) :-
    with_lengths(L, L1),
    comb1(L1, R, Max).

comb1/3完成实际工作。评论解释了发生了什么:

% Combination works.
comb1([], [], 0).
% Try combining the current element with the remainder.
comb1([(Len, Elem)|T1], [Elem|T2], Max) :-
    NewMax is Max - Len,
    comb1(T1, T2, NewMax).
% Alternatively, ignore the current element and try
% combinations with the remainder.
comb1([_|T1], T2, Max) :-
    comb1(T1, T2, Max).