c2l((X,Y),[X|Z]) :- !,c2l(Y,Z).
c2l(X,[X]).

ops(X) :- ops(X,999).

ops([],_).
ops([H|T],N) :- ops1(H,N), N1 is N - 1, ops(T,N1).

ops1((X,Y),N) :- !, ops1(X,N), ops1(Y,N).
ops1(This,N)  :- This =.. [X,A],  op(N,X,A).


:- ops([fx(type,all)],1200).

:- ops(
	   [ xfx(with)
       , xfx(to)
	   ,  fx(by)
	   ,  fx(do)
	   ],699).
term_expansion((all X,Y),All) :-
	findall(One,Y,All).

%types
% builtins
num(X) :- number(X).
int(X) :- integer(X).
%string(X) already built-in

posint(X) :- int(X), X >= 0.

age(X) :- num(X), X >= 0, X <= 120. 

weekday(sat).
weekday(sun).
weekday(mon).
weekday(tues).
weekday(wed).
weekday(thur).
weekday(fri).

month(X) :- month(X,_).
month(jan,X) :- day31(X).
month(feb,X) :- day29(X).
month(mar,X) :- day31(X).
month(apr,X) :- day30(X).
month(may,X) :- day31(X).
month(jun,X) :- day30(X).
month(jul,X) :- day31(X).
month(aug,X) :- day31(X).
month(sep,X) :- day30(X).
month(oct,X) :- day31(X).
month(nov,X) :- day30(X).
month(dec,X) :- day31(X).

all day31(X), between(1,31,X).
all day30(X), between(1,30,X).
all day29(X), between(1,29,X).

date(X) :- 	
	X is date with day=D with month=M with year=Y,
	ok(X),
	(M=feb, 0 is Y mod 4 ->  D <=29 ; D <=28).

date with day(day), month(month), year(year).
	  
