このディレクトリの索引
#  <問題> 
#  ノートを7冊ずつ配ると28冊余り,10冊ずつ配ると最後の一人にわたすノートは 
#  他の半分にも達しませんでした。ノートの数と人数を求めなさい。 <開成中入試問題> 
#   

'ノートを7冊ずつ配ると28冊余り,10冊ずつ配ると最後の一人にわたすノートは他の半分にも達しませんでした。ノートの数と人数を求めなさい。'(_ノートの数,_人数) :-
        'ノートを7冊ずつ配ると28冊余り'(_人数ならび,_ノートならび),
        '10冊ずつ配ると最後の一人にわたすノートは他の半分にも達しませんでした'(_人数ならび,_ノートならび),
        length(_ノートならび,_ノートの数),
        length(_人数ならび,_人数),!.

'ノートを7冊ずつ配ると28冊余り'(_人数ならび,_ノートならび) :-
        length(_28冊ならび,28),
        組の生成([_,_,_,_,_,_,_],[],LL),
        人数ならび(LL,_人数ならび),
        flatten(LL,_7冊ずつ全員に配ったならび),
        append(_7冊ずつ全員に配ったならび,_28冊ならび,_ノートならび).

'10冊ずつ配ると最後の一人にわたすノートは他の半分にも達しませんでした'([_|_最後のひとりを除いた人数ならび],_ノートならび) :-
        '10冊ずつ配ると'(LL,_最後のひとりを除いた人数ならび),!,
        flatten(LL,_最後のひとりを除いて行き渡ったノートならび),
        最後の一人にわたすノートは他の半分にも達しませんでした(_最後のひとりを除いて行き渡ったノートならび,_最後のひとりを除いた人数ならび,_ノートならび),!.

'10冊ずつ配ると'(LL,_最後のひとりを除いた人数ならび) :-
        組の生成([_,_,_,_,_,_,_,_,_,_],[],LL),
        人数ならび(LL,_最後のひとりを除いた人数ならび),!.

最後の一人にわたすノートは他の半分にも達しませんでした(_最後のひとりを除いて行き渡ったノートならび,_最後のひとりを除いた人数ならび,_ノートならび) :-
        append(_最後のひとりを除いて行き渡ったノートならび,_最後の一人にわたすノートならび,_ノートならび),
        append(_最後の一人にわたすノートならび,_最後の一人にわたすノートならび,R,[_,_,_,_,_,_,_,_,_,_]),
        \+(R = []),!.

組の生成(_,L,L).
組の生成(L1,R,X) :- 組の生成(L1,[L1|R],X).

人数ならび(L2,_人数ならび) :-
        findall(_,member(_,L2),_人数ならび).

append([],L2,L3,L4) :-
        append(L2,L3,L4).
append([U|L1],L2,L3,[U|L4]) :-
        append(L1,L2,L3,L4).