このディレクトリの索引
#  
#  localtime/8 localtime/9 を定義する
#  

localtime(_年,_月,_日,_曜日,_累計日数,_時,_分,_秒) :-
        get_time(Time),
        グリニッヂ時と地域時間の差(_グリニッヂ時との時間差),
        _地域秒 is truncate(Time) + _グリニッヂ時との時間差,
        localtime(_地域秒,_年,_月,_日,_曜日,_累計日数,_時,_分,_秒).

localtime(_地域秒,_年,_月,_日,_曜日,_累計日数,_時,_分,_秒) :-
        localtime(1970,0,_地域秒,L),
        last(L,[_年,_開始秒]),
        _当年累秒数 is _地域秒 - _開始秒,
        '_年,_月,_日,_曜日,_累計日数,_時,_分,_秒を計算する'(_当年累秒数,_年,_月,_日,_曜日,_累計日数,_時,_分,_秒),!.

localtime(_年,_開始秒,_現在秒,[]) :-
        _開始秒 > _現在秒,!.
localtime(_年,_開始秒,_現在秒,[[_年,_開始秒]|R]) :-
        年間秒(_年,_年間秒),
        _開始秒_2 is _開始秒 + _年間秒,
        _年_2 is _年 + 1,
        localtime(_年_2,_開始秒_2,_現在秒,R).

月初めの年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :-
        うるう年(_年),
        うるう年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数).
月初めの年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :-
        \+(うるう年(_年)),
        うるう年でない年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数).

うるう年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :-
        月初めの累積日数(_年,_月,[0,31,29,31,30,31,30,31,31,30,31,30],_月初めの累積日数),
        nth1(_月,[31,29,31,30,31,30,31,31,30,31,30,31,31],_月日数),
        _月初めの年初来の累秒数 is 86400 * _月初めの累積日数,
        _月末の年初来の累秒数 is _月初めの年初来の累秒数 + 86400 * _月日数.

うるう年でない年の月の年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数) :-
        月初めの累積日数(_年,_月,[0,31,28,31,30,31,30,31,31,30,31,30],_月初めの累積日数),
        nth1(_月,[31,28,31,30,31,30,31,31,30,31,30,31,31],_月日数),
        _月初めの年初来の累秒数 is 86400 * _月初めの累積日数,
        _月末の年初来の累秒数 is _月初めの年初来の累秒数 + 86400 * _月日数.

月初めの累積日数(_年,_月,_0から始まる月日数ならび,_月初めの累積日数) :-
        findsum(_日数,(
                    between(1,_月,N),
                    nth1(N,_0から始まる月日数ならび,_日数)),
                _月初めの累積日数_1),
        _月初めの累積日数 is truncate(_月初めの累積日数_1).

'_年,_月,_日,_曜日,_累計日数,_時,_分,_秒を計算する'(_当年累秒数,_年,_月,_日,_曜日を表す値,_累計日数,_時,_分,_秒) :-
        '当年累積秒と月初めの年初来の累積秒と月末の年初来の累積秒から_月を得る'(_当年累秒数,_年,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数,_月),
        '_当年累積秒と_月初めの年初来の累積秒から_月,_日,_時,_分,_秒,を求める'(_当年累秒数,_月初めの年初来の累秒数,_月,_日,_時,_分,_秒),
        _累計日数 is _月初めの累積日数 + _日,
        'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日),!.

'当年累積秒と月初めの年初来の累積秒と月末の年初来の累積秒から_月を得る'(_当年累秒数,_年,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数,_月) :-
        between(1,12,_月),
        月初めの年初来の累秒数(_年,_月,_月初めの累積日数,_月初めの年初来の累秒数,_月末の年初来の累秒数),
        _当年累秒数 >= _月初めの年初来の累秒数,
        _当年累秒数 =< _月末の年初来の累秒数,!.
    
'_当年累積秒と_月初めの年初来の累積秒から_月,_日,_時,_分,_秒,を求める'(_当年累秒数,_月初めの年初来の累秒数,_月,_日,_時,_分,_秒) :-
        _今月に入っての累秒数 is _当年累秒数 - _月初めの年初来の累秒数,
        '_秒数から _日,_時,_分,_秒を求める'(_今月に入っての累秒数,_日,_時,_分,_秒),!.

'_秒数から _日,_時,_分,_秒を求める'(_秒数,_日,_時,_分,_秒) :-
        商ならびと剰余ならび(_秒数,[86400,3600,60],[_日_1,_時,_分],[_,_,_秒]),
        _日 is _日_1 + 1.

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

年間秒(_年,31536000) :-
        \+(うるう年(_年)),!.
年間秒(_年,31622400) :-
        うるう年(_年).

グリニッヂ時と地域時間の差((32400)).

'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :-
        _年_1 is _年 - 1,
        'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!.
'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :-
        _年_1 is _年 - 1,
        'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!.
'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :-
        _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7,
        'Zellerの公式で使う曜日を表す値'(_曜日を表す値,_曜日),!.

'Zellerの公式を用いて曜日を得る'(_年月日,_曜日) :-
        atom(_年月日),
        atom(_曜日),
        '曜日'(_年月日,V),
        !,
        V = _曜日 .
'Zellerの公式を用いて曜日を得る'(_年月日,_曜日) :-
        atom(_年月日),
        var(_曜日),
        '8桁文字列で表された年月日を整数の年・月・日に分解'(_年月日,_年整数,_月整数,_日整数),
        'Zellerの公式を用いて曜日を得る'(_年整数,_月整数,_日整数,_曜日を表す値,_曜日),!.

'Zellerの公式で使う曜日を表す値'(0,'日曜').
'Zellerの公式で使う曜日を表す値'(1,'月曜').
'Zellerの公式で使う曜日を表す値'(2,'火曜').
'Zellerの公式で使う曜日を表す値'(3,'水曜').
'Zellerの公式で使う曜日を表す値'(4,'木曜').
'Zellerの公式で使う曜日を表す値'(5,'金曜').
'Zellerの公式で使う曜日を表す値'(6,'土曜').

'8桁文字列で表された年月日を整数の年・月・日に分解'(_年月日,_年整数,_月整数,_日整数) :-
        atom_to_term(_年月日,_年月日整数,_),
        商ならびと剰余ならび(_年月日整数,[10000,100],[_年整数,_月整数],[_,_日整数]).

商ならびと剰余ならび(_,[],[],[]).
商ならびと剰余ならび(_被除数,[_除数|R2],[_商|R3],[_剰余|R4]) :-
        商と剰余(_被除数,_除数,_商,_剰余),
        商ならびと剰余ならび(_剰余,R2,R3,R4).

商と剰余(_被除数,_除数,_商,_剰余) :-
        _商 is _被除数 // _除数,
        _剰余 is _被除数 mod _除数.

findsum(A,B,C) :-
findall(A,B,L),
sum_list(L,C).