このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1312201995/627
#  [1] 授業単元:アルゴリズム  
#  [2] 問題文(含コード&リンク):  
#   scanf で n を受け取り, 要素数 n の乱数配列を作成し, 指定した 2 つの要素番号にある要素を交換するプログラムを作成せよ. 
#  

'n を受け取り, 要素数 n の乱数ならびを作成し, 指定した 2 つの要素番号にある要素を交換する' :-
        'n を受け取り'(_n),
        '要素数 n の乱数配列を作成し'(_n,_乱数ならび),
        '指定した 2 つの要素番号にある要素を交換する'(_n,_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび),
        表示する(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび),!.

'n を受け取り'(_n) :-
        write('要素数nを入力してください : '),
        get_line(Line),
        'n受け取り検査'(Line,_n),!.
'n を受け取り'(_n) :-
        'n を受け取り'(_n).

'n受け取り検査'(Line,_n) :-
        atom_to_term(Line,_n,_),
        integer(_n),
        _n > 0,!.
'n受け取り検査'(Line,_n) :-
        writef('入力された%tからは適切な整数が得られませんでした。再入力をお願いします。\n',[Line]),
        fail.

'要素数 n の乱数配列を作成し'(_n,_乱数ならび) :-
        length(_乱数ならび,_n),
        findall(_乱数,(
                    append(_,[_乱数|_],_乱数ならび),
                    _乱数 is random(100) + 1),
                _乱数ならび).

'指定した 2 つの要素番号にある要素を交換する'(_n,_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび) :-
        '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2),
        '2 つの要素番号にある要素を交換する'(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび).

'指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2) :-
        writef('2つの要素番号[1~%t]をカンマ区切りで入力してください : ',[_n]),
        get_line(Line),
        '指定した 2 つの要素番号入力検査'(Line,_n,_要素番号_1,_要素番号_2),!.
'指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2) :-
        '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2).

'指定した 2 つの要素番号入力検査'(Line,_n,_要素番号_1,_要素番号_2) :-
        '入力行を2要素に分解する'(Line,_要素番号_1,_要素番号_2),
        '2要素はならびの要素範囲を指している'(Line,_n,_要素番号_1,_要素番号_2),!.
'指定した 2 つの要素番号入力検査'(Line,_要素番号_1,_要素番号_2) :-
        write('再入力をお願いします\n'),
        fail.

'入力行を2要素に分解する'(Line,_要素番号_1,_要素番号_2) :-
         split(Line,[','],[_要素番号_1,_要素番号_2]),!.
'入力行を2要素に分解する'(Line,_要素番号_1,_要素番号_2) :-
        writef('入力された%tからは2要素の要素番号が得られません。\n',[Line]),
        fail.

'2要素はならびの要素範囲を指している'(Line,_n,_要素番号_1,_要素番号_2) :-
        _要素番号_1 > 0,
        _要素番号_1 =< _n,
        _要素番号_2 > 0,
        _要素番号_2 =< _n,!.
'2要素はならびの要素範囲を指している'(Line,_n,_要素番号_1,_要素番号_2) :-
        writef('入力された要素には[1~%t]の範囲を逸脱しているものが有ります。\n',[Line,_n]),
        fail.

'2 つの要素番号にある要素を交換する'(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび) :-
        要素番号を変数に置換(_乱数ならび,_要素番号_1,_元の値_1,_変数_1,_乱数ならびの一),
        要素番号を変数に置換(_乱数ならびの一,_要素番号_2,_元の値_2,_変数_2,_2要素が交換された乱数ならび),
        _変数_1 = _元の値_2,
        _変数_2 = _元の値_1,!.

要素番号を変数に置換(_ならび,_要素番号,_元の値,_変数,_置換されたならび) :-
        length([_|L0],_要素番号),
        append(L0,[_元の値|R],_ならび),
        append(L0,[_変数|R],_置換されたならび).

表示する(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび) :-
        writef('元の乱数ならびは: %t\n',[_乱数ならび]),
        writef('%t番目と%t番目の要素を交換する\n',[_要素番号_1,_要素番号_2]),
        writef('2要素が交換された乱数ならびは: %t\n',[_2要素が交換された乱数ならび]),!.