このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1200175247/861
#  [1] 授業単元:ファイル操作、2分探索法  
#  [2] 問題文:学生の身長、体重のデータを読み込みある学籍番号を入力した 
#  ときにその学生の学籍番号、身長、体重を2分探索法により求め、出力しなさい。 
#  学生のデータは、txtファイルでxx yyy zzという風に記載されています。 
#  (例)出力結果 
#  学生番号:xx 
#  身長:yyy (cm) 
#  体重:zz (kg)  
#  

学生の身長、体重のデータを読み込む(_テキストファイル) :-
        get_split_lines(_テキストファイル,[' '],LL),
        二分木を育てる(LL).

ある学籍番号を入力したときにその学生の学籍番号、身長、体重を2分探索法により求める(_学籍番号,_身長,_体重) :-
        二分木の根(_根),
        葉まで辿る([_学籍番号,_身長,_体重],_根).

二分木を育てる([A|R]) :-
        assertz(二分木(A,_,_)),
        assertz(二分木の根(A)),
        二分木を育てる(L,_根).

二分木を育てる([],_) :- !.
二分木を育てる([A|R],_根) :-
        根・葉の成長(A,_根),
        二分木を育てる(R,_根).

葉まで辿る(_値,_値) :-
        二分木(_値,_左,_右).
葉まで辿る(_値,_根) :-
        二分木(_根,_左,_右),
        変数を含む値を較べる(@<,_値,_根),
        \+(var(_左)),
        葉まで辿る(_値,_左).
葉まで辿る(_値,_根) :-
        二分木(_根,_左,_右),
        変数を含む値を較べる(@>=,_値,_根),
        \+(var(_右)),
        葉まで辿る(_値,_右).
        
根・葉の成長(_値,_根) :-
        二分木(_根,_左,_右),
        変数を含む値を較べる(@<,_値,_根),
        \+(var(_左)),
        根・葉の成長(_値,_左).
根・葉の成長(_値,_根) :-
        二分木(_根,_左,_右),
        変数を含む値を較べる(@>=,_値,_根),
        \+(var(_右)),
        根・葉の成長(_値,_右).
根・葉の成長(_値,_根) :-
        retract(二分木(_根,_左,_右1)),
        根・葉の成長(_値,_根,_左,_右1),!.

根・葉の成長(_値,_根,_左,_右1) :-
        変数を含む値を較べる(@<,_値,_根),
        var(_左),
        assertz(二分木(_根,_値,_右1)),
        assertz(二分木(_値,_,_)),!.
根・葉の成長(_値,_根,_左,_右1) :-
        変数を含む値を較べる(@>=,_値,_根),
        var(_右),
        assertz(二分木(_根,_左,_値)),
        assertz(二分木(_値,_,_)),!.

変数を含む値を較べる(@<,[V|R1],[_|R2]) :-
        var(V),
        変数を含む値を較べる(@<,R1,R2),!.
変数を含む値を較べる(@<,[A|R1],[B|R2]) :-
        \+(var(A)),
        A @< B,!.
変数を含む値を較べる(@>=,[],[]) :- !.
変数を含む値を較べる(@>=,[V|R1],[_|R2]) :-
        var(V),
        変数を含む値を較べる(@>=,R1,R2),!.
変数を含む値を較べる(@>=,[A|R1],[B|R2]) :-
        \+(var(A)),
        A @> B,!. 
変数を含む値を較べる(@>=,[A|R1],[A|R2]) :-
        \+(var(A)),
        変数を含む値を較べる(@>=,R1,R2).