このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1311089619/470
#  [1] 授業単元:C++プログラム  
#  [2] 問題文 
#  Nr(i)は身長とし、Na(i)氏名のデータとする 
#  どちらも10個の要素を持つ配列であり、それぞれは10人の身長と氏名のデータとして持つ。 
#   キーボードから身長Xを入力し、二分検索処理を用いてXの氏名をもとめ、結果をディスプレイへ表示するプログラムを作成せよ。 
#  よろしくお願いたします 
#  二分検索がいまいち理解できないので軽く解説も書いていただければ幸いです 
#   

'Nr(i)は身長とし、Na(i)氏名のデータとするどちらも10個の要素を持つ配列であり、それぞれは10人の身長と氏名のデータとして持つ。キーボードから身長Xを入力し、二分検索処理を用いてXの氏名をもとめ、結果をディスプレイへ表示する'(_Nr,_Na) :-
        'Nr,Naを身長をキーに整列しておく',
        'キーボードから身長Xを入力し'(_身長),
        二分検索で身長をキーに氏名を得る(_身長,_氏名ならび),
        結果をディスプレイに表示する(_身長,_氏名ならび).

'Nr,Naを身長をキーに整列しておく' :-
        retract('Nr'(_Nr)),
        retract('Na'(_Na)),
        '身長をキーに_Nr,_Naを整列する'(_Nr,_Na,_Nr2,_Na2),
        assertz('Nr'(_Nr2)),
        assertz('Na'(_Na2)).

'身長をキーに_Nr,_Naを整列する'(_Nr,_Na,_Nr2,_Na2) :-
        findall([_身長,_氏名],(
                    for(1,N,10),
                    nth1(N,_Nr,_身長),
                    nth1(N,_Na,_氏名)),
                L1),
        sort(L1,L2),
        findall(_身長,(
                    append(_,[[_身長,_]|_],L2)),
                _Nr2),
        findall(_氏名,(
                    append(_,[[_,_氏名]|_],L2)),
                _Nr2),!.

'キーボードから身長Xを入力し'(_身長) :-
        write('検索する身長を入力してください : '),
        readln([_身長]),
        integer(_身長),!.
'キーボードから身長Xを入力し'(_身長) :-
        'キーボードから身長Xを入力し'(_身長).

二分検索で身長をキーに氏名を得る(_身長,_氏名ならび) :-
        'Nr'(_身長ならび),
        'Na'(_氏名ならび),
        length(_身長ならび,Len),
        findall(_氏名,(
                    二分検索で身長をキーに氏名を得る(1,Len,_身長ならび,_氏名ならび,_身長,_氏名),_氏名ならび),
        \+(_氏名ならび=[]),!.
二分検索で身長をキーに氏名を得る(_身長,'求める氏名は得られませんでした。\n').

二分検索で身長をキーに氏名を得る(Nth1,Nth2,_身長ならび,_氏名ならび,_身長,_氏名) :-
        Nth3 is (Nth1 + Nth2) // 1,
        nth1(Nth3,_身長ならび,_身長1),
        二分検索で身長をキーに氏名を得る(_身長,_身長1,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび,_氏名).

二分検索で身長をキーに氏名を得る(_身長,_身長1,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび,_氏名) :-
        _身長 > _身長1,
        二分検索で身長をキーに氏名を得る(Nth1,Nth3,_身長ならび,_氏名ならび,_身長,_氏名).
二分検索で身長をキーに氏名を得る(_身長,_身長1,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび,_氏名) :-
        _身長 < _身長1,
        二分検索で身長をキーに氏名を得る(Nth3,Nth2,_身長ならび,_氏名ならび,_身長,_氏名).
二分検索で身長をキーに氏名を得る(_身長,_身長,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび,_氏名) :-
        nth1(Nth3,_氏名ならび,_氏名).
二分検索で身長をキーに氏名を得る(_身長,_身長,Nth1,Nth2,Nth3,_身長ならび,_氏名ならび) :-
        要素位置によるならびからの削除(Nth3,_身長ならび,_身長ならび2),
        要素位置によるならびからの削除(Nth3,_氏名ならび,_氏名ならび2),
        Nth2_1 is Nth2 - 1,
        二分検索で身長をキーに氏名を得る(Nth1,Nth2_1,_身長ならび2,_氏名ならび2,_身長,_氏名).

結果をディスプレイに表示する(_身長,_氏名ならび) :-
        list(_氏名ならび),
        append(_,[_氏名|R],_氏名ならび),
        writef('身長%tの氏名は%tです\n',[_身長,_氏名]),
        R = [],!.
結果をディスプレイに表示する(_身長,_診断) :-
        atom(_診断),
        write(_診断),!.

要素位置によるならびからの削除(Nth,L1,L2) :-
        length([_|L0],Nth),
        append(L0,[_|R],L1),
        append(L0,R,L2),!.