このディレクトリの索引
#  出題場所:: http://toro.2ch.net/test/read.cgi/tech/1357191974/435
#  お題:1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は 
#  元のデータの順に)表示する。

'1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)表示する。' :-
        '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(1,[],_整列した_開始位置_数値定数ならび),
        表示する(_整列した_開始位置_数値定数ならび).

'1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_数値,L,L) :-
        _数値 > 100,!.
'1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_数値,L1,L) :-
        出現順に挿入整列する(_数値,L1,L2),
        _数値_2 is _数値 + 1,
        '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_数値_2,L2,L).

出現順に挿入整列する(_数値,L1,L2) :-
        atom_number(_数値定数,_数値),
        チャンパーノウン定数に出現(_数値定数,_開始位置),
        挿入整列する(_開始位置,_数値,L1,L2).

チャンパーノウン定数に出現(_数値定数,_開始位置) :-
        チャンパーノウン定数の生成(1,'0.1',_チャンパーノウン定数),
        sub_atom(_チャンパーノウン定数,_開始位置,_,_,_数値定数),!.

チャンパーノウン定数の生成(_数値,_チャンパーノウン定数,_チャンパーノウン定数).
チャンパーノウン定数の生成(_数値_1,_チャンパーノウン定数_1,_チャンパーノウン定数) :-
        _数値_2 is _数値_1 + 1,
        atom_number(_数値定数,_数値_2),
        atom_concat(_チャンパーノウン定数_1,_数値定数,_チャンパーノウン定数_2),
        チャンパーノウン定数の生成(_数値_2,_チャンパーノウン定数_2,_チャンパーノウン定数).

挿入整列する(_開始位置,_数値,[],[[_開始位置,_数値]]).
挿入整列する(_開始位置,_数値,[[_開始位置_1,_数値_1]|R],[[_開始位置,_数値],[_開始位置_1,_数値_1]|R]) :-
        _開始位置 =< _開始位置_1,!.
挿入整列する(_開始位置,_数値,[[_開始位置_1,_数値_1]|R1],[[_開始位置_1,_数値_1]|R2]) :-
        挿入整列する(_開始位置,_数値,R1,R2).

表示する(_整列した_開始位置_数値ならび) :-
        forall(member([_,_数値],_整列した_開始位置_数値ならび),writef('%t\n',[_数値])).