このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1370255305/429
http://toro.2ch.net/test/read.cgi/tech/1370255305/430
http://toro.2ch.net/test/read.cgi/tech/1370255305/431
#  [1] 授業単元:アルゴリズム 
#  [2] 問題文(含コード&リンク):次レスで 
#  
#  ランダムな整数がデータとして保存されたファイルから,まず,データの個数nを読み込み,その数だけデータを読み込み2分探索木に格納する.  
#  次に整数を一つだけキーボードから入力する.  
#  そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.  
#  さらに,読み込んだデータの中で最小の値を表示し,プログラムを終了する.  
#  いろいろなデータについて実行し,yes/noの判定と最小値の結果が正しいことを確認すること. 
# 
#  ファイルの中身はこんな感じです。 
#  10は要素数を表します。 
#   
#  10 
#   
#  27446 
#  58007 
#  103 
#  56548 
#  21869 
#  21538 
#  7867 
#  65552 
#  91919 
#  76211 
# 
# 


'ランダムな整数がデータとして保存されたファイルから,まず,データの個数nを読み込み,その数だけデータを読み込み2分探索木に格納する.
次に整数を一つだけキーボードから入力する.
そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.
さらに,読み込んだデータの中で最小の値を表示し,プログラムを終了する.' :-
        'ランダムな整数がデータとして保存されたファイルから,'(Instream),
        'まず,データの個数nを読み込み,その数だけデータを読み込み2分探索木に格納する.'(Instream,_2分探索木),
        '次に整数を一つだけキーボードから入力する.'(_整数),
        'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'(_2分探索木,_整数),
        'さらに,読み込んだデータの中で最小の値を表示し,プログラムを終了する.'.(_2分探索木).

'ランダムな整数がデータとして保存されたファイルから,'(Instream) :-
        'ランダムな整数がデータとして保存されたファイル'(_ファイル),
        open(_ファイル,read,Instream).

'ランダムな整数がデータとして保存されたファイル'('save_binary_tree.txt').


'まず,データの個数nを読み込み,その数だけデータを読み込み2分探索木に格納する.'(Instream,_2分探索木) :-
        'まず,データの個数nを読み込み,'(Instream,_データの個数n),
        'その数だけデータを読み込み2分探索木に格納する.'(Instream,_データの個数n,_2分探索木).

'まず,データの個数nを読み込み,'(Instream,_データの個数n) :-
        get_line(Instream,Line),
        atom_number(Line,_データの個数n).


'その数だけデータを読み込み2分探索木に格納する.'(Instream,N,_データの個数n,_2分探索木) :-
        データを読み込み(N),
        'その数だけデータを読み込み2分探索木に格納する.'(Instream,0,_データの個数n,[_,_,_],_2分探索木).

'その数だけデータを読み込み2分探索木に格納する.'(Instream,_データの個数n,_データの個数n,_2分探索木,_2分探索木) :-
        close(Instream),!.
'その数だけデータを読み込み2分探索木に格納する.'(Instream,N,_データの個数n,_2分探索木_1,_2分探索木) :-
       データを読み込み(Instream,_データ), 
       '2分探索木に格納する.'(_データ,_2分探索木_1,_2分探索木_2),
       N_2 is N + 1,
       'その数だけデータを読み込み2分探索木に格納する.'(Instream,1,_データの個数n,_2分探索木_2,_2分探索木).


データを読み込み(Instream,_データ) :-
        get_line(Instream,Line),
        \+(Line = ''),
        atom_number(Line,N),!.
データを読み込み(Instream,_データ) :-
        データを読み込み(Instream,_データ).


'2分探索木に格納する.'(_データ,[A,B,C],[A,_データ,C]) :-
        var(B),!.
'2分探索木に格納する.'(_データ,[A,B,C],_2分探索木) :-
        左枝の探索木に格納する(_データ,A,B,C,_2分探索木).
'2分探索木に格納する.'(_データ,[A,B,C],_2分探索木) :-
        右枝の探索木に格納する(_データ,A,B,C,_2分探索木).


左枝の探索木に格納する(_データ,A,B,C,[[_,_データ,_],B,C]) :-
        _データ =< B,
        var(A),!.
左枝の探索木に格納する(_データ,A,B,C,[A_1,B,C]) :-
        _データ =< B,
        '2分探索木に格納する.'(_データ,A,A_1).


右枝の探索木に格納する(_データ,A,B,C,[A,B,[_,_データ,_]]) :-
        _データ > B,
        var(C),!.
右枝の探索木に格納する(_データ,[A,B,C],[A,B,C_1]) :-
        _データ > B,
        '2分探索木に格納する.'(_データ,C,C_1).


'次に整数を一つだけキーボードから入力する.'(_整数) :-
        整数を得る(整数,_整数).


'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'([A,_整数,C],_整数) :-
        write('yes\n'),!.
'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'([A,B,C],_整数) :-
        var(B),
        write('no\n'),!.
'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'([A,B,C],_整数) :-
        左の探索木の探索(B,A,_整数).

'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'([A,B,C],_整数) :-
        右の探索木の探索(B,C,_整数).


左の探索木の探索結果表示(B,A,_整数) :-
        _整数 =< B,
        'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'(A,_整数),!.

右の探索木の探索(B,C,_整数) :-
        _整数 > B,
        'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'(C,_整数),!.


'さらに,読み込んだデータの中で最小の値を表示し,プログラムを終了する.'([A,B,C]) :-
        'さらに,読み込んだデータの中で最小の値を表示し,'(_2分探索木),
        'プログラムを終了する.'.


'さらに,読み込んだデータの中で最小の値を表示し,'([A,B,C]) :-
        var(A),
        writef('最小の値は %t です\n',[B]),!.
'さらに,読み込んだデータの中で最小の値を表示し,'([A,B,C]) :-
        \+(var(A)),
        'さらに,読み込んだデータの中で最小の値を表示し,'(A).


'プログラムを終了する.' :- true.