Require Export Main.
Require Export SortECC.
Section ECC.
Definition trm_ecc := term srt_ecc.
Definition env_ecc := env srt_ecc.
(* Construction du CTS *)
Definition ecc : CTS_spec srt_ecc :=
Build_CTS_spec _ axiom_ecc rules_ecc univ_ecc (beta_delta_rule _).
(* Construction du PTS issu du CTS *)
Definition ecc_pts : PTS_sub_spec srt_ecc := cts_pts_functor _ ecc.
Definition le_type : red_rule srt_ecc :=
Rule _ (Le_type _ (pts_le_type _ ecc_pts)).
Definition typ_ecc : env_ecc -> trm_ecc -> trm_ecc -> Prop := typ _ ecc_pts.
Definition wft_ecc : env_ecc -> trm_ecc -> Prop := wf_type _ ecc_pts.
Definition wf_ecc : env_ecc -> Prop := wf _ ecc_pts.
Definition ecc_sn := sn srt_ecc (ctxt _ (Rule _ (head_reduct _ ecc))).
Hint Unfold le_type typ_ecc wft_ecc wf_ecc ecc_sn: pts.
(* Algorithme de mise en forme normale de tete Decidabilite du sous-typage pour les types bien formes *)

(* Specifications: *)
Lemma whnf :
forall (e : env_ecc) (t : trm_ecc),
ecc_sn e t ->
{u : trm_ecc | red _ (beta_delta _) e t u &
head_normal _ (beta_delta _) e u}.