2:- module(dates,[year/2,   % +Number, -YearID
    3                 month/2,  % +Month,  -MonthID
    4                 dofm/2,   % +Day,    -DayID
    5                 decade/2, % +Decade, -DecadeID
    6                 yearBC/1,
    7                 yearAD/1]).    8
    9
   10/*========================================================================
   11   Months
   12========================================================================*/
   13
   14month('january','01').
   15month('jan','01').
   16month('jan.','01').
   17month('february','02').
   18month('february','02').
   19month('feb','02').
   20month('feb.','02').
   21month('march','03').
   22month('mar','03').
   23month('mar.','03').
   24month('april','04').
   25month('apr','04').
   26month('apr','04').
   27month('apr.','04').
   28month('may','05').
   29month('june','06').
   30month('july','07').
   31month('august','08').
   32month('aug','08').
   33month('aug.','08').
   34month('september','09').
   35month('sept','09').
   36month('sep','09').
   37month('sep.','09').
   38month('sept.','09').
   39month('october','10').
   40month('oct','10').
   41month('oct.','10').
   42month('november','11').
   43month('nov','11').
   44month('nov.','11').
   45month('december','12').
   46month('dec','12').
   47month('dec.','12').
   48
   49
   50/*========================================================================
   51   Format Years BD and AD
   52========================================================================*/
   53
   54yearBC(bc).
   55yearBC(bce).
   56yearBC('b.c.').
   57yearBC('b.c.e.').
   58
   59yearAD(ad).
   60yearAD(ce).
   61yearAD('a.d.').
   62yearAD('c.e.').
   63
   64
   65/*========================================================================
   66   Format Years
   67========================================================================*/
   68
   69year(Atom,Year):-
   70   atom_codes(Atom,[C1,C2,C3,C4]),
   71   C1 > 48, C1 < 51,
   72   C2 > 47, C2 < 58,
   73   C3 > 47, C3 < 58,
   74   C4 > 47, C4 < 58, !,
   75   atom_codes(Year,[C1,C2,C3,C4]).
   76
   77year(Atom,Year):-
   78   atom_codes(Atom,[39,C3,C4]),
   79   C3 > 47, C3 < 58,
   80   C4 > 47, C4 < 58, !,
   81   atom_codes(Year,[49,57,C3,C4]).
   82
   83
   84/*========================================================================
   85   Last year
   86========================================================================*/
   87
   88last_year(Year,Last):- 
   89   atom_codes(Year,[Y1,Y2,Y3,Y4]),
   90   Y1 > 48, Y1 < 51,
   91   Y2 > 47, Y2 < 58,
   92   Y3 > 47, Y3 < 58,
   93   Y4 > 47, Y4 < 58, !,
   94   number_codes(NumberYear,[Y1,Y2,Y3,Y4]),
   95   NumberLast is NumberYear - 1,
   96   number_codes(NumberLast,Codes),
   97   atom_codes(Last,Codes).
   98
   99last_year(X,X).
  100
  101
  102/*========================================================================
  103   Centuries
  104========================================================================*/
  105
  106century('1st',     '00XX').
  107century('first',   '00XX').
  108century('2nd',     '01XX').
  109century('second',  '01XX').
  110century('3rd',     '02XX').
  111century('third',   '02XX').
  112century('4th','     03XX').
  113century('fourth',  '03XX').
  114century('5th',     '04XX').
  115century('fifth',   '04XX').
  116century('6th',     '05XX').
  117century('sixth',   '05XX').
  118century('7th',     '06XX').
  119century('seventh', '06XX').
  120century('8th',     '07XX').
  121century('eigth',   '07XX').
  122century('9th',     '08XX').
  123century('ninth',   '08XX').
  124century('10th',    '09XX').
  125century('tenth',   '09XX').
  126century('11th',    '10XX').
  127century('12th',    '11XX').
  128century('13th',    '12XX').
  129century('14th',    '13XX').
  130century('15th',    '14XX').
  131century('16th',    '15XX').
  132century('17th',    '16XX').
  133century('18th',    '17XX').
  134century('19th',    '18XX').
  135century('20th',    '19XX').
  136century('21th',    '20XX').
  137
  138
  139/*========================================================================
  140   Decades
  141========================================================================*/
  142
  143decade(Date,Decade):-
  144   atom(Date), 
  145   atom_codes(Date,[39,C,48,115]), !,         %%%  '90s -> 199X
  146   atom_codes(Decade,[49,57,C,88]).
  147
  148decade(Date,Decade):-
  149   atom(Date), 
  150   atom_codes(Date,[A,B,C,48,115]), !,        %%%  1990s -> 199X
  151   atom_codes(Decade,[A,B,C,88]).
  152
  153decade(Date,Decade):-
  154   atom(Date), 
  155   atom_codes(Date,[A,B,C,48]), !,            %%%  1990 -> 199X
  156   atom_codes(Decade,[A,B,C,88]).
  157
  158
  159/*========================================================================
  160   Days
  161========================================================================*/
  162
  163dofm(Day,DID):- number(Day), !, day(Day,DID).
  164dofm(Day,DID):- atom(Day), day(_,Day), !, DID = Day.
  165dofm(Day,DID):- atom(Day), day(Day,DID), !.
  166
  167day(1,'01').  day('1st','01').   day('1','01').
  168day(2,'02').  day('2nd','02').   day('2','02').
  169day(3,'03').  day('3rd','03').   day('3','03').
  170day(4,'04').  day('4th','04').   day('4','04').
  171day(5,'05').  day('5th','05').   day('5','05').
  172day(6,'06').  day('6th','06').   day('6','06').
  173day(7,'07').  day('7th','07').   day('7','07').
  174day(8,'08').  day('8th','08').   day('8','08').
  175day(9,'09').  day('9th','09').   day('9','09').
  176day(10,'10'). day('10th','10').
  177day(11,'11'). day('11th','11').
  178day(12,'12'). day('12th','12').
  179day(13,'13'). day('13th','13').
  180day(14,'14'). day('14th','14').
  181day(15,'15'). day('15th','15').
  182day(16,'16'). day('16th','16').
  183day(17,'17'). day('17th','17').
  184day(18,'18'). day('18th','18').
  185day(19,'19'). day('19th','19').
  186day(20,'20'). day('20th','20').
  187day(21,'21'). day('21st','21').
  188day(22,'22'). day('22nd','22').
  189day(23,'23'). day('23rd','23').
  190day(24,'24'). day('24th','24').
  191day(25,'25'). day('25th','25').
  192day(26,'26'). day('26th','26').
  193day(27,'27'). day('27th','27').
  194day(28,'28'). day('28th','28').
  195day(29,'29'). day('29th','29').
  196day(30,'30'). day('30th','30').
  197day(31,'31'). day('31st','31')