このディレクトリの索引
#  出典 :: スレ立てるまでもない質問はここで135匹目 #794"
#  100という整数があります
#  これを25から40の範囲の整数として3等分します
#  例
#  30, 30, 40
#  35, 35, 30
#  25, 40, 35


'100という整数があります。これを25から40の範囲の整数として3等分します。'(N1,N2,N3) :-
        findall(N,between(25,40,N),L),
        重複組合せ(L,3,[N1,N2,N3]),
        100 is N1 + N2 + N3.

重複組合せ(_候補ならび,1,[A]) :-
        要素数が1の場合は候補ならびから順にAを生成して行きます(_候補ならび,A).
重複組合せ([A|_候補ならび],_要素数,[A|_重複組合せ]) :-
        '候補ならびは変更せずに(重複の所以)生成要素数を減らしながら重複組合せを組み立てます'([A|_候補ならび],_要素数,_重複組合せ).
重複組合せ([_|_候補ならび],_要素数,_重複組合せ) :-
        'バックトラックして来たら、候補ならびをひとつずつ減らしながら重複組合せを生成します'(_候補ならび,_要素数,_重複組合せ).

要素数が1の場合は候補ならびから順にAを生成して行きます(_候補ならび,A) :-
        member(A,_候補ならび).

'候補ならびは変更せずに(重複の所以)生成要素数を減らしながら重複組合せを組み立てます'([A|_候補ならび],_要素数,_重複組合せ) :-
        _要素数 > 1,
        _要素数_1 is _要素数 - 1,
        重複組合せ([A|_候補ならび],_要素数_1,_重複組合せ).

'バックトラックして来たら、候補ならびをひとつずつ減らしながら重複組合せを生成します'(_候補ならび,_要素数,_重複組合せ) :-
        _要素数 > 1,
        重複組合せ(_候補ならび,_要素数,_重複組合せ).