
%%% Cartesian closed category
%%%
%%% Categorical language

%%%%  objects
obj : type.  %name obj O.


%% Products
% objects
1 : obj.
* : obj -> obj -> obj. %infix none 10 *.

%% Exponentials
=> : obj -> obj -> obj. %infix right 7 =>.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%% morphisms
mor : obj -> obj -> type.  %name mor F.

% morphisms
id : mor A A.
@ : mor B C -> mor A B -> mor A C. 
%infix none 10 @.

drop : mor A 1.

fst : mor (A * B) A.
snd : mor (A * B) B.
pair : mor A B -> mor A C -> mor A (B * C).

app : mor ((B => C) * B) C.
cur : mor (A * B) C -> mor A (B => C).

% morphism equality
f:mor A1 A2.
g:mor A1 A3.
h:mor A4 A1.

== : mor A B -> mor A B -> type.  %name == ME.
 %infix none 5 ==.
%tabled ==.

% equations
% reordered equations for tabling purposes
% still needs at least abstraction to prevent
% getting stuck 
% 
ass  : H @ (G @ F) == (H @ G) @ F.

prod_l : fst @ (pair F G) == F.
prod_r : snd @ (pair F G) == G.
prod_u : H == pair (fst @ H) (snd @ H).


% @(H @(G F))
=@= : F @ G == F' @ G'
       <- F == F' 
       <- G == G'.

=pair= : pair F G == pair F' G'
	  <- F == F' 
	  <- G == G'.


refl : F == F.

then : F == F''
	<- F == F'
	<- F' == F''. %infix right 4 then. 


% sym : F == F' -> F' == F. 
% id_l : id @ F == F.
% id_r : F @ id == F.



% term_u : H == drop.


% =cur= : F == F' -> cur F == (cur F').

% exp_e : app @ (pair ((cur F) @ fst) snd) == F.
% term-depth : 4
% (@  app pair(@((cur F) fst) snd))  

% term-depth : 
% exp_u : cur (app @ (pair (G @ fst) snd)) == G.
% term-depth: 4
% cur(@ app (pair (@ G fst) snd))

% distp : pair F G @ H == pair (F @ H) (G @ H).
% distc : (cur F) @ G == cur (F @ (pair (G @ fst) snd)).



