このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1342966104/641
#  [1] C言語  
#  [2] http://ime.nu/ideone.com/m8dZRの関数を利用して、 
#    キーボードから日付を読み込んで、その次の日を求める 
#    プログラムを作成しなさい。 
#   
#  実行例 
#  --------------------- 
#  年月日:20120913 
#   
#  次の日は:2012/09/14 
#  --------------------- 
#    
#  [3.1] Windows7 
#  [3.3] C言語  
#  [4] 9/13 19:00まで 
# 
# 

'キーボードから日付を読み込んで、その次の日を求める' :-
        'キーボードから日付を読み込んで'(_日付文字列),
        その次の日を求める(_日付文字列,_次の日文字列),
        writef('次の日は:%t\n',[_次の日文字列]).

'キーボードから日付を読み込んで'(_日付文字列) :-
        write('日付を文字列8桁で入力してください : '),
        get_line(_日付文字列),
        atom(_日付文字列),
        atom_length(_日付文字列,8),!.
'キーボードから日付を読み込んで'(_日付文字列) :-
        'キーボードから日付を読み込んで'(_日付文字列).

その次の日を求める(_日付文字列,_次の日文字列) :-
        sub_atom(_日付文字列,0,4,_,_年),
        sub_atom(_日付文字列,4,2,_,_月),
        sub_atom(_日付文字列,6,2,_,_日),
        その次の日を求める(_年,_月,_日,_次の日文字列).

その次の日を求める(_年,'12','31',_次の日文字列) :-
        翌年の一月一日(_年,_次の日文字列),!.
その次の日を求める(_年,'02','29',_次の日文字列) :-
        同年の三月一日(_年,_次の日文字列),!.
その次の日を求める(_年,'02','28',_次の日文字列) :-
        \+(うるう年(_年)),
        同年の三月一日(_年,_次の日文字列),!.
その次の日を求める(_年,_月,'31',_次の日文字列) :-
        大の月(_月),
        ここでは12月は除外する(_月),
        翌月の一日(_年,_月,_次の文字列),!.
その次の日を求める(_年,_月,'30',_次の日文字列) :-
        小の月(_月),
        ここでは2月は除外する(_月),
        翌月の一日(_年,_月,_次の日文字列),!.
その次の日を求める(_年,_月,_日,_次の日文字列) :-
        同年同月の次の日(_年,_月,_日,_次の日文字列).

翌年の一月一日(_年,_翌年の一月一日) :-
        翌年(_年,_翌年),
        atomic_list_concat([_翌年,'0101'],_翌年の一月一日).

同年の三月一日(_年,_同年の三月一日) :-
        atomic_list_concat([_年,'0301'],_同年の三月一日).

翌月の一日(_年,_月,_翌月の一日) :-
        翌月(_月,_翌月),
        atomic_list_concat([_年,_翌月,'01'],_翌月の一日).
        
同年同月の次の日(_年,_月,_日,_同年同月の次の日) :-
        翌日(_日,_翌日),
        atomic_list_concat([_年,_月,_翌日],_同年同月の次の日).

大の月(_月) :-
        member(_月,['01','03','05','07','08','10','12']).

小の月(_月) :-
        member(_月,['02','04','06','09','11']).

ここでは12月は除外する(_月) :-
        \+(_月 == '12').

ここでは2月は除外する(_月) :-
        \+(_月 == '02').

うるう年(_年文字列) :-
        atom(_年文字列),
        atom_number(_年文字列,_年整数),
        !,
        うるう年(_年整数).

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

翌年(_年,_翌年) :-
        atom_number(_年,_年整数),
        _翌年整数 is _年整数 + 1,
        頭部零文字列に変換(4,_翌年整数,_翌年).

翌月('01','02').
翌月('02','03').
翌月('03','04').
翌月('04','05').
翌月('05','06').
翌月('06','07').
翌月('07','08').
翌月('08','09').
翌月('09','10').
翌月('10','11').
翌月('11','12').
翌月('12','01').

翌日('01','02').
翌日('02','03').
翌日('03','04').
翌日('04','05').
翌日('05','06').
翌日('06','07').
翌日('07','08').
翌日('08','09').
翌日('09','10').
翌日('10','11').
翌日('11','12').
翌日('12','13').
翌日('13','14').
翌日('14','15').
翌日('15','16').
翌日('16','17').
翌日('17','18').
翌日('18','19').
翌日('19','20').
翌日('20','21').
翌日('21','22').
翌日('22','23').
翌日('23','24').
翌日('24','25').
翌日('25','26').
翌日('26','27').
翌日('27','28').
翌日('28','29').
翌日('29','30').
翌日('30','31').
翌日('31','01').