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

西暦年数を与えて、その年の干支を求める(_西暦年数,_干支) :-
        基準年(_基準年),
        西暦を年ならび表現に変換(_基準年,_基準年ならび表現),
        西暦を年ならび表現に変換(_西暦年数,_西暦年ならび表現),
        西暦年数を与えて、その年の干支を求める(_基準年ならび表現,_西暦年ならび表現,_干支).

西暦年数を与えて、その年の干支を求める(_基準年ならび表現,_西暦年ならび表現,_干支) :-
        _西暦年ならび表現 @=< _基準年ならび表現,
        基準年起点の十干・十二支ならび(_基準年の十干ならび,_基準年の十二支ならび),
        六十干支を遡って生成(_基準年ならび表現,_基準年の十干ならび,_基準年の十二支ならび,_西暦年ならび表現,_干支).
西暦年数を与えて、その年の干支を求める(_基準年ならび表現,_西暦年ならび表現,_干支) :-
        _西暦年ならび表現 @> _基準年ならび表現,
        基準年起点の十干・十二支ならび(_基準年の十干ならび,_基準年の十二支ならび),
        六十干支の生成(_基準年ならび表現,_基準年の十干ならび,_基準年の十二支ならび,_西暦年ならび表現,_干支).

西暦を年ならび表現に変換(_年,_年ならび表現) :-
        length(_年ならび表現,_年),
        all(_年ならび表現,年),!.

基準年起点の十干・十二支ならび(_基準年の十干ならび,_基準年の十二支ならび) :-
        基準年の干(_基準年の干),
        基準年の支(_基準年の支),
        findall(_干,十干(_,_干,_,_),L1),
        ならびの回転(右方向,L1,_基準年の十干ならび),
        _基準年の十干ならび = [_基準年の干|_],
        findall(_支,十二支(_支,_),L3),
        ならびの回転(右方向,L3,_基準年の十二支ならび),
        _基準年の十二支ならび = [_基準年の支|_],!.
        
基準年(2010).

基準年の干(庚).

基準年の支(寅).

六十干支を遡って生成(_西暦年ならび表現,[_十干|R1],[_十二支|R2],_西暦年ならび表現,_六十干支) :-
        atom_concat(_十干,_十二支,_六十干支).
六十干支を遡って生成([_|_年ならび表現],_十干ならび1,_十二支ならび1,_西暦年ならび表現,_六十干支) :-
        ならびの回転(右方向,_十干ならび1,_十干ならび2),
        ならびの回転(右方向,_十二支ならび1,_十二支ならび2),!,
        六十干支を遡って生成(_年ならび表現,_十干ならび2,_十二支ならび2,_西暦年ならび表現,_六十干支).
六十干支の生成(_西暦年ならび表現,[_十干|_],[_十二支|_],_西暦年ならび表現,_六十干支) :-
        concat_atom([_十干,_十二支],_六十干支).
六十干支の生成(_年ならび表現,_十干ならび1,_十二支ならび1,_西暦年,_六十干支) :-
        ならびの回転(左方向,_十干ならび1,_十干ならび2),
        ならびの回転(左方向,_十二支ならび1,_十二支ならび2),
        六十干支の生成([年|_年ならび表現],_十干ならび2,_十二支ならび2,_西暦年ならび表現,_六十干支).


十干(陽,甲,木の兄,きのえ).
十干(陰,乙,木の弟,きのと).
十干(陽,丙,火の兄,ひのえ).
十干(陰,丁,火の弟,ひのと).
十干(陽,戊,土の兄,つちのえ).
十干(陰,己,土の弟,つちのと).
十干(陽,庚,金の兄,かのえ).
十干(陰,辛,金の弟,かのと).
十干(陽,壬,水の兄,みずのえ).
十干(陰,癸,水の弟,みずのと).

十二支(子,ね).
十二支(丑,うし).
十二支(寅,とら).
十二支(卯,う).
十二支(辰,たつ).
十二支(巳,み).
十二支(午,うま).
十二支(未,ひつじ).
十二支(申,さる).
十二支(酉,とり).
十二支(戌,いぬ).
十二支(亥,い).

ならびの回転(左方向,[A|R],L) :-
        append(R,[A],L).
ならびの回転(右方向,L1,L) :-
        append(R,[A],L1),
        append([A],R,L).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

六十干支の生成(_六十干支ならび) :-
        findall(_十干,十干(_十干,_),_十干ならび),
        findall(_十二支,十二支(_十二支,_),_十二支ならび),
        六十干支の生成(_十干ならび,_十二支ならび,_六十干支ならび).
六十干支の生成(_六十干支ならび) :-
        findall(_十干,十干(_十干,_),_十干ならび),
        findall(_十二支,十二支(_十二支,_),_十二支ならび),
        六十干支の生成(_十干ならび,_十二支ならび,_六十干支ならび).

六十干支の生成([_十干|R1],[_十二支|R2],_六十干支) :-
        concat_atom([_十干,_十二支],_六十干支).
六十干支の生成(_十干ならび1,_十二支ならび1,_六十干支) :-
        ならびの回転(左方向,_十干ならび1,_十干ならび2),
        ならびの回転(左方向,_十二支ならび1,_十二支ならび2),
        六十干支の生成(_十干ならび2,_十二支ならび2,_六十干支).

六十干支を遡って生成([_十干|R1],[_十二支|R2],_六十干支) :-
        atom_concat(_十干,_十二支,_六十干支).
六十干支を遡って生成(_十干ならび1,_十二支ならび1,_六十干支) :-
        ならびの回転(右方向,_十干ならび1,_十干ならび2),
        ならびの回転(右方向,_十二支ならび1,_十二支ならび2),!,
        六十干支を遡って生成(_十干ならび2,_十二支ならび2,_六十干支).