このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1320365280/383
#   
#  [1] 授業単元:プログラミング演習 
#   
#  [2] 問題文(含コード&リンク): 
#   
#   
#  http://ime.nu/codepad.org/bMCs37CD 
#  
#  3):
#  西暦で表された、年、月、日、の3つの値が与えられていたとして、その年内で経過日数を求めるプログラムを作成する。
#  ?ヶ月ごとの日数を配列に格納するが、うるう年があるため、?行?列の多次元配列を用いることとする。
#  
#  int mdays[][12]={{日数を入れる},{うるう年の日数を入れる}};
#  
#  結果は標準入出力とする。
#  
#  

'西暦で表された、年、月、日、の3つの値が与えられていたとして、その年内で経過日数を求める'(_年,_月,_日,_経過日数) :-
        うるう年(_年),
        月日数([_月日数ならび,_]),
        経過日数計算(_月,_日,_月日数ならび,_経過日数).

'西暦で表された、年、月、日、の3つの値が与えられていたとして、その年内で経過日数を求める'(_年,_月,_日,_経過日数) :-
        \+(うるう年(_年)),
        月日数([_,_月日数ならび]),
        経過日数計算(_月,_日,_月日数ならび,_経過日数).

うるう年(_年文字列) :-
        atom(_年文字列),
        atom_to_term(_年文字列,_年整数,_),!,
        うるう年(_年整数).
うるう年(_年) :-
        0 is _年 mod 400,!.
うるう年(_年) :-
        0 is _年 mod 100,!,
        fail.
うるう年(_年) :-
        0 is _年 mod 4,!.
うるう年(_年) :-
        \+(0 is _年 mod 4),
        fail.

経過日数計算(_月,_日,_月日数ならび,_経過日数) :-
        length([_|L0],_月),
        append(L0,_,_月日数ならび),
        sum(L0,_前月末日までの経過日数),
        _経過日数 is _前月末日までの経過日数 + _日.

月日数([[31,29,31,30,31,30,31,31,30,31,30,31],[31,28,31,30,31,30,31,31,30,31,30,31]]).