このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1322562648/172
#  [1] 授業単元:C言語演習 
#  [2] 問題文(含コード&リンク): 
#  前日商品別に在庫を登録したファイル "zaiko.txt" と 
#  当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し、 
#  新たな在庫ファイル "zaiko_new.txt" を出力するプログラムを作成せよ。 
#  ファイルの各レコード(行)は次の形式であり、ひとつの商品に対してひとつのレコードとする。 
#   
#  商品コード 整数 4桁 
#  数量  数字 4桁 
#   
#  なお、各ファイルは商品コードの昇順にソートされているものとする。 
#  ※実行例:http://ime.nu/s2.etowns.slyip.net/~c_cpp_homework/cgi-bin/joyful/img/256.txt 
#  

'前日商品別に在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し、新たな在庫ファイル "zaiko_new.txt" を出力する' :-
        '前日商品別に在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し'(LL1,LL2),
        '新たな在庫ファイル "zaiko_new.txt" を出力する'(LL1,LL2).

'前日商品別に在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し'(LL1,LL2) :-
        get_lines('zaiko.txt',Lines1),
        get_lines('nyuko.txt',Lines2),
        行を商品番号と数量に分解する(Lines1,LL1),
        行を商品番号と数量に分解する(Lines2,LL2).

行を商品番号と数量に分解する(Lines,LL) :-
        findall([_商品番号,_数量],(
                    append(_,[_行|_],Lines),
                    商品番号と数量に分解(_行,_商品番号,_数量)),
                LL).

商品番号と数量に分解(_行,_商品番号,_数量) :-
        sub_atom(_行,0,4,4,S1),
        sub_atom(_行,4,4,0,S2),
        atom_to_term(S1,_商品番号,_),
        atom_to_term(S2,_数量,_).

'新たな在庫ファイル "zaiko_new.txt" を出力する'(LL1,LL2) :-
        '新たな在庫ファイル'(LL1,LL2,LL3),
        出力する('zaiko_new.txt',LL3).

'新たな在庫ファイル "zaiko_new.txt" を出力する'(LL1,[],LL1) :- !.
'新たな在庫ファイル "zaiko_new.txt" を出力する'([],LL2,LL2) :- !.
'新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号,_数量_1]|R1],[[_商品番号,_数量_2]|R2],[[_商品番号,_数量_3]|R3]) :-
        _数量_2_1 is _数量_1 + _数量_2,
        入庫の集約(_商品番号,R2,_数量_2_1,_数量_3,R2_2),
        '新たな在庫ファイル "zaiko_new.txt" を出力する'(R1,R2_2,R3).
'新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号_1,_数量_1]|R1],[[_商品番号_2,_数量_2]|R2],[[_商品番号_1,_数量_1]|R3]) :-
        _商品番号_1 @< _商品番号_2,
        '新たな在庫ファイル "zaiko_new.txt" を出力する'(R1,[[_商品番号_2,_数量_2]|R2],R3).
'新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号_1,_数量_1]|R1],[[_商品番号_2,_数量_2]|R2],[[_商品番号_2,_数量_3]|R3]) :-
        _商品番号_1 @> _商品番号_2,
        入庫の集約(_商品番号_2,R2,_数量_2,_数量_3,R2_2),
        '新たな在庫ファイル "zaiko_new.txt" を出力する'([[_商品番号_1,_数量_1]|R1],R2_2,R3).

入庫の集約(_商品番号,[],_数量_3,_数量_3,[]) :- !.
入庫の集約(_商品番号,[[_商品番号,_数量]|R],_数量_2_1,_数量_3,R2_2) :-
        _数量_2_2 is _数量_2_1 + _数量,
        入庫の集約(_商品番号,R,_数量_2_2,_数量_3,R2_2),!.
入庫の集約(_商品番号,[[_商品番号_2_2,_数量]|R2],_数量_3,_数量_3,[[_商品番号_2,_数量_2]|R2]) :-
        \+(_商品番号=_商品番号_2).

出力する(File,LL) :-
        open(File,write,Outstream),
        append(_,[[_商品番号,_数量]|R],LL),
        writef(Outstream,'%4r%4r\n',[_商品番号,_数量]),
        R = [],
        close(Outstream).