从列表中创建一个列表

问题描述:

我需要执行以下操作:给定一个列表列表,我需要找到列表的所有可能组合,这样如果这些列表中的某些属于这样的组合,那么它们就没有共同的元素和通过在组合中追加列表而创建的列表具有给定的长度。有任何想法吗?从列表中创建一个列表

实施例:

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

N A给定数量,说N = 10。我需要通过P搜索以找到合适的列表,并且没有共同的元素,并将它们添加到列表L中,使得L的并集长度为10.因此,在上面的示例中:

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

+0

你能举个例子吗?这可能会让你的问题更清楚。 – 2010-01-21 09:04:02

+0

非常清晰。 – rvirding 2010-01-21 11:08:59

+0

为什么我要评论这样一个旧线程?对于Prolog来说,必须非常感兴趣。 :-)听起来像他要求的P的一个子集,其中包含N个独特(子)元素(而不是其他人);否则是错误的。 – azhrei 2012-07-19 06:40:40

鉴于没有人回答,而且自从我在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).