このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1200175247/877
#  [1] 授業単元:2分探索法  
#  [2] 問題文: http://nojiriko.asia/jpeg/up10962.jpg にコピーさせていただきました。 
#  


_学籍番号+_氏名+_誕生_月+_誕生_日 :-
        open('data_b.txt',append,Output),
        write_formatted(Output,'%t %t %t %t\n',[_学籍番号,_氏名,_誕生_月,_誕生_日]),
        close(Output).

'data_b.txtを読み込み、4月1日を年初めとして、誕生日の早いもの順にソートし、その結果を「output_b.txt」ファイルに出力する' :-
        get_split_lines('data_b.txt',[' '],LL),
        鍵項目の付加(LL,LL2),
        整列(LL2,LL3),
        鍵項目を除去しながら出力する(LL3).

鍵項目の付加([],[]) :- !.
鍵項目の付加([[_学籍番号,_氏名,_誕生_月,_誕生_日]|R1],[[_誕生_月_2,_誕生_日,_学籍番号,_氏名,_誕生_月,_誕生_日]|R2]) :-
        '1-3月を13-15月に修正'(_誕生_月,_誕生月_2),
        鍵項目の付加(R1,R2).

'1-3月を13-15月に修正'(_誕生_月,_誕生月_2) :- _誕生_月 >= 1,_誕生_月 =< 3,_誕生_月_2 is _誕生_月 + 12,!.
'1-3月を13-15月に修正'(_誕生_月,_誕生月).

鍵項目を除去しながら出力する([]) :- !.
鍵項目を除去しながら出力する([[_,_|L]|R]) :-
        open('out_b.txt',append,Output),
        write_formatted(Output,'%t %t %t月 %t日\n',L),
        close(Output),
        鍵項目を除去しながら出力する(R).

'output_b.txtを読み込み、ある誕生日を入力したときに、その学生の学籍番号、氏名、誕生月、誕生日を二分探索法により出力する'(_誕生_月,_誕生_日) :-
        get_split_lines('output_b.txt',[' ',月,日],LL),
        二分探索法(LL,_誕生_月,_誕生_日,[_学籍番号,_氏名,_誕生_月,_誕生_日]),
        write_formatted('%t %t %t %t月%t日\n',[_学籍番号,_誕生_月,_誕生_日]).

二分探索法(LL,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :-
        '1-3月を13-15月に修正'(_誕生_月,_誕生月_0),
        length(LL,Len),
        Len0 is Len // 2,
        append(L0,[[_学籍番号_1,_氏名_1,_誕生_月_1,_誕生_日_1]|L1],LL),
        length(L0,Len0),
        '1-3月を13-15月に修正'(_誕生_月_1,_誕生月_10),
        二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]).

二分探索法(L0,L,L1,_誕生_月,_誕生_日,_誕生_月,_誕生_日,L) :- !.
二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :-
        [_誕生_月_0,_誕生_日] @>  [_誕生_月_10,_誕生_日_1],
        二分探索法(L0,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]).
二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :-
        [_誕生_月_0,_誕生_日] @<  [_誕生_月_10,_誕生_日_1],
        二分探索法(L1,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]).