:- use_module(library(julian/lang/en), [english_form//1]).
:- use_module(library(tap)).

% simple day of the week names
phrase(english_form(dow(monday)),"Monday").
phrase(english_form(dow(thursday)),"thursday").


% an empty repitition is no repition at all
empty(fail) :-
    phrase(english_form(_),"").


'jibberish after day of week'(fail) :-
    phrase(english_form(dow(friday)),"friday is fun").


weekday :-
    phrase(english_form(X), "weekday"),
    X == weekday.


'days of the week list' :-
    phrase(english_form(X), "monday, Tuesday or thursday"),
    X == dow([monday,tuesday,thursday]).


'second tuesday' :-
    phrase(english_form(X), "second tuesday"),
    X == nth(2, dow(tuesday)).
'final weekday' :-
    phrase(english_form(X), "final weekday"),
    X == nth(-1, weekday).


'each day' :-
    phrase(english_form(X), "each day"),
    X == true.


'single month' :-
    phrase(english_form(X), "August"),
    X == month(august).
'months list' :-
    phrase(english_form(X), "January, April, july and October"),
    X == month([january,april,july,october]).


'day of week in month' :-
    phrase(english_form(X), "second friday in May"),
    X == [month(may), nth(2,dow(friday))].


'list of refinements' :-
    phrase(english_form(X), "first Monday of April in even years"),
    X = [gregorian(_, _, _), month(april), nth(1, dow(monday))].


'month name and year' :-
    phrase(english_form(X), "August 2013"),
    X = gregorian(2013,8,_).


'second and fourth Sunday' :-
    phrase(english_form(X), "second and fourth sunday"),
    X == nth([2,4], dow(sunday)).


'month name and day number' :-
    phrase(english_form(X), "February 1st"),
    X = gregorian(Y,M,D),
    var(Y),
    M == 2,
    D == 1.

'even years' :-
    phrase(english_form(X), "even years"),
    X = gregorian(Y,M,D),

    % none of the date components is bound
    var(Y),
    var(M),
    var(D),

    % and Y only allows even numbered years
    forall( member(Year,[1998, 2000, 2002, 2012])
          , Y = Year
          ),
    forall( member(Year,[1997, 1999, 2001, 2013])
          , Y \= Year
          ).