このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1274827528/844
#  [1] 授業単元:プログラミング応用 
#  [2] 問題文(含コード&リンク):西暦を年号に変換するプログラムを作成する。 
#  ただし、入力できるのは、1868年以降からであり、2008年以降も平成とする。 
#  明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。 
#  下記を参考にプログラムを作成しなさい。 
#  int gannen[]={1989, 1926, 1912, 1868}; 
#  char nengou[][8]={"heisei", "syouwa", "taisyou", "meiji"}; 
# 

西暦を和暦に変換する(_西暦,_和暦) :-
        findall([_年号,_元年の西暦],西暦和暦元年対応(_元年の西暦,_年号),L),
        西暦を和暦に変換する(_西暦,L,_和暦).

西暦を和暦に変換する(_西暦,[[_年号,A]],_和暦) :-
        _西暦 >= A,
        _年 is _西暦 - A + 1,
        西暦年和暦年変換(_年,_和暦年),
        concat_atom([_年号,_和暦年,年],_和暦),!.
西暦を和暦に変換する(_西暦,[[_年号,A],[_,B]|_],_和暦) :- 
        _西暦 >= A,_西暦 < B,
        _年 is _西暦 - A + 1,
        西暦年和暦年変換(_年,_和暦年),
        concat_atom([_年号,_和暦年,年],_和暦),!.
西暦を和暦に変換する(_西暦,[A|R],_和暦) :-
        _西暦 > A,
        西暦を和暦に変換する(_西暦,R,_和暦).

西暦年和暦年変換(1,元年) :- !.
西暦年和暦年変換(_西暦年,_和暦年) :-
        数字和数字変換(_西暦年,['',十],_反転した和暦年文字ならび),
        reverse(_反転した和暦年文字ならび,_和暦年文字ならび),
        concat_atom(_和暦年文字ならび,_和暦年).

数字和数字変換(0,_,L,L) :- !.
数字和数字変換(N,[_|R1],L2,L) :-
        0 is N mod 10,
        N1 is N // 10,
        数字和数字変換(N1,R1,L2,L),!.
数字和数字変換(N,[十|R1],L2,L) :-) :-
        1 is N mod 10,
        N1 is N // 10,
        数字和数字変換(N1,R1,[十|L2],L).
数字和数字変換(N,[A|R1],L2,L) :-
        M is N mod 10,
        list_nth(M,[一,二,三,四,五,六,七,八,九],_和数字),
        N1 is N // 10,
        数字和数字変換(N1,R1,[A,M|L2],L).

西暦和暦元年対応(1868,明治).
西暦和暦元年対応(1912,大正).
西暦和暦元年対応(1926,昭和).
西暦和暦元年対応(1989,平成).