% CPSC 312 2024 - Prolog Code for Dates
% Copyright D Poole 2024, Released under CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/

% ce(Y,M,D) is the date with year Y, month M, day D in the common era

% born(Person,Date) is true if Person was born on Date
born(justin,ce(1994,mar,1)). 
born(pierre,ce(1919,oct,18)). 
born(ella_mai,ce(1994,nov,3)).
born(shawn_mendez, ce(1998,aug,8)).

%b4(D1,D2) is true if date D1 is before date D2
b4(ce(Y1,_,_), ce(Y2,_,_)) :- Y1 < Y2.
b4(ce(Y,M1,_), ce(Y,M2,_)) :-
    month(M1, N1),
    month(M2, N2),
    N1 < N2.
b4(ce(Y,M,D1), ce(Y,M,D2)) :- D1 < D2.

% month(M,N) is true if month M is the N'th month of the year
month(jan,1).
month(feb,2).
month(mar,3).
month(apr,4).
month(may,5).
month(jun,6).
month(jul,7).
month(aug,8).
month(sep,9).
month(oct,10).
month(nov,11).
month(dec,12).

% before(D1, D2) is true when date D1 is before date D2
before(ce(Y0,_,_), ce(Y1,_,_)) :-
    Y0 < Y1.
before(ce(Y,M0,_), ce(Y,M1,_)) :-
    month(M0,N0),
    month(M1,N1),
    N0 < N1.
before(ce(Y,M,D0), ce(Y,M,D1)) :-
    D0 < D1.

before(bce(_,_,_), ce(_,_,_)).
before(bce(Y0,_,_), bce(Y1,_,_)) :-
    Y0 > Y1.
before(bce(Y,M0,_), bce(Y,M1,_)) :-
    month(M0,N0),
    month(M1,N1),
    N0 < N1.
before(bce(Y,M,D0), bce(Y,M,D1)) :-
    D0 < D1.



% older(X,Y) is true if person X is older than (born before) person Y
older(X,Y) :-
    born(X, XBD),
    born(Y, YBD),
    b4(XBD, YBD).

