このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1325685876/524
#  [1] 授業単元:C言語 
#  [2] 問題文(含コード&リンク):入力した誕生日から今日まで経過した日数・時間を表示するプログラムを作成せよ. 
#  

'入力した誕生日から今日まで経過した日数を表示する' :-
        入力した誕生日(_誕生年,_誕生月,_誕生日),
        '今日まで経過した日数・時間を'(_誕生年,_誕生月,_誕生日,_今日まで経過した日数),
        表示する(_今日まで経過した日数).

入力した誕生日(_誕生年,_誕生月,_誕生日) :-
        write('誕生年を入力して下さい : '),
        get_integer(_誕生年),
        write('誕生月を入力して下さい : '),
        get_integer(_誕生月),
        write('誕生日を入力して下さい : '),
        get_integer(_誕生日).

'今日まで経過した日数を'(_誕生年,_誕生月,_誕生日,_今日まで経過した日数) :-
        今日(_年,_月,_日),
        '今日まで経過した日数を'(_今日の年,_今日の月,_今日の日,_誕生年,_誕生月,_誕生日,_今日まで経過した日数時間).

'今日まで経過した日数を'(_今日の年,_今日の月,_今日の日,_誕生年,_誕生月,_誕生日,_今日まで経過した日数) :-
        _今年の年 = _誕生年,
        _今年の月 = _誕生月,
        _今日まで経過した日数 is _今日の日 - _誕生日.
'今日まで経過した日数を'(_今日の年,_今日の月,_今日の日,_誕生年,_誕生月,_誕生日,_今日まで経過した日数) :-
        誕生年と今年の間の日数(_誕生年,_今年の年,_誕生年と今年の間の日数),
        年末までの経過日数(_誕生年,_誕生月,_誕生日,_年末までの経過日数),
        年初からの経過日数(_今年の年,_今年の月,_今年の日,_今年の年初からの経過日数),
        _今日まで経過した日数 is _誕生日から年末までの経過日数 + _今年の年初からの経過日数.

年初からの経過日数(_,1,_日,_年初からの経過日数) :-
        _日 = _年初からの経過日数,!.
年初からの経過日数(_年,_月,_日,_年初からの経過日数) :-
        前月末日までの月末日ならび(1,_年,_月,_日,_前月末日までの月末日ならび),
        sum([_日|_前月末日までの月末日ならび],_年初からの経過日数).

前月末日までの月末日ならび(_月,_年,_月,_日,[]).
前月末日までの月末日ならび(N,_年,_月,_日,[_末日|R]) :-
        月の末日(_年,N,_末日),
        N2 is N + 1,
        前月末日までの月末日ならび(N,_年,_月,_日,R).

月の末日(_年,2,29) :-
        うるう年(_年),!.
月の末日(_年,2,28) :-
        \+(うるう年(_年)),!.
月の末日(_,_月,31) :-
        member(_月,[1,3,5,7,8,10,12]),!.
月の末日(_,_月,30) :-
        member(_月,[4,6,9,11]).

年末までの経過日数(_年,_月,_日,_年末までの経過日数) :-
        年初からの経過日数(_年,_月,_日,_年初からの経過日数),
        年末までの経過日数計算(_年,_年初からの経過日数,_年末までの経過日数).

年末までの経過日数計算(_年,_年初からの経過日数,_年末までの経過日数) :-
        うるう年(_年),
        _年末までの経過日数 is 366 - _年初からの経過日数 + 1,!.
年末までの経過日数計算(_年,_年初からの経過日数,_年末までの経過日数) :-
        \+(うるう年(_年)),
        _年末までの経過日数 is 365 - _年初からの経過日数 + 1,!.

年間日数(_年,366) :-
        うるう年(_年),!.
年間日数(_年,365) :-
        \+(うるう年(_年)).

誕生年と今年の間の日数(_誕生年,_今年,0) :-
        _誕生年 = _今年,!.
誕生年と今年の間の日数(_誕生年,_今年,0) :-
        1 is _今年 - _誕生年,!.
誕生年と今年の間の日数(_誕生年,_今年,_誕生年と今年の間の日数) :-
        S is _誕生年 + 1,
        Max is _今年 - 1,
        findall(_年間日数,(
                    for(S,_年,Max),
                    年間日数(_年,_年間日数)),
               _年間日数ならび),
        sum(_年間日数ならび,_誕生年と今年の間の日数).

表示する(_今日まで経過した日数) :-
        writef('今日まで経過した日数は %t です\n',[_今日まで経過した日数]).

うるう年(_年) :-
        0 is _年 mod 400,!.
うるう年(_年) :-
        0 is _年 mod 100,!,
        fail.
うるう年(_年) :-
        0 is _年 mod 4.