%%% Mini-ML Natural Semantics
%%% Author: Frank Pfenning, based on [Michaylov & Pfenning 92]

eval : exp -> exp -> type.  %name eval D.

% Natural Numbers
ev_z       : eval z z.
ev_s       : eval (s E) (s V)
	      <- eval E V.
ev_case_z  : eval (case E1 E2 E3) V
	      <- eval E1 z
	      <- eval E2 V.
ev_case_s  : eval (case E1 E2 E3) V
	      <- eval E1 (s V1')
	      <- eval (E3 V1') V.

% Pairs
ev_pair : eval (pair E1 E2) (pair V1 V2)
	     <- eval E1 V1
	     <- eval E2 V2.
ev_fst  : eval (fst E) V1
	     <- eval E (pair V1 V2).
ev_snd  : eval (snd E) V2
	     <- eval E (pair V1 V2).

% Functions
ev_lam  : eval (lam E) (lam E).
ev_app  : eval (app E1 E2) V
	    <- eval E1 (lam E1')
	    <- eval E2 V2
	    <- eval (E1' V2) V.

% Definitions
ev_letv : eval (letv E1 E2) V
	     <- eval E1 V1
	     <- eval (E2 V1) V.
ev_letn : eval (letn E1 E2) V
	     <- eval (E2 E1) V.

% Recursion
ev_fix  : eval (fix E) V
	     <- eval (E (fix E)) V.
