このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1311089619/623
#  [1] 授業単元:C言語演習  
#  [2] 問題文(含コード&リンク):  
#  n個のデータを降順に並び変える関数を作成しなさい。  
#  ただし、個数nを先に入力し、必要なメモリ領域を関数malloc()を用いて確保すること。  
#  すなわち、配列による宣言はせずに、ポインタで宣言する。  
#  また、2つの変数の値を入れ替える関数swap()も作成すること。  
#  http://ime.nu/codepad.org/hZCN4vEh 
#  上の課題を提出したのですが、再提出を要求されました。  
#  コメントに対する直しがわかる方よろしくお願いします。 
#  

'n個のデータを降順に並び変える'(_n個) :-
        length(L1,_n個),
        n個の要素に値を詰める(L1),
        降順にならび変える(L1,L2).

'二つの要素を入れ替える'(_m番目,_n番目,L1,L2) :-
        length([_|L01],_m番目),
        length([_|L02],_n番目),
        append(L01,[A|R1],L1),
        append(L01,[B|R1],L3),
        append(L02,[B|R2],L3),
        append(L02,[A|R2],L2),!.

n個の要素に値を詰める(L1) :-
        findall(N,(
                    append(_,[_|_],L1),
                    N is random(1000)),
                L1).

降順にならび変える([],[]) :- !.
降順にならび変える(L1,L2) :-
        L1 = [A|R],
        降順にならび変える(A,R,L2).

降順にならび変える(A,L1,L2) :-
        分割(A,L1,_より大きいならび,_より小さいならび),
        降順にならび変える(_より大きいならび,L3),
        降順にならび変える(_より小さいならび,L4),
        append(L3,[A|L4],L2).

分割(_,[],[],[]) :- !.
分割(A,[B|R1],[B|R2],R3) :-
        B @> A,
        分割(A,R1,R2,R3).
分割(A,[B|R1],R2,[B|R3]) :-
        B @=< A,
        分割(A,R1,R2,R3).