このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1305867431/124
#  [1] 授業単元:プログラミング 
#  [2] 問題文: 
#  ファイルから指定した文字列を検索し、行番号と検索文字列該当部分に***の1行 
#  検索文字列を含んだ行すべてを表記した1行を画面に出力する 
#  ただし、ファイルについてはタブを半角スペースに変換させ、エラー文についても適宜出力させる 
#  表記例(検索文字:aaa) 
#  行番号  ***     ***     
#      aaa bbb ccc aaa 111 
#  

'ファイルから指定した文字列を検索し、行番号と検索文字列該当部分に***の1行検索文字列を含んだ行すべてを表記した1行を画面に出力するただし、ファイルについてはタブを半角スペースに変換させ、エラー文についても適宜出力させる'(_ファイル,_検索文字列) :-
        'ファイルから指定した文字列を検索し、行番号と検索文字列該当部分に***の1行検索文字列を含んだ行すべて'(_ファイル,_適合行情報),
        表示(_検索文字列,_適合行情報).

'ファイルから指定した文字列を検索し、行番号と検索文字列該当部分に***の1行検索文字列を含んだ行すべて'(_ファイル,L2) :-
        'ファイルから'(_ファイル,Lines),
        findall([_行番号,_変換された行,L],(
                    append(L0,[_行|_],Lines),
                    タブを半角スペースに変換する(_行,_変換された行),
                    _行番号 is L0 + 1,
                    findall(S2,(
                                sub_atom(Line,S,_,_,_検索文字列),
                                S2 is S + 1)),
                            L),
                    \+(L = [])),
                _適合行情報ならび).

ファイルから(_ファイル,Lines) :-
        get_lines(_ファイル,Lines).

タブを半角スペースに変換する(_行,_変換された行) :-
        findall(_変換された文字,(
                    sub_atom(_行,_,1,_,_文字),
                    タブならば半角スペースに変換する(_文字,_変換された文字)),
                L),
        concat_atom(L,_変換された行).

タブならば半角スペースに変換する('\t',' ').
タブならば半角スペースに変換する(_文字,_文字) :-
        \+(_文字 = '\t').

表示(_検索文字列,_行ならび) :-
        星文字列(_検索文字列,_星の長さ,_星文字列),
        append(_,[[_行番号,_行,_位置ならび]|R],_行ならび),
        行表示(_行番号,_行,_星の長さ,_星表示,_位置ならび).

星文字列(_検索文字列,_星の長さ,_星文字列) :-
        sub_atom(_検索文字列,_,_星の長さ,_,_検索文字列),
        length(_星ならび,_星の長さ),
        all(_星ならび,'*'),
        concat_atom(_星ならび,_星表示),!.

行表示(_行番号,_行,_星の長さ,_星表示,_位置ならび) :-
        write('行番号  '),
        星表示(1,_星の長さ,_星表示,_位置ならび),
        writef('        %t\n',[_行]).

星表示(_,_,_,[]) :- nl,!.
星表示(N,_星の長さ,_星文字列,[N|R]) :-
        write(_星文字列),
        N2 is N + _星の長さ,
        星表示(N2,_星の長さ,_星文字列,R).
星表示(N,_星の長さ,_星文字列,[M|R]) :-
        \+(M = N),
        write(' '),
        N2 is N + 1,
        星表示(N2,_星の長さ,_星文字列,R).