このディレクトリの索引
http;//http://pc12.2ch.net/test/read.cgi/tech/1255709298/832
# [1] 授業単元: プログラミング実習
# [2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10093.txt
#
# N個(Nは定数マクロとして適当な数字を定義せよ)の整数擬似乱数を発生させ、
# これらの整数を大きい順に並べて表示するプログラムを作成せよ。
# 並べ方の方法は、まず配列の中から最大値を選び、配列の一番先頭の要素と交換する。
# 次に、先頭要素を除く残りの要素(二番目以降)の中で最大値を選び、配列の二番目の要素と交換する。
# 次に、三番目以降の要素の中で最大値を選び、配列の三番目の要素と交換する・・・・・
# というように残りの要素に対しても繰り返しおこなう。これにより書く要素が大きい順に配列の丈夫に埋まっていく。
# 
要素数(20).

k2_832 :-
    要素数(_要素数).
    findall(R,(for(1,N,_要素数),R is random // 3217),L1),
    最大値交換法による整列(L1,L2),
    write_formatted('発生した数値列=%t\n',[L1]),
    write_formatted('整列した数値列=%t\n',[L2]).


最大値交換法による整列([A],[A]) :- !.
最大値交換法による整列([A|R1],[Max|R2]) :-
    最大値の位置(R1,[Nth|_],Max),
    最大値と先頭要素を置換(A,Nth,Max,R1,Y),
    最大値交換法による整列(Y,R2),!.
最大値交換法による整列([A|R1],[A|R2]) :- 最大値交換法による整列(R1,R2).

最大値と先頭要素を置換(A,Nths,Max,R1,X) :- Max @> A, 'ならびの位置指定置換'(Nths,A,R1,L).

ならびの位置指定置換(1,A,[_|R],[A|R]) :- !.
ならびの位置指定置換(N,A,[B|R1],[B|R2]) :- N1 is N - 1,ならびの位置指定置換(N1,A,R1,R2).

最大値の位置(_ならび,_位置ならび,_最大値) :- _ならび = [A|R1],
    最大値の位置(R1,A,1,[1],_逆順の位置ならび,_最大値),
    reverse(_逆順の位置ならび,_位置ならび).

最大値の位置([],A,N,NX,NX,A).
最大値の位置([B|R1],A,N1,_,NX,X) :-
    B @> A,
    N2 is N1 + 1,
    最大値の位置(R1,B,N2,[N2],NX,X).
最大値の位置([B|R1],A,N1,NY,NX,X) :-
    B = A,
    N2 is N1 + 1,
    最大値の位置(R1,B,N2,[N2|NY],NX,X),!.
最大値の位置([B|R1],A,N1,NY,NX,X) :-
    B @< A,
    N2 is N1 + 1,
    最大値の位置(R1,A,N2,NY,NX,X),!.