このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1244449887/514 
#[1]授業単元:プログラミング演習1  
# 
#[2]問題文:画面より入力した成績データをファイルに登録する。  
# 画面より入力する項目は以下のとおり。  
# ・生徒コード、数字6桁、数字であること。  
# ・氏名、文字列20文字、1字以上、20字以内  
# ・国語(点数)、数字3桁、数字であること、0<=点数<=100  
# ・算数(点数)、国語と同じ  
# ・社会(点数)、国語、算数と同じ  
# 
# 
# 生徒コードに999999が入力されたら終了する。 

t206(_登録ファイル) :-
    入力情報検査の書き方学習のための情報登録プログラム(_登録ファイル).

入力情報検査の書き方学習のための情報登録プログラム(_登録ファイル) :-
    open(_登録ファイル,write,Output),
    repeat,
    一人分の生徒情報を得る(_個人データ,_入力検査結果),
    個人情報を登録する(Output,_個人データ,_入力検査結果),
    _入力検査結果 = end_of_file,
    close(Output),!.

個人情報を登録する(_,_,end_of_file) :- !.
個人情報を登録する(Output,_個人データ,_入力検査結果) :-
    _個人データ = (_生徒コード,_氏名,_国語,_算数,_社会),
    write_formatted(Output,'%6d,%20s,%3d,%3d,%3d.\n',[_生徒コード,_氏名,_国語,_算数,_社会]),
    write_formatted('書き込んだデータ=%6d,%20s,%3d,%3d,%3d.\n',[_生徒コード,_氏名,_国語,_算数,_社会]).

一人分の生徒情報を得る(_個人データ,_入力検査結果) :-
    repeat,
    write('生徒コード,氏名,国語点数,算数点数,社会点数をカンマで区切り入力しなさい(最後は.で終わる)\n'),
    read(_個人データ),
    一人分の情報入力検査(_個人データ,_入力検査結果),!.

一人分の情報入力検査(999999,end_of_file) :- !.
一人分の情報入力検査(_個人データ,_入力検査結果) :-
    入力項目検査(_個人データ,_入力検査結果),
    一人分の情報入力終了検査(_入力検査結果),!.

一人分の情報入力終了検査(end_of_file) :- !.
一人分の情報入力終了検査([]) :- !.
一人分の情報入力終了検査(L) :-
    入力エラー理由の表示(L),
    write_formatted('%t\n',[再入力が必要です]),
    fail.    

入力項目検査((_生徒コード,_氏名,_国語,_算数,_社会),_入力検査結果) :-
    生徒コード入力検査(_生徒コード,[],L1),
    氏名入力検査(_氏名,L1,L2),
    点数科目入力検査(国語,_国語,L2,L3),
    点数科目入力検査(算数,_算数,L3,L4),
    点数科目入力検査(社会,_社会,L4,_入力検査結果),!.
入力項目入力検査(_入力されたデータ,_入力検査結果) :-
    _入力検査結果=[[入力項目の形式に誤りがあります,_入力されたデータ]],!.

生徒コード入力検査(_生徒コード,L,L) :-
    integer(_生徒コード),
    _生徒コード>=100000,_生徒コード<999999,!.
生徒コード入力検査(_生徒コード,L,[[生徒コードが整数でありません,_生徒コード]|,L) :-
    not(integer(_生徒コード)),!.
生徒コード入力検査(_生徒コード,L,[end_of_fileの認識用に使ってしまっているコードです,_生徒コード]|L]) :-
    integer(_生徒コード),
    _生徒コード=999999,!.
生徒コード入力検査(_生徒コード,L,[生徒コードが小さすぎます,_生徒コード]|L]) :-
    integer(_生徒コード),
    _生徒コード<100000,!.
生徒コード入力検査(_生徒コード,L,[生徒コードが大きすぎます,_生徒コード]|L]) :-
    integer(_生徒コード),
    _生徒コード>999999,!.

氏名入力検査(_氏名,L,L) :-
    atom(_氏名),
    atom_length(_氏名,_氏名の長さ),
    _氏名の長さ>=1,_氏名の長さ=<20,!.
氏名入力検査(_氏名,L,[[氏名がアトムでありません,_氏名]|L]) :-
    not(atom(_氏名)),!.
氏名入力検査(_氏名,L,[[氏名が有効な文字ではありません,_氏名]|L]) :-
    atom(_氏名),
    atom_length(_氏名,_氏名の長さ),
    _氏名の長さ<1,!.
氏名入力検査(_氏名,L,[[氏名の文字数が多すぎます,_氏名]|L]) :-
    atom(_氏名),
    atom_length(_氏名,_氏名の長さ),
    _氏名の長さ>20,!.

点数科目入力検査(_科目,_点数,L,L) :-
    integer(_科目),
    _点数 >= 0,
    _点数 =< 100,!.
点数科目入力検査(_科目,_点数,L,[[S,_点数]|L]) :-
    not(integer(_科目)),
    atom_concat(_科目,の点数が整数ではありません,S),!.
点数科目入力検査(_科目,_点数,L,[[S,_点数]|L]) :-
    integer(_科目),
    _科目<0,
    atom_concat(_科目,の点数が負数です,S),!.
点数科目入力検査(_科目,_点数,L,[[S,_点数]|L]) :-
    not(integer(_科目)),!,
    _点数>100,
    atom_concat(_科目,の点数が100点より大きくなっています,S),!.

入力エラー理由の表示(L) :-
    reverse(L,L2),
    member([A,B],L2),
    write_formatted('%t,%t\n',[A,B]),
    fail.
入力エラー理由の表示(_).