このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1296387672/11
#  [1] 授業単元:C言語の基礎 
#  [2] 問題文 
#   「複数の異なるデータ型を持つ情報に対して、情報の回覧と追加ができ、 
#   ファイルの読込とができるプログラムを作成しなさい。 
#   たとえば名簿のような物で、氏名、電話番号、住所、整理番号などを 
#   読込、書込、保存をする。可能なら、検索もできるようにすると良い。 
#   複数のデータを扱うために、構造体を持つ配列を使うこと。 
#   また、メンバ数は6個以上の情報を扱うこと。 
#   ファイル形式は、CSV形式で、1つの情報の関連データ(メンバ)はカンマで区切り、 
#   別の情報データ(行)は改行で区別しなさい。ファイル名の拡張子はcsv。 
#   データファイルはプログラム起動時にコマンドラインから入力できること。 
#   また、そうではないことにも対応すること。」 
#  


リーディング情報の読み込み(_データファイル,LL) :-
        get_split_lines(_データファイル,[','],LL),
        append(_,[L|R],LL),
        P =.. [リーディング情報|L],
        assertz(P),
        R = [],!.

リーデング情報の保存(_データファイル) :-
        open(_データファイル,write,Outstream),
        リーデング情報の書き込み(Outstream),
        close(Outstream).

リーデング情報の書き込み(Outstream) :-
        リーデング情報(_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数),
        concat_atom([_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数],',',S),
        write_formatted(Output,'%t\n',[S]),
        fail.
リーデング情報の書き込み(Outstream).

情報の回覧(LL) :-
        write('順位,種牡馬名,毛色,産地,出走頭数,勝馬頭数,出走回数,勝利回数,賞金,1出走賞金,1頭平均賞金,勝馬率,アーニング・インデックス\n'),
        リーデング情報(_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_産駒の総収得賞金,_産駒の出走頭数),
        _1出走賞金 is truncate(_賞金 / _出走回数),
        _1頭平均賞金 is truncate(_賞金 / _出走頭数)
        _勝馬率 is _勝馬頭数 / _出走頭数,
        アーニング・インデックスの算出(_種牡馬名,_アーニング・インデックス),
        write_formatted('%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t\n',[_順位,_種牡馬名,_毛色,_産地,_出走頭数,_勝馬頭数,_出走回数,_勝利回数,_1出走賞金,1頭,_平均賞金,_勝馬率,_アーニング・インデックス]),
        fail.
情報の回覧(LL).

リーディング情報の追加 :-
        write('指示に従い各項目を入力してください\n'),
        リーディング情報項目(_項目,_項目のタイプ),
        リーディング情報項目の入力(_項目,_項目のタイプ,_項目値ならび),
        P =.. [リーデング情報|_項目値ならび],
        assertz(P),!.
                
リーディング情報項目の入力(_項目,_項目のタイプ,_項目値ならび) :-
        findall(_項目値,(
                    リーディング情報項目(_項目,_項目のタイプ),
                    項目の入力(_項目,_項目のタイプ,_項目値)),
                _項目値ならび).

項目の入力(_項目,文字列,_項目値) :-
        write_formatted('%t (文字列) を入力してください : ',[_項目]),
        get_line(_項目値),!.
項目の入力(_項目,整数,_項目値) :-
        write_formatted('%t (整数)を入力してください : ',[_項目]),
        get_line(Line),
        項目の入力診断(_項目,整数,Line,_項目値),!.
項目の入力(_項目,整数,_項目値) :-
        項目の入力(_項目,整数,_項目値).


項目の入力診断(_項目,整数,Line,_項目値) :-
        atom_to_term(Line,_項目値,_),
        integer(_項目値),!.
項目の入力診断(_項目,整数,Line,_項目値) :-
        write_formatted('入力された%tからは%tにふさわしい整数を得られませんでした。再入力をお願いします。\n',[Line,_項目]),
        fail.

% 産駒の総収得賞金/2,産駒の出走頭数/2,全出走馬収得賞金/1,総出走頭数/1 は未定義である。
% これらの述語をデータベースと定義した上で、アーニング・インデックスを算出する。


アーニング・インデックスの算出(_種牡馬名,_アーニングインデックス) :-
        産駒の総収得賞金(_種牡馬名,_産駒の総収得賞金),
        産駒の出走頭数(_種牡馬名,産駒の出走頭数),
        全出走馬収得賞金(_全出走馬収得賞金),
        総出走頭数(_総出走頭数),
        _アーニング・インデックス is ( _産駒の総収得賞金 / _産駒の出走頭数 ) / ( _全出走馬収得賞金 / _総出走頭数),!.


リーディング情報項目(順位,整数).
リーディング情報項目(種牡馬名,文字列).
リーディング情報項目(毛色,文字列).
リーディング情報項目(産地,文字列).
リーディング情報項目(出走頭数,整数).
リーディング情報項目(勝馬頭数,整数).
リーディング情報項目(出走回数,整数).
リーディング情報項目(勝利回数,整数).
リーディング情報項目(賞金,整数).
/*
リーディング情報項目(1出走賞金,整数).
リーディング情報項目(1頭平均賞金,整数).
リーディング情報項目(勝馬率,浮動小数点数).).
リーディング情報項目(アーニング・インデックス,浮動小数点数).
*/