このディレクトリの索引
#  [1] 授業単元:著作権 
#  [2] 問題文(含コード&リンク): 
#  
#  標準入力から西暦(グレゴリオ暦)を受け取り、 
#  その年のイースターの日を計算するプログラムを作成してください。
#  結果の表示はしてもしなくてもかまいません。 
#  
#  [3] 環境 
#   [3.1] OS: (Windows/Linux/等々) 
#   [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) 
#   [3.3] 言語: (C/C++/どちらでも可 のいずれか) 
#  [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 
#  [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) 

'標準入力から西暦(グレゴリオ暦)を受け取り、
その年のイースターの日を計算するプログラムを作成してください。
結果の表示はしてもしなくてもかまいません。'(_西暦,_月,_日) :- 
        '標準入力から西暦(グレゴリオ暦)を受け取り、'(_西暦),
        'Metonic cycleを使ってその年のイースターの日を計算する'(_西暦,_月,_日).

'標準入力から西暦(グレゴリオ暦)を受け取り、'(_西暦) :-
        整数を得る('西暦(グレゴリオ暦)',グレゴリオ歴(_西暦),_西暦).

'Metonic cycleを使ってその年のイースターの日を計算する'(_西暦,_月,_日) :-
        'まず調べたい年の西暦年を19で割った余りを計算します。その余りに11をかけて225から引いた数字をDとします。'(_西暦,D),
        'もしDが51以上の時は51未満になるまで30で引き、それをD_2とします。もし、Dが48よりも大きい時はそれから1を引きます。'(D,D_2),
        '西暦年と、西暦年を4で割った数字(小数点以下切り捨て)と、D_2 + 1 とを足し、それを7で割った余りをEとします。'(_西暦,D_2,E),
        'D_2に7を足してEで引き、それをQとします。'(D_2,E,Q),
        'もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。'(Q,_月,_日).

'まず調べたい年の西暦年を19で割った余りを計算します。その余りに11をかけて225から引いた数字をDとします。'(_西暦,D) :-
        _19で割った余り is _西暦 mod 19,
        D is 255 - _19で割った余り * 11.

'もしDが51以上の時は51未満になるまで30で引き、それをD_2とします。もし、Dが48よりも大きい時はそれから1を引きます。'(D,D_2) :-
        'もしDが51以上の時は'(D),
        '51未満になるまで30で引き、それをD_2とします。'(D,D_2).
'もしDが51以上の時は51未満になるまで30で引き、それをD_2とします。もし、Dが48よりも大きい時はそれから1を引きます。'(D,D_2) :-
        'もし、Dが48よりも大きい時は'(D),        
        'それから1を引きます。'(D,D_2).

'もしDが51以上の時は'(D) :-
        D >= 51.

'51未満になるまで30で引き、それをD_2とします。'(D,D) :-
        D < 51.
'51未満になるまで30で引き、それをD_2とします。'(D,D_2) :-
        D >= 51,
        D_1 is D - 30,
        '51未満になるまで30で引き、それをD_2とします。'(D_1,D_2).

'もし、Dが48よりも大きい時は'(D) :-
        between(48,50,D).

'それから1を引きます。'(D,D_2) :-
        D_2 is D - 1.

'西暦年と、西暦年を4で割った数字(小数点以下切り捨て)と、D_2 + 1 とを足し、それを7で割った余りをEとします。'(_西暦,D_2,E) :-
        _西暦年を4で割った数字 is _西暦 // 4,
        E is (_西暦 + _西暦年を4で割った数字 + D_2 + 1) mod 7.

'D_2に7を足してEで引き、それをQとします。'(D_2,E,Q) :-
        Q is D_2 + 7 - E.

'もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。'(Q,3,Q) :-
        Q =< 31,!.
'もし、Qが31以下の時はイースターは3月でその数字がイースター日付を表わします。Qが32以上の場合はイースターは4月でQから31を引いた数字が日付を表わします。'(Q,4,_日) :-
         Q >= 32,
        _日 is Q - 31.

グレゴリオ歴(_西暦) :- true.