Prolog组合学
Prolog combinatorics
有没有办法生成所有的可能性,比如将 9 个字母分成 3 组,如下所示:
- 第 1 队:2 个字母
- 第 2 队:3 个字母
- 第 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]
下一代应该是下一个组合,直到没有更多的组合。
有办法吗?当然:
-从原列表中选取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).
正在生成请求的输出。请注意,上面的代码假设输入的格式正确(即列表中的元素数量正确)。
更新:
您可以在 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).
有没有办法生成所有的可能性,比如将 9 个字母分成 3 组,如下所示:
- 第 1 队:2 个字母
- 第 2 队:3 个字母
- 第 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]
下一代应该是下一个组合,直到没有更多的组合。
有办法吗?当然:
-从原列表中选取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).
正在生成请求的输出。请注意,上面的代码假设输入的格式正确(即列表中的元素数量正确)。
更新:
您可以在 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).