198 lines
4.6 KiB
Prolog
198 lines
4.6 KiB
Prolog
days(Y,M,D,Total) :-
|
|
years_to_days(Y, D1),
|
|
months_to_day(M, Y, D2),
|
|
Total is D1+D2+D-1.
|
|
|
|
years_to_days(Y0, DY) :-
|
|
Y1 is Y0-1900,
|
|
DY is Y1*365+((Y1+3)//4).
|
|
|
|
months_to_day(1,_,0).
|
|
months_to_day(2,_,31).
|
|
months_to_day(3,Y,DM) :-
|
|
extra_day(Y,ED),
|
|
DM is 31+28+ED.
|
|
months_to_day(4,Y,DM) :-
|
|
extra_day(Y,ED),
|
|
DM is 31+28+31+ED.
|
|
months_to_day(5,Y,DM) :-
|
|
extra_day(Y,ED),
|
|
DM is 31+28+31+30+ED.
|
|
months_to_day(6,Y,DM) :-
|
|
extra_day(Y,ED),
|
|
DM is 31+28+31+30+31+ED.
|
|
months_to_day(7,Y,DM) :-
|
|
extra_day(Y,ED),
|
|
DM is 31+28+31+30+31+30+ED.
|
|
months_to_day(8,Y,DM) :-
|
|
extra_day(Y,ED),
|
|
DM is 31+28+31+30+31+30+31+ED.
|
|
months_to_day(9,Y,DM) :-
|
|
extra_day(Y,ED),
|
|
DM is 31+28+31+30+31+30+31+31+ED.
|
|
months_to_day(10,Y,DM) :-
|
|
extra_day(Y,ED),
|
|
DM is 31+28+31+30+31+30+31+31+30+ED.
|
|
months_to_day(11,Y,DM) :-
|
|
extra_day(Y,ED),
|
|
DM is 31+28+31+30+31+30+31+31+30+31+ED.
|
|
months_to_day(12,Y,DM) :-
|
|
extra_day(Y,ED),
|
|
DM is 31+28+31+30+31+30+31+31+30+31+30+ED.
|
|
months_to_day(13,Y,DM) :- % should never succeed...
|
|
extra_day(Y,ED),
|
|
DM is 31+28+31+30+31+30+31+31+30+31+30+31+ED.
|
|
|
|
extra_day(Y,1) :- Y mod 4 == 0, !.
|
|
extra_day(_,0).
|
|
|
|
date(Total, Y, M, D) :-
|
|
get_years(Total, Y, DaysLeft),
|
|
get_months(DaysLeft, Y, M, D0),
|
|
D is D0+1.
|
|
|
|
get_years(Total, Y, DaysLeft) :-
|
|
daysperyear(Y,D0),
|
|
D0 =< Total,
|
|
Y1 is Y+1,
|
|
daysperyear(Y1,D1),
|
|
D1 > Total, !,
|
|
DaysLeft is Total-D0.
|
|
|
|
get_months(Total, Y, Month, Days) :-
|
|
months_to_day(Month, Y, DM),
|
|
DM =< Total,
|
|
Month1 is Month+1,
|
|
months_to_day(Month1, Y, DM1),
|
|
DM1 > Total, !,
|
|
Days is Total-DM.
|
|
|
|
gendays(120,_) :- !.
|
|
gendays(I0,D0) :- !,
|
|
J is I0+1900,
|
|
format('days(~d,~d).~n',[J,D0]),
|
|
( I0 mod 4 =:= 0 -> D is D0+366 ; D is D0+365 ),
|
|
I is I0+1,
|
|
gendays(I, D).
|
|
|
|
daysperyear(1900,0).
|
|
daysperyear(1901,366).
|
|
daysperyear(1902,731).
|
|
daysperyear(1903,1096).
|
|
daysperyear(1904,1461).
|
|
daysperyear(1905,1827).
|
|
daysperyear(1906,2192).
|
|
daysperyear(1907,2557).
|
|
daysperyear(1908,2922).
|
|
daysperyear(1909,3288).
|
|
daysperyear(1910,3653).
|
|
daysperyear(1911,4018).
|
|
daysperyear(1912,4383).
|
|
daysperyear(1913,4749).
|
|
daysperyear(1914,5114).
|
|
daysperyear(1915,5479).
|
|
daysperyear(1916,5844).
|
|
daysperyear(1917,6210).
|
|
daysperyear(1918,6575).
|
|
daysperyear(1919,6940).
|
|
daysperyear(1920,7305).
|
|
daysperyear(1921,7671).
|
|
daysperyear(1922,8036).
|
|
daysperyear(1923,8401).
|
|
daysperyear(1924,8766).
|
|
daysperyear(1925,9132).
|
|
daysperyear(1926,9497).
|
|
daysperyear(1927,9862).
|
|
daysperyear(1928,10227).
|
|
daysperyear(1929,10593).
|
|
daysperyear(1930,10958).
|
|
daysperyear(1931,11323).
|
|
daysperyear(1932,11688).
|
|
daysperyear(1933,12054).
|
|
daysperyear(1934,12419).
|
|
daysperyear(1935,12784).
|
|
daysperyear(1936,13149).
|
|
daysperyear(1937,13515).
|
|
daysperyear(1938,13880).
|
|
daysperyear(1939,14245).
|
|
daysperyear(1940,14610).
|
|
daysperyear(1941,14976).
|
|
daysperyear(1942,15341).
|
|
daysperyear(1943,15706).
|
|
daysperyear(1944,16071).
|
|
daysperyear(1945,16437).
|
|
daysperyear(1946,16802).
|
|
daysperyear(1947,17167).
|
|
daysperyear(1948,17532).
|
|
daysperyear(1949,17898).
|
|
daysperyear(1950,18263).
|
|
daysperyear(1951,18628).
|
|
daysperyear(1952,18993).
|
|
daysperyear(1953,19359).
|
|
daysperyear(1954,19724).
|
|
daysperyear(1955,20089).
|
|
daysperyear(1956,20454).
|
|
daysperyear(1957,20820).
|
|
daysperyear(1958,21185).
|
|
daysperyear(1959,21550).
|
|
daysperyear(1960,21915).
|
|
daysperyear(1961,22281).
|
|
daysperyear(1962,22646).
|
|
daysperyear(1963,23011).
|
|
daysperyear(1964,23376).
|
|
daysperyear(1965,23742).
|
|
daysperyear(1966,24107).
|
|
daysperyear(1967,24472).
|
|
daysperyear(1968,24837).
|
|
daysperyear(1969,25203).
|
|
daysperyear(1970,25568).
|
|
daysperyear(1971,25933).
|
|
daysperyear(1972,26298).
|
|
daysperyear(1973,26664).
|
|
daysperyear(1974,27029).
|
|
daysperyear(1975,27394).
|
|
daysperyear(1976,27759).
|
|
daysperyear(1977,28125).
|
|
daysperyear(1978,28490).
|
|
daysperyear(1979,28855).
|
|
daysperyear(1980,29220).
|
|
daysperyear(1981,29586).
|
|
daysperyear(1982,29951).
|
|
daysperyear(1983,30316).
|
|
daysperyear(1984,30681).
|
|
daysperyear(1985,31047).
|
|
daysperyear(1986,31412).
|
|
daysperyear(1987,31777).
|
|
daysperyear(1988,32142).
|
|
daysperyear(1989,32508).
|
|
daysperyear(1990,32873).
|
|
daysperyear(1991,33238).
|
|
daysperyear(1992,33603).
|
|
daysperyear(1993,33969).
|
|
daysperyear(1994,34334).
|
|
daysperyear(1995,34699).
|
|
daysperyear(1996,35064).
|
|
daysperyear(1997,35430).
|
|
daysperyear(1998,35795).
|
|
daysperyear(1999,36160).
|
|
daysperyear(2000,36525).
|
|
daysperyear(2001,36891).
|
|
daysperyear(2002,37256).
|
|
daysperyear(2003,37621).
|
|
daysperyear(2004,37986).
|
|
daysperyear(2005,38352).
|
|
daysperyear(2006,38717).
|
|
daysperyear(2007,39082).
|
|
daysperyear(2008,39447).
|
|
daysperyear(2009,39813).
|
|
daysperyear(2010,40178).
|
|
daysperyear(2011,40543).
|
|
daysperyear(2012,40908).
|
|
daysperyear(2013,41274).
|
|
daysperyear(2014,41639).
|
|
daysperyear(2015,42004).
|
|
daysperyear(2016,42369).
|
|
daysperyear(2017,42735).
|
|
daysperyear(2018,43100).
|
|
daysperyear(2019,43465).
|