首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从列表列表创建列表

从列表列表创建列表
EN

Stack Overflow用户
提问于 2010-01-21 17:02:13
回答 1查看 1.3K关注 0票数 1

我需要做以下事情:给定一个列表列表,我需要找到列表的所有可能的组合,如果这些列表中的一些属于这样的组合,那么它们没有共同的元素,并且通过在组合中附加列表而创建的列表具有给定的长度。有什么想法吗?

示例:

代码语言:javascript
复制
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]].是个新手

EN

回答 1

Stack Overflow用户

发布于 2012-11-29 08:54:56

考虑到没有人回答,而且我已经很久没有用Prolog写东西了,我想我需要练习,下面是你怎么做的。

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

代码语言:javascript
复制
with_lengths([], []) :- !.
with_lengths([H|T1], [(Len, H)|T2]) :-
    length(H, Len),
    with_lengths(T1, T2).

下面是用于生成组合的comb/3谓词:

代码语言:javascript
复制
comb(L, R, Max) :-
    with_lengths(L, L1),
    comb1(L1, R, Max).

comb1/3完成实际的工作。评论解释了正在发生的事情:

代码语言:javascript
复制
% 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).
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2107973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档