Prolog组合数学
是否有任何方法可以生成所有可能性,例如将9个字母分成3个小组,如下所示: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: 询
- 第一队: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).