このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1286978599/323
#  [1] 授業単元:  
#  [2] 問題文(含コード&リンク):  
#  西暦年数を与えて、その年の干支を求めるプログラムを作成せよ。  
#  干支は、十干と十二支とをそろぞれサイクリックに変えながら組み合わせることによって60(10と12の最小公倍数)通りが得られる。  
#  例:1989年は己巳。  
#  


基準年(1896).

基準年の干(丙).

基準年の支(申).

'西暦年数を与えて、その年の干支を求める'(_西暦年,_干支) :-
        基準年の干支を得る(_基準年,_基準年の干,_基準年の支),
        _何年後 is _西暦年 - _基準年,
        干支(0,_何年後,_基準年の干,_基準年の支,_干支).

基準年の干支を得る(_基準年,_基準年の干,_基準年の支) :-
        基準年(_基準年),
        基準年の干(_基準年の干),        
        基準年の支(_基準年の支).

干支(_何年後,_何年後,_干,_支,_干支) :-
        atom_concat(_干,_支,_干支),!.
干支(_n年後_1,_何年後,_干_1,_支_1,_干支) :-
        前年または翌年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2),
        干支(_n年後_2,_何年後,_干_2,_支_2,_干支).

前年または翌年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2) :-
        _n年後_1 < 0,
        前年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2).
前年または翌年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2) :-
        _n年後_1 >= 0,
        翌年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2).

前年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2) :-
        _n年後_2 is _n年後_1 - 1,
        十干巡回(_干_2,_干_1),
        十二支巡回(_支_2,_支_1).

翌年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2) :-
        _n年後_2 is _n年後_1 + 1,
        十干巡回(_干_1,_干_2),
        十二支巡回(_支_1,_支_2).

十干巡回(甲,乙).
十干巡回(乙,丙).
十干巡回(丙,丁).
十干巡回(丁,戊).
十干巡回(戊,己).
十干巡回(己,庚).
十干巡回(庚,辛).
十干巡回(辛,壬).
十干巡回(壬,癸).
十干巡回(癸,甲).

十二支巡回(子,丑).
十二支巡回(丑,寅).
十二支巡回(寅,卯).
十二支巡回(卯,辰).
十二支巡回(辰,巳).
十二支巡回(巳,午).
十二支巡回(午,未).
十二支巡回(未,申).
十二支巡回(申,酉).
十二支巡回(酉,戌).
十二支巡回(戌,亥).
十二支巡回(亥,子).