-2

次のように、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]

次世代は、組み合わせがなくなるまで、次の組み合わせにする必要があります。

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 プロローグで述語を 使用できます。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 に答える