1) date(M, D, Y) :- integer(Y), Y >= 0, integer(D), D > 0, daysmonth(M, MaxDay, Y), D =< MaxDay. leapyear(Y) :- integer(Y), Y > 0, 0 is Y mod 4, Z is Y mod 100, Z > 0. leapyear(Y) :- integer(Y), Y > 0, 0 is Y mod 4, Z is Y mod 400, Z = 0. daysmonth(jan, 31, _). daysmonth(feb, 28, Y) :- not(leapyear(Y)). daysmonth(feb, 29, Y) :- leapyear(Y). daysmonth(mar, 31, _). daysmonth(apr, 30, _). daysmonth(may, 31, _). daysmonth(jun, 30, _). daysmonth(jul, 31, _). daysmonth(aug, 31, _). daysmonth(sep, 30, _). daysmonth(oct, 31, _). daysmonth(nov, 30, _). daysmonth(dec, 31, _).