このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1307166756/235
#  [1] 授業単元:プログラミング基礎 
#  [2] 問題文(含コード&リンク): 
#  キーボードから西暦を表す4桁の数字を数値として読み込み、閏年かどうか判定する。 
#  入力された西暦年が1000年以上4000年いかでなければ、その旨を指示してプログラムを終了する。  
#  閏年の条件:4で割り切れるが100で割り切れない年を閏年とする。ただし400で割り切れる年を閏年とする。 
#  それ以外の年は平年とする。 
#   
#  

キーボードから西暦を表す4桁の数字を数値として読み込み、閏年かどうか判定する。 :-
         キーボードから西暦を表す4桁の数字を数値として読み込み(_4桁の数字),
         閏年かどうか判定する(_4桁の数字,_閏年か否か).

キーボードから西暦を表す4桁の数字を数値として読み込み(_4桁の数字) :-
        write('西暦を表す4桁の数字を入力してください : '),
        西暦を表す4桁の数字を数値として読み込み(_4桁の数字),!.
キーボードから西暦を表す4桁の数字を数値として読み込み(_4桁の数字) :-
        キーボードから西暦を表す4桁の数字を数値として読み込み(_4桁の数字).

西暦を表す4桁の数字を数値として読み込み(_4桁の数字) :-
        get_line(Line),
        西暦を表す4桁の数字診断(Line,_4桁の数字),!.

西暦を表す4桁の数字診断(Line,_4桁の数字) :-
        atom_to_term(Line,_4桁の数字,_),
        integer(_4桁の数字),
        西暦範囲検査(_4桁の数字),!.
西暦を表す4桁の数字診断(Line,_4桁の数字) :-
        atom_to_term(Line,_4桁の数字,_),
        \+(integer(_4桁の数字)),
        writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]),!,fail.        
西暦を表す4桁の数字診断(Line,_) :-
        fail.

西暦範囲検査(_4桁の数字) :-
        _4桁の数字 >= 1000,
        _4桁の数字 =< 4000,!.
西暦範囲検査(_4桁の数字) :-
        writef('入力された数字 %t は 1000以上4000以下の範囲にありません。再入力をお願いします。\n',[_4桁の数字]),!,
        fail.

閏年かどうか判定する(_4桁の数字,閏年) :-
        閏年(_4桁の数字),!.
閏年かどうか判定する(_,閏年ではない).

閏年(_年,閏年) :-
        0 is _年 mod 400,!.
閏年(_年,閏年) :-
        0 is _年 mod 100,
        !,fail .
閏年(_年,閏年) :-
        0 is _年 mod 4,!.
閏年(_年,閏年) :-
        \+(0 is _年 mod 4),
        fail.