このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1312201995/844
#  [1] 授業単元:C言語基礎 
#  [2] 問題文(含コード&リンク):  
#    
#    明治元年以降の西暦年を4桁の数で入力すると、 
#  和暦で年を表示するプログラムを作成せよ。 
#  ただし、2つの元号を持つ年 
#  は両方の年を表示すること。 
#  (例: 1989年 → 昭和64年、平成元年) 
#   
#  (2つの元号を持つ年の扱いについては 
#  余裕がある人は、月、日も入れて、その日の正しい 
#  元号を表示することによって元号を一つ表示す 
#  るプログラムとしてもよい。) 
#   提出例 
#     === プログラム === 
#     #include <stdio.h> 
#     int main() 
#     { 
#  

'明治元年以降の西暦年月日を入力して和暦を表示する' :-
        '明治元年以降の西暦年月日を入力すると'(_西暦年,_月,_日),
        '入力された西暦年月日から元号を表示する'(_西暦年,_月,_日).

'明治元年以降の西暦年月日を入力すると'(_西暦年,_月,_日) :-
        write('西暦年月日をカンマ区切りで入力してください : '),
        readln([_西暦年,_月,_日]).

'入力された西暦年月日から和暦を表示する'(_西暦年,_月,_日) :-
        findall(_和暦,(
                    元号期間(_元号,_期間開始年,_期間開始月,_期間開始日,_期間終了年,_期間終了月,_期間終了日),
                    [_期間開始年,_期間開始月,_期間開始日] @=< [_西暦年,_月,_日],
                    [_期間終了年,_期間終了月,_期間終了日] @>= [_西暦年,_月,_日],
                    西暦年月日と元号開始年から和暦を得る(_西暦年,_月,_日,_期間開始年,_和暦),
                L),
        和暦を表示する(_西暦年,_月,_日,L).

和暦を表示する(_西暦年,_月,_日,[_和暦_1,_和暦_2]) :-
        writef('西暦%t年%月%日は二つの元号が重なっています。和暦は %t と %t になります。\n',[_西暦年,_月,_日,_和暦_1,_和暦_2]),!.
和暦を表示する(_西暦年,_月,_日,[_和暦]) :-
        writef('西暦%t年%月%日の和暦は %t です。\n',[_和暦]).

西暦年月日と元号開始年から和暦を得る(_西暦年,_月,_日,_期間開始年,_和暦) :-
        _数字和暦年 is _西暦年 - _期間開始年 + 1,
        数字年和暦年変換(_数字和暦年,_和暦年),
        九十九までの和数字変換(_月,_和暦月),
        九十九までの和数字変換(_日,_和暦日),
        concat_atom([_元号,_和暦年,_和暦月,月,_和暦日,日],_和暦),!.

数字年和暦年変換(1,元年) :- !.
数字年和暦年変換(_西暦,_和暦年) :-
        九十九までの和数字変換(_数字,_和数字),
        concat_atom([_和数字,年],_和暦年),!.

九十九までの和数字変換(0,'').
九十九までの和数字変換(1,一).
九十九までの和数字変換(2,ニ).
九十九までの和数字変換(3,三).
九十九までの和数字変換(4,四).
九十九までの和数字変換(5,五).
九十九までの和数字変換(6,六).
九十九までの和数字変換(7,七).
九十九までの和数字変換(8,八).
九十九までの和数字変換(9,九).
九十九までの和数字変換(数字,_和数字) :-
        N >= 10,
        N =< 19,
        M is N mod 10,
        九十九までの和数字変換(M,M2),
        concat_atom([十,_和数字一の桁],_和数字).
九十九までの和数字変換(数字,_和数字) :-
        N >= 20,
        N =< 99,
        M is N mod 10,
        九十九までの和数字変換(M,_和数字一の桁),
        N2 is N // 10,
        九十九までの和数字変換(M2,_和数字十の桁),
        concat_atom([_和数字十の桁,十,_和数字一の桁],_和数字).

元号期間(明治,1868,1,1,1912,7,30).
元号期間(大正,1912,7,30,1926,12,25).
元号期間(昭和,1926,12,25,1989,1,7).
元号期間(平成,1989,1,8,_年,_月,_日) :-
        今日(_年,_月,_日).

改元日(明治,1868,1,25,'改元は1月1日に遡って施行された') :-
        '実際の改元の勅書は1968年10月23日に出されたが1月1日に遡って施行'.
改元日(大正,1912,7,30,'改元は即日施行された') :-
        '改元は即日施行された'.
改元日(昭和,1926,12,25,'改元は即日施行された') :-
        '改元は即日施行された'.
改元日(平成,1989,1,7,'改元は翌日から施行された') :-
        '改元は翌日から施行された'.

'実際の改元の勅書は1968年10月23日に出されたが1月1日に遡って施行'.

'改元は即日施行された'.

'改元は翌日から施行された'.

今日(_年,_月,_日) :-
        shs(date,S),
        split(S,[' ',年,月,日],[_年,_月,_日|_]),!.