このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1255709298/343
#  [1] 授業単元: C言語演習 
#  [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10014.txt
#
# 図のような過程を辿るもっとも簡単な整列アルゴリズムを実現せよ
# [0] 567,724,23,43,148,72
# [1] 23,724,567,43,148,72
# [2] 23,43,567,724,148,72
# [3] 23.43,72,724,148,567
# [4] 23,43,72,148,724,567
# [5] 23,43,72,148,567,724

挙動([0],[567,724,23,43,148,72]).
挙動([1],[23,724,567,43,148,72]).
挙動([2],[23,43,567,724,148,72]).
挙動([3],[23.43,72,724,148,567]).
挙動([4],[23,43,72,148,724,567]).
挙動([5],[23,43,72,148,567,724]).

整列([],[]) :- !.
整列([A|R1],[B|R3]) :-
    自分より後のならびの最小値が自分より小さいときにはこれと置換する([A|R],[B|R2]),
    整列(R2,R3),!.
整列([A|R1],[A|R2]) :-
    整列(R2,R3).

自分より後のならびの最小値が自分より小さいときにはこれと置換する([_自分|R1],[_最小値|R2]) :-
    最小値(R,_最小値位置,_最小値),
    _最小値 < _自分,
    要素番号によるならびの置換(_最小値位置,_自分,R1,R2).

最小値([A|R],_最小値位置,_最小値) :-
    最小値(2,A,R,1,_最小値位置,_最小値).

最小値(_,_最小値,[],M,M,_最小値).
最小値(N1,Min,[A|R],M,N_最小値) :-
    A < Min,
    N2 is N + 1,
    最小値(N2,A,R,N1,N,_最小値).
最小値(N1,Min,[_|R],M,N,_最小値) :-
    A >= Min,
    N2 is N + 1,
    最小値(N2,Min,R,M,N,_最小値).

要素番号によるならびの置換(1,_置換要素,[_|R1],[_置換要素|R1]) :- !.
要素番号によるならびの置換(N,_置換要素,[A|R1],[A|R2]) :-
    N1 is N - 1,
    要素番号によるならびの置換(N1,_置換要素,R1,R2).