このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1312201995/916
#  [1] 授業単元: プログラミング 
#  [2] 問題文(含コード&リンク):pbmフォーマット画像ファイルを読み込み、左右を反転させた画像をpbmフォーマット画像ファイルとして保存するプログラムを作成せよ. 
#  

'pbmフォーマット画像ファイルを読み込み、左右を反転させた画像をpbmフォーマット画像ファイルとして保存する'(_画像ファイル,_保存画像ファイル) :-
        open(_画像ファイル,read,Instream,option([type(binary)])),
        open(_保存ファイル,write,Outstream,option([type(binary)])),
        ファイルタイプの取得(Instream,Outstram,_),
        '画像の幅・高さの取得'(Instream,Outstream,_画像の幅,_画像の高さ),
        '画像部分の左右を反転する'(Instream,Outstream,_画像の幅,0,_画像の高さ),
        close(Outstream),
        close(Instream).

ファイルタイプの取得(Instream,Outstream,_) :-
        findall(_code,(
                    append(_,_,_),
                    get_byte(Instream,_code),
                    put_byte(Outstream,_code),
                    (    _code = 10,!,fail;
                         true)),
               L).

'画像の幅・高さの取得'(Instream,_画像の幅,_画像の高さ) :-
        コメント行は読み飛ばす(Instream,_code_1),
        '画像の幅・高さのコードならびの取得'(Instream,_code_1,L),
        'コードならびから画像の幅・高さの取得'(L,_画像の幅,_画像の高さ).

'画像の幅・高さのコードならびの取得'(Instream,10,[]) :- !.
'画像の幅・高さのコードならびの取得'(Instream,_code,[_code|R]) :-
        get_byte(Instream,_code_1),
        put_byte(Outsteam,_code_1),
        '画像の幅・高さのコードならびの取得'(Instream,_code,R).

'コードならびから画像の幅・高さの取得'(L,_画像の幅,_画像の高さ) :-
        append(L1,[32|L2],L),
        number_codes(_画像の幅,L1),
        number_codes(_画像の高さ,L2),!.

コメント行は読み飛ばす(Instream,_code_1) :-
        get_byte(Instream,_code),
        put_byte(Outstream,_code),
        コメント行は読み飛ばす(Instream,_code,_code_1),
        \+(_code_1 = 35),!.
コメント行は読み飛ばす(Instream,_code_1) :-
        コメント行は読み飛ばす(Instream,35,_code_1).

コメント行は読み飛ばす(Instream,10,_code_1) :-
        コメント行は読み飛ばす(Instream,_code_1).
コメント行は読み飛ばす(Instream,35,_code_1) :-
        repeat,
        get_byte(Instream,_code),
        put_byte(Outstream,_code),
        _code = 10,
        get_byte(Instream,_code_1),
        put_byte(Outstream,_code_1),!.
コメント行は読み飛ばす(Instream,_code,_code).

'画像部分の左右を反転する'(Instream,Outstream,_,_画像の高さ,_画像の高さ) :- !.
'画像部分の左右を反転する'(Instream,Outstream,_画像の幅,_画像の高さ_1,_画像の高さ) :-
        行コードの取得(Instream,0,_画像の幅,L1),
        reverse(L1,L2),
        反転した行コードの保存(Outstream,L2),
        _画像の高さ_2 is _画像の高さ_1 + 1,
        '画像部分の左右を反転する'(Instream,Outstream,_画像の幅,_画像の高さ_2,_画像の高さ).

行コードの取得(Instream,_画像の幅,_画像の幅,[]) :- !.
行コードの取得(Instream,_画像の幅_1,_画像の幅,[_code|R]) :-
        get_byte(Instream,_code),
        _画像の幅_2 is _画像の幅_1 + 1,
        行コードの取得(Instream,_画像の幅_2,_画像の幅,R) :-

反転した行コードの保存(Outstream,L2) :-
        append(_,[Code|R],L2),
        put_bye(Outstream,Code),
        R = [],
        put_byte(Outstream,10).