このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1312201995/279
#  [1] 授業単元:アルゴリズム講義及び実習I 
#  [2] 問題文(含コード&リンク):分割統治法を用いて、n人の集団の中から、所持金が頭から数えてm番目の人を見つける 
#  名前、所持金、順番(m)を入力し、所持金がm番目の人の名前を出力する 
#  

'分割統治法を用いて、n人の集団の中から、所持金が頭から数えてm番目の人を見つける。名前、所持金、順番(m)を入力し、所持金がm番目の人の名前を出力する。'(_m,_名前) :-
        述語として定義された節は整列できないので一旦リストに取る(L),
        降順にm番目(L,_m,[_所持金,_名前]).

述語として定義された節は整列できないので一旦リストに取る(L) :-
        findall([_所持金,_名前],(
                    所持金(_名前,_所持金)),
                L).

降順にm番目(L1,_m番目,L) :-
        降順にm番目(L1,0,_m番目,L).

降順にm番目([E|R],_m番目_1,_m番目,L) :-
        降順にm番目(R,E,[],[],_m番目_1,_m番目,L).

降順にm番目([],E,L1,L2,_m番目_1,_m番目,L) :-
        length(L1,Len),
        _m番目 =< _m番目 + Len,
        降順にm番目(L1,_m番目_1,_m番目,L);
        length(L1,Len),
        _m番目 is _m番目_1 + Len + 1,
        E = L;
        _m番目 >= _m番目_1,
        length(L1,Len1),
        _m番目2 is _m番目_1 + Len1 + 1,
        降順にm番目(L2,_m番目2,_m番目,L).  
降順にm番目([A|R1],B,L1,L2,_m番目_1,_m番目,L) :-
        A @>= B,
        降順にm番目(R1,B,[A|L1],L2,_m番目_1,_m番目,L).
降順にm番目([A|R1],B,L1,L2,_m番目_1,_m番目,L) :-
        A @< B,
        降順にm番目(R1,B,L1,[A|L2],_m番目_1,_m番目,L).