Record norm_sound_CTS : Set := 
    {ncts_sr : rule_sound cts_pts_functor hdr;
     ncts_typ_sn :
      forall (e : env) (t T : term),
      typ cts_pts_functor e t T -> sn red_step e t;
     ncts_axiom : forall s : sort, ppal_dec (axiom s) rt_univ;
     ncts_rule :
      forall x1 x2 : sort,
      {x3 : sort | rule x1 x2 x3 & 
      forall s1 s2 s3 : sort,
      rule s1 s2 s3 -> rt_univ x1 s1 -> rt_univ x2 s2 -> rt_univ x3 s3};
     ncts_hierarchy :
      forall s1 s2 : sort,
      rt_univ s1 s2 -> typed_sort axiom s2 -> typed_sort axiom s1}.Record norm_sound_CTS : Set := 
    {ncts_sr : rule_sound cts_pts_functor hdr;
     ncts_typ_sn :
      forall (e : env) (t T : term),
      typ cts_pts_functor e t T -> sn red_step e t;
     ncts_axiom : forall s : sort, ppal_dec (axiom s) rt_univ;
     ncts_rule :
      forall x1 x2 : sort,
      {x3 : sort | rule x1 x2 x3 & 
      forall s1 s2 s3 : sort,
      rule s1 s2 s3 -> rt_univ x1 s1 -> rt_univ x2 s2 -> rt_univ x3 s3};
     ncts_hierarchy :
      forall s1 s2 : sort,
      rt_univ s1 s2 -> typed_sort axiom s2 -> typed_sort axiom s1}.Record norm_sound_CTS : Set := 
    {ncts_sr : rule_sound cts_pts_functor hdr;
     ncts_typ_sn :
      forall (e : env) (t T : term),
      typ cts_pts_functor e t T -> sn red_step e t;
     ncts_axiom : forall s : sort, ppal_dec (axiom s) rt_univ;
     ncts_rule :
      forall x1 x2 : sort,
      {x3 : sort | rule x1 x2 x3 & 
      forall s1 s2 s3 : sort,
      rule s1 s2 s3 -> rt_univ x1 s1 -> rt_univ x2 s2 -> rt_univ x3 s3};
     ncts_hierarchy :
      forall s1 s2 : sort,
      rt_univ s1 s2 -> typed_sort axiom s2 -> typed_sort axiom s1}.Record norm_sound_CTS : Set := 
    {ncts_sr : rule_sound cts_pts_functor hdr;
     ncts_typ_sn :
      forall (e : env) (t T : term),
      typ cts_pts_functor e t T -> sn red_step e t;
     ncts_axiom : forall s : sort, ppal_dec (axiom s) rt_univ;
     ncts_rule :
      forall x1 x2 : sort,
      {x3 : sort | rule x1 x2 x3 & 
      forall s1 s2 s3 : sort,
      rule s1 s2 s3 -> rt_univ x1 s1 -> rt_univ x2 s2 -> rt_univ x3 s3};
     ncts_hierarchy :
      forall s1 s2 : sort,
      rt_univ s1 s2 -> typed_sort axiom s2 -> typed_sort axiom s1}.Record norm_sound_CTS : Set := 
    {ncts_sr : rule_sound cts_pts_functor hdr;
     ncts_typ_sn :
      forall (e : env) (t T : term),
      typ cts_pts_functor e t T -> sn red_step e t;
     ncts_axiom : forall s : sort, ppal_dec (axiom s) rt_univ;
     ncts_rule :
      forall x1 x2 : sort,
      {x3 : sort | rule x1 x2 x3 & 
      forall s1 s2 s3 : sort,
      rule s1 s2 s3 -> rt_univ x1 s1 -> rt_univ x2 s2 -> rt_univ x3 s3};
     ncts_hierarchy :
      forall s1 s2 : sort,
      rt_univ s1 s2 -> typed_sort axiom s2 -> typed_sort axiom s1}.Record norm_sound_CTS : Set := 
    {ncts_sr : rule_sound cts_pts_functor hdr;
     ncts_typ_sn :
      forall (e : env) (t T : term),
      typ cts_pts_functor e t T -> sn red_step e t;
     ncts_axiom : forall s : sort, ppal_dec (axiom s) rt_univ;
     ncts_rule :
      forall x1 x2 : sort,
      {x3 : sort | rule x1 x2 x3 & 
      forall s1 s2 s3 : sort,
      rule s1 s2 s3 -> rt_univ x1 s1 -> rt_univ x2 s2 -> rt_univ x3 s3};
     ncts_hierarchy :
      forall s1 s2 : sort,
      rt_univ s1 s2 -> typed_sort axiom s2 -> typed_sort axiom s1}.

(* Specifications: *)
Lemma cumul_type_sn : forall (e : env) (t : term), wf_type cts_pts_functor e t -> sn red_step e t.
Lemma subject_reduction_cumul : rule_sound cts_pts_functor (red hdr).
Lemma sound_wf_type_cumul : forall (e : env) (T U : term), wf_type cts_pts_functor e T -> red hdr e T U -> wf_type cts_pts_functor e U.
Lemma cumul_least_sort : forall (e : env) (t : term), wf_type cts_pts_functor e t -> red_to_sort_dec cts_pts_functor e t.
Lemma cumul_least_prod : forall (e : env) (t : term), wf_type cts_pts_functor e t -> red_to_wf_prod_dec cts_pts_functor e t.
Lemma cumul_infer_axiom : forall s : sort, ppal_dec (axiom s) (fun s1 s2 => forall e : env, rt_cumul e (Srt s1) (Srt s2)).
Lemma cumul_infer_rule : forall x1 x2 : sort, {x3 : sort | ppal (rule_sat cts_pts_functor x1 x2) (fun s1 s2 => forall e : env, rt_cumul e (Srt s1) (Srt s2)) x3}.
Lemma cumul_topsort_untyped : forall (e : env) (s s' : sort) (t : term), rt_cumul e (Srt s) t -> typ cts_pts_functor e t (Srt s') -> typed_sort axiom s.
Theorem cts_prim_algos : PTS_algos cts_pts_functor.
Theorem full_cts_type_checker : PTS_TC cts_pts_functor.