このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1342966104/667
#  [1] 授業単元:C言語  
#  [2] 問題文: http://ime.nu/ideone.com/tRkzM 
#  
#  1. 10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示するプログラムを作成せよ。
#    ただし数値は何番目に生成した数値かも表示する。
#   
#    例)1番目に小さい数は475番目の数10049です。
#   
#  2. 10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を   表示するプログラムを作成せよ。また、各数値は何番目に生成したかも表示する。
#   
#    例)1番目に平均との差が小さい数は680番目の数69383です。 平均値との差は10.505です。
#   
#  3. n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。
#    ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15は仮定する。
#   
#    例)program 5
#        a,b,c,d,e
#        a,b,c,e,d
#        a,b,d,c,e
#            ・
#        ・
#      e,d,c,b,a

'10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を表示する。各数値は何番目に生成したかも表示する' :-
        '10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび),
        '各数値と平均値との差をもとめ、その差が小さい順にその数値を表示する。各数値は何番目に生成したかも表示する'(_自然数ならび).

'10000から99999のランダムな自然数を1000コ生成し'(_自然数ならび) :-
        findall(N,(
                    between(1,10000,_),
                    N is random(10000) + 10000),
                _自然数ならび).

'各数値と平均値との差をもとめ、その差が小さい順にその数値を表示する'(_自然数ならび) :-
        各数値と平均値との差をもとめ(_自然数ならび,_何番目かの情報を付けた平均との差ならび),
        その差が小さい順に(_何番目かの情報を付加した平均との差ならび,_小さい順に整列した何番目かの情報を付加した平均との差ならび),
        その数値を表示する(_小さい順に整列した何番目かの情報を付加した平均との差ならび).

各数値と平均値との差をもとめ(_自然数ならび,_何番目かの情報を付加した平均との差ならび) :-
        平均値(_自然数ならび,_平均値),
        findall([_差,_何番目],(
                    append(L0,[_数値|_],_自然数ならび),
                    length([_|L0],_何番目),
                    _差 is abs(_数値 - _平均値)),
                _何番目かの情報を付加した平均との差ならび).

平均値(_自然数ならび,_平均値) :-
        相加平均(_自然数ならび,_平均値).

小さい順にこれら数値を表示する(_自然数ならび) :-
        小さい順に数値を(_自然数ならび,_小さい順に整列した自然数ならび),
        表示する(_小さい順に整列した自然数ならび)

その差が小さい順に([],[]).
その差が小さい順に([_軸要素|_残りならび],_小さい順に整列した自然数ならび) :-
       分割(_軸要素,_残りならび,_軸要素と等しいか小さい自然数ならび,_軸要素より大きい自然数ならび),
       その差が小さい順に(_軸要素と等しいか小さい自然数ならび,_小さい順に整列した軸要素と等しいか小さい自然数ならび),
       その差が小さい順に(_軸要素より大きい自然数ならび,_小さい順に整列した軸要素より大きい自然数ならび),
       append(_小さい順に整列した軸要素と等しいか小さい自然数ならび,[_軸要素|_小さい順に整列した軸要素より大きい自然数ならび],_小さい順に整列した自然数ならび).

分割(_,[],[]).
分割(_軸要素,[A|R],[A|R1],R2) :-
        A @=< _軸要素,
        分割(_軸要素,R,R1,R2).
分割(_軸要素,[A|R],R1,[A|R2]) :-
        A @> _軸要素,
        分割(_軸要素,R,R1,R2).

'その数値を表示する。各数値は何番目に生成したかも表示する'(_,[]).
'その数値を表示する。各数値は何番目に生成したかも表示する'(_自然数ならび,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10|R]) :-
        '数値と何番目かを表示する'(_自然数ならび,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]),
        'その数値を表示する。各数値は何番目に生成したかも表示する'(_自然数ならび,R).

'数値と何番目かを表示する'(_,[]) :-
        write('\n').
'数値と何番目かを表示する'(_自然数ならび,[[_,_位置]|R]) :-
        nth1(_位置,_自然数ならび,_数値),
        writef('%t(%t) ',[_位置,_数値]),
        '数値と何番目かを表示する'(_自然数ならび,R).

相加平均(_値ならび,_相加平均) :-
        length(_値ならび,_標本数),
        相加平均(_値ならび,_標本数,0,_相加平均).

相加平均([],_標本数,_合計,_相加平均) :-
        _相加平均 is _合計 / _標本数,!.
相加平均([V|R],_標本数,_合計_1,_相加平均) :-
        _合計_2 is _合計_1 + V,
        相加平均(R,_標本数,_合計_2,_相加平均).