このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1357748713/149
#  [1] 授業単元:データ構造アルゴリズム 
#  [2] 問題文(含コード&リンク) : qsort関数を用いてソートするプログラムを作成しなさい。身長の昇順、視力の降順など、複数の条件でソートすること。 
#  ※qsort関数 
#  書式 void qsort(void*base,size_t nmemb,size_t size,int(*compar)(const void*,const void)) 
#  

'qsort関数を用いてソートするプログラムを作成しなさい。身長の昇順、視力の降順など、複数の条件でソートすること。'(_テーブル名,_昇順降順,_鍵ならび,L) :-
        単位節からリストに変換(_テーブル名,_属性名ならび,L1),
        鍵位置ならびを得る(_鍵ならび,_属性名ならび,_鍵位置ならび),
        鍵付きqsort(L1,_昇順降順,_鍵位置ならび,L2).

単位節からリストに変換(_テーブル名,_属性名ならび,L1) :-
        findall(_属性名,(
                    テーブル定義(_テーブル名,_,_属性名)),
                _属性名ならび),
        length(_属性名ならび,Len),
        length(_引数ならび,Len),
        P =.. [_身体検査|_引数ならび],
        findall(_引数ならび,(
                    call(P)),
                L1).

鍵位置ならびを得る([],_,[]).
鍵位置ならびを得る([_鍵|R1],_属性名ならび,[_鍵位置|R3]) :-
        nth1(_鍵位置,_属性名ならび,_鍵),
        鍵位置ならびを得る(R1,_属性名ならび,R3).

鍵付きqsort([],_,_,[]) :- !.
鍵付きqsort([_軸要素|R1],_昇順降順,_鍵位置ならび,LL2) :-
        鍵取得(_鍵位置ならび,_軸要素,_軸要素の鍵ならび),
        分割(_軸要素の鍵ならび,R1,_昇順降順,_鍵位置ならび,LL1,LL2),
        鍵付きqsort(LL1,_鍵位置ならび,LL1_s),
        鍵付きqsort(LL2,_鍵位置ならび,LL2_2),
        append(LL1_s,[_軸要素|LL2_s],LL2).

鍵取得([],_,[]).
鍵取得([_鍵位置|R1],L,[_鍵|R3]) :-
        nth1(_鍵位置,L,_鍵),
        鍵取得(R1,L,R3).

分割(_軸要素の鍵ならび,[],_,_鍵位置ならび,[],[]).
分割(_軸要素の鍵ならび,[L1|R2],_昇順降順,_鍵位置ならび,L2,L3) :-
        鍵取得(_鍵位置ならび,L1,_鍵ならび_2),
        分割_2(_昇順降順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,L2,L3),
        分割(_軸要素の鍵ならび,R2,_昇順降順,_鍵位置ならび,R2,R3).

分割_2(昇順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,[_鍵ならび|R2],R3) :-
        _軸要素の鍵ならび @=< _鍵ならび.
分割_2(昇順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,R2,[_鍵ならび|R3]) :-
        _軸要素の鍵ならび @> _鍵ならび.
分割_2(降順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,[_鍵ならび|R2],R3) :-
        _軸要素の鍵ならび @>= _鍵ならび.
分割_2(降順,_軸要素の鍵ならび,_鍵ならび_2,R2,R3,R2,[_鍵ならび|R3]) :-
        _軸要素の鍵ならび @< _鍵ならび.