Inductive conv_hn_inv : env -> term -> term -> Prop :=
    | chi_srt : forall (e : env) (s : sort), conv_hn_inv e (Srt s) (Srt s)
    | chi_ref : forall (e : env) (n : nat), conv_hn_inv e (Ref n) (Ref n)
    | chi_abs :
        forall (e : env) (A A' M M' : term),
        conv R e A A' ->
        conv R (Ax A' :: e) M M' -> conv_hn_inv e (Abs A M) (Abs A' M')
    | chi_app :
        forall (e : env) (u u' v v' : term),
        conv R e u u' -> conv R e v v' -> conv_hn_inv e (App u v) (App u' v')
    | chi_prod :
        forall (e : env) (A A' B B' : term),
        conv R e A A' ->
        conv R (Ax A' :: e) B B' -> conv_hn_inv e (Prod A B) (Prod A' B').Inductive conv_hn_inv : env -> term -> term -> Prop :=
    | chi_srt : forall (e : env) (s : sort), conv_hn_inv e (Srt s) (Srt s)
    | chi_ref : forall (e : env) (n : nat), conv_hn_inv e (Ref n) (Ref n)
    | chi_abs :
        forall (e : env) (A A' M M' : term),
        conv R e A A' ->
        conv R (Ax A' :: e) M M' -> conv_hn_inv e (Abs A M) (Abs A' M')
    | chi_app :
        forall (e : env) (u u' v v' : term),
        conv R e u u' -> conv R e v v' -> conv_hn_inv e (App u v) (App u' v')
    | chi_prod :
        forall (e : env) (A A' B B' : term),
        conv R e A A' ->
        conv R (Ax A' :: e) B B' -> conv_hn_inv e (Prod A B) (Prod A' B').Inductive conv_hn_inv : env -> term -> term -> Prop :=
    | chi_srt : forall (e : env) (s : sort), conv_hn_inv e (Srt s) (Srt s)
    | chi_ref : forall (e : env) (n : nat), conv_hn_inv e (Ref n) (Ref n)
    | chi_abs :
        forall (e : env) (A A' M M' : term),
        conv R e A A' ->
        conv R (Ax A' :: e) M M' -> conv_hn_inv e (Abs A M) (Abs A' M')
    | chi_app :
        forall (e : env) (u u' v v' : term),
        conv R e u u' -> conv R e v v' -> conv_hn_inv e (App u v) (App u' v')
    | chi_prod :
        forall (e : env) (A A' B B' : term),
        conv R e A A' ->
        conv R (Ax A' :: e) B B' -> conv_hn_inv e (Prod A B) (Prod A' B').Inductive conv_hn_inv : env -> term -> term -> Prop :=
    | chi_srt : forall (e : env) (s : sort), conv_hn_inv e (Srt s) (Srt s)
    | chi_ref : forall (e : env) (n : nat), conv_hn_inv e (Ref n) (Ref n)
    | chi_abs :
        forall (e : env) (A A' M M' : term),
        conv R e A A' ->
        conv R (Ax A' :: e) M M' -> conv_hn_inv e (Abs A M) (Abs A' M')
    | chi_app :
        forall (e : env) (u u' v v' : term),
        conv R e u u' -> conv R e v v' -> conv_hn_inv e (App u v) (App u' v')
    | chi_prod :
        forall (e : env) (A A' B B' : term),
        conv R e A A' ->
        conv R (Ax A' :: e) B B' -> conv_hn_inv e (Prod A B) (Prod A' B').Inductive conv_hn_inv : env -> term -> term -> Prop :=
    | chi_srt : forall (e : env) (s : sort), conv_hn_inv e (Srt s) (Srt s)
    | chi_ref : forall (e : env) (n : nat), conv_hn_inv e (Ref n) (Ref n)
    | chi_abs :
        forall (e : env) (A A' M M' : term),
        conv R e A A' ->
        conv R (Ax A' :: e) M M' -> conv_hn_inv e (Abs A M) (Abs A' M')
    | chi_app :
        forall (e : env) (u u' v v' : term),
        conv R e u u' -> conv R e v v' -> conv_hn_inv e (App u v) (App u' v')
    | chi_prod :
        forall (e : env) (A A' B B' : term),
        conv R e A A' ->
        conv R (Ax A' :: e) B B' -> conv_hn_inv e (Prod A B) (Prod A' B').Inductive conv_hn_inv : env -> term -> term -> Prop :=
    | chi_srt : forall (e : env) (s : sort), conv_hn_inv e (Srt s) (Srt s)
    | chi_ref : forall (e : env) (n : nat), conv_hn_inv e (Ref n) (Ref n)
    | chi_abs :
        forall (e : env) (A A' M M' : term),
        conv R e A A' ->
        conv R (Ax A' :: e) M M' -> conv_hn_inv e (Abs A M) (Abs A' M')
    | chi_app :
        forall (e : env) (u u' v v' : term),
        conv R e u u' -> conv R e v v' -> conv_hn_inv e (App u v) (App u' v')
    | chi_prod :
        forall (e : env) (A A' B B' : term),
        conv R e A A' ->
        conv R (Ax A' :: e) B B' -> conv_hn_inv e (Prod A B) (Prod A' B').

(* Specifications: *)
Lemma conv_hn_inv_sym : forall (e : env) (x y : term), conv_hn_inv e x y -> conv_hn_inv e y x.
Lemma conv_hn_inv_trans : forall (e : env) (x y z : term), conv_hn_inv e x y -> conv_hn_inv e y z -> conv_hn_inv e x z.
Lemma inv_red_hn : forall (e : env) (x y : term), red R e x y -> head_normal R e x -> conv_hn_inv e x y.
Lemma inv_conv_hn : forall (e : env) (x y : term), conv R e x y -> forall x' y' : term, red R e x x' -> head_normal R e x' -> red R e y y' -> head_normal R e y' -> conv_hn_inv e x' y'.
Lemma inv_conv_conv : forall (e : env) (x y : term), conv_hn_inv e x y -> conv R e x y.