このディレクトリの索引
#  teitter by @SaitoAtsushi 2014-02-16
#  問題

三人の年齢(_1,_2,_3) :-
        'Bの年齢'(Bの年齢),
        '36の約数の重複組合せから年齢候補を得る'(_1,_2,_3),
        Bの年齢 is _1 + _2 + _3,
        最も高い年齢の子供は一人(_1,_2,_3).

'Bの年齢'(Bの年齢) :-
        '36の約数の重複組合せから年齢候補を得る'(_1,_2,_3),
        最も高い年齢の子供が複数いる(_1,_2,_3),
        Bの年齢 is _1 + _2 + _3.

'36の約数の重複組合せから年齢候補を得る'(_1,_2,_3) :-
        '36の約数を得る'(1,_36の約数ならび),
        重複組合せ(_36の約数ならび,3,[_1,_2,_3]),
        36 is _1 * _2 * _3.

'36の約数を得る'(36,[36]) :- !.
'36の約数を得る'(N,[N|R]) :-
        0 is 36 mod N,!,
        N_2 is N + 1,
        '36の約数を得る'(N_2,R).
'36の約数を得る'(N,[N|R]) :-
        N_2 is N + 1,
        '36の約数を得る'(N_2,R).

重複組合せ(X,1,[A]) :-
        member(A,X).
重複組合せ([A|Y],N,[A|X]) :-
        N > 1,
        M is N - 1,
        重複組合せ([A|Y],M,X).
重複組合せ([_|Y],N,A) :-
        N > 1,
        重複組合せ(Y,N,A).

最も高い年齢の子供は一人(_1,_2,_3) :-
        append(L1,[_最大年齢|L2],[_1,_2,_3]),
        \+((member(A1,L1),A1 >= _最大年齢)),
        \+((member(A2,L2),A2 >= _最大年齢)),!.

最も高い年齢の子供が複数いる(_1,_2,_3) :-
        append(L1,[_最大年齢|L2],[_1,_2,_3]),
        \+((member(A1,L1),A1 > _最大年齢)),
        \+((member(A2,L2),A2 > _最大年齢)),
        (member(_最大年齢,L1);member(_最大年齢,L2)).