次のように、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]
次世代は、組み合わせがなくなるまで、次の組み合わせにする必要があります。
次のように、9 文字を 3 つのチームに分割するなど、すべての可能性を生成する方法はありますか。
例:
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).
要求された出力を生成しています。上記のコードは、入力が正しい形式 (つまり、リストの要素数が正しい) であると想定していることに注意してください。
更新:組み合わせselect/3
の代わりに SWI プロローグで述語を
使用できます。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).