-2

有没有办法产生所有的可能性,比如 9 个字母分成 3 个团队,像这样:

  • 第一队:2个字母
  • 第二组:3个字母
  • 第三组:4个字母
  • ?

例子:

find([a, b, c, d, e, f, g, h, i], T1, T2, T3).
T1 = [a, b]
T2 = [c, d, e]
T3 = [f, g, h, i]

下一代应该是下一个组合,直到没有更多的组合。

4

1 回答 1

2

有办法吗?当然:

-从原始列表中选择 2 个成员,将它们放入T1.
- 在其余的成员中挑选 3 个成员并将它们放入T2.
-剩下的是T3

teams(L, T1, T2, T3) :-
    pick2(L, T1, L1),
    pick3(L1, T2, T3).

pick2(L, [M1, M2], Rest) :-
    member(M1, L),   
    delete(L, M1, L1),
    member(M2, L1),
    delete(L1, M2, Rest).

pick3(L, [M1, M2, M3], Rest) :-
    pick2(L, [M1, M2], L1),
    member(M3, L1),
    delete(L1, M3, Rest).

查询

:- teams([a,b,c,d,e,f,g,h,i], T1, T2, T3).

正在产生请求的输出。请注意,上面的代码假设输入格式正确(即列表具有正确数量的元素)。

更新: 您可以select/3在 SWI prolog 中使用谓词而不是member/delete组合:

teams(L, T1, T2, T3) :-
    pick2(L, T1, L1),
    pick3(L1, T2, T3).

pick2(L, [M1, M2], Rest) :-
    select(M1, L, L1),
    select(M2, L1, Rest).

pick3(L, [M1, M2, M3], Rest) :-
    pick2(L, [M1, M2], L1),
    select(M3, L1, Rest).
于 2015-05-22T19:51:45.603 回答