Prolog组合数学

Prolog组合数学,prolog,logic-programming,Prolog,Logic Programming,是否有任何方法可以生成所有可能性,例如将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] 下一代应该是下一个组合,直到没有更多的组合。有办法吗?当然: -从原始列表中选择两个成员,将其放置在T1中 -在其余的成员中选择3个,并将其放置在T2中 -其余的是T3: 询

是否有任何方法可以生成所有可能性,例如将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]

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

有办法吗?当然:

-从原始列表中选择两个成员,将其放置在
T1

-在其余的成员中选择3个,并将其放置在
T2

-其余的是
T3


询问

:- teams([a,b,c,d,e,f,g,h,i], T1, T2, T3).
正在生成请求的输出。请注意,上述代码假设输入格式正确(即列表中的元素数正确)

更新: 您可以在SWI prolog中使用
select/3
谓词,而不是
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).
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).