Inductive beta_par_red1 : env -> term -> term -> Prop :=
    | par_beta :
        forall (e : env) (M M' T : term),
        beta_par_red1 (Ax T :: e) M M' ->
        forall N N' : term,
        beta_par_red1 e N N' ->
        beta_par_red1 e (App (Abs T M) N) (subst N' M')
    | sort_par_red_b :
        forall (e : env) (s : sort), beta_par_red1 e (Srt s) (Srt s)
    | ref_par_red_b :
        forall (e : env) (n : nat), beta_par_red1 e (Ref n) (Ref n)
    | abs_par_red_b :
        forall (e : env) (M M' T T' : term),
        beta_par_red1 (Ax T' :: e) M M' ->
        beta_par_red1 e T T' -> beta_par_red1 e (Abs T M) (Abs T' M')
    | app_par_red_b :
        forall (e : env) (M M' : term),
        beta_par_red1 e M M' ->
        forall N N' : term,
        beta_par_red1 e N N' -> beta_par_red1 e (App M N) (App M' N')
    | prod_par_red_b :
        forall (e : env) (M M' : term),
        beta_par_red1 e M M' ->
        forall N N' : term,
        beta_par_red1 (Ax M' :: e) N N' ->
        beta_par_red1 e (Prod M N) (Prod M' N').Inductive beta_par_red1 : env -> term -> term -> Prop :=
    | par_beta :
        forall (e : env) (M M' T : term),
        beta_par_red1 (Ax T :: e) M M' ->
        forall N N' : term,
        beta_par_red1 e N N' ->
        beta_par_red1 e (App (Abs T M) N) (subst N' M')
    | sort_par_red_b :
        forall (e : env) (s : sort), beta_par_red1 e (Srt s) (Srt s)
    | ref_par_red_b :
        forall (e : env) (n : nat), beta_par_red1 e (Ref n) (Ref n)
    | abs_par_red_b :
        forall (e : env) (M M' T T' : term),
        beta_par_red1 (Ax T' :: e) M M' ->
        beta_par_red1 e T T' -> beta_par_red1 e (Abs T M) (Abs T' M')
    | app_par_red_b :
        forall (e : env) (M M' : term),
        beta_par_red1 e M M' ->
        forall N N' : term,
        beta_par_red1 e N N' -> beta_par_red1 e (App M N) (App M' N')
    | prod_par_red_b :
        forall (e : env) (M M' : term),
        beta_par_red1 e M M' ->
        forall N N' : term,
        beta_par_red1 (Ax M' :: e) N N' ->
        beta_par_red1 e (Prod M N) (Prod M' N').Inductive beta_par_red1 : env -> term -> term -> Prop :=
    | par_beta :
        forall (e : env) (M M' T : term),
        beta_par_red1 (Ax T :: e) M M' ->
        forall N N' : term,
        beta_par_red1 e N N' ->
        beta_par_red1 e (App (Abs T M) N) (subst N' M')
    | sort_par_red_b :
        forall (e : env) (s : sort), beta_par_red1 e (Srt s) (Srt s)
    | ref_par_red_b :
        forall (e : env) (n : nat), beta_par_red1 e (Ref n) (Ref n)
    | abs_par_red_b :
        forall (e : env) (M M' T T' : term),
        beta_par_red1 (Ax T' :: e) M M' ->
        beta_par_red1 e T T' -> beta_par_red1 e (Abs T M) (Abs T' M')
    | app_par_red_b :
        forall (e : env) (M M' : term),
        beta_par_red1 e M M' ->
        forall N N' : term,
        beta_par_red1 e N N' -> beta_par_red1 e (App M N) (App M' N')
    | prod_par_red_b :
        forall (e : env) (M M' : term),
        beta_par_red1 e M M' ->
        forall N N' : term,
        beta_par_red1 (Ax M' :: e) N N' ->
        beta_par_red1 e (Prod M N) (Prod M' N').Inductive beta_par_red1 : env -> term -> term -> Prop :=
    | par_beta :
        forall (e : env) (M M' T : term),
        beta_par_red1 (Ax T :: e) M M' ->
        forall N N' : term,
        beta_par_red1 e N N' ->
        beta_par_red1 e (App (Abs T M) N) (subst N' M')
    | sort_par_red_b :
        forall (e : env) (s : sort), beta_par_red1 e (Srt s) (Srt s)
    | ref_par_red_b :
        forall (e : env) (n : nat), beta_par_red1 e (Ref n) (Ref n)
    | abs_par_red_b :
        forall (e : env) (M M' T T' : term),
        beta_par_red1 (Ax T' :: e) M M' ->
        beta_par_red1 e T T' -> beta_par_red1 e (Abs T M) (Abs T' M')
    | app_par_red_b :
        forall (e : env) (M M' : term),
        beta_par_red1 e M M' ->
        forall N N' : term,
        beta_par_red1 e N N' -> beta_par_red1 e (App M N) (App M' N')
    | prod_par_red_b :
        forall (e : env) (M M' : term),
        beta_par_red1 e M M' ->
        forall N N' : term,
        beta_par_red1 (Ax M' :: e) N N' ->
        beta_par_red1 e (Prod M N) (Prod M' N').Inductive beta_par_red1 : env -> term -> term -> Prop :=
    | par_beta :
        forall (e : env) (M M' T : term),
        beta_par_red1 (Ax T :: e) M M' ->
        forall N N' : term,
        beta_par_red1 e N N' ->
        beta_par_red1 e (App (Abs T M) N) (subst N' M')
    | sort_par_red_b :
        forall (e : env) (s : sort), beta_par_red1 e (Srt s) (Srt s)
    | ref_par_red_b :
        forall (e : env) (n : nat), beta_par_red1 e (Ref n) (Ref n)
    | abs_par_red_b :
        forall (e : env) (M M' T T' : term),
        beta_par_red1 (Ax T' :: e) M M' ->
        beta_par_red1 e T T' -> beta_par_red1 e (Abs T M) (Abs T' M')
    | app_par_red_b :
        forall (e : env) (M M' : term),
        beta_par_red1 e M M' ->
        forall N N' : term,
        beta_par_red1 e N N' -> beta_par_red1 e (App M N) (App M' N')
    | prod_par_red_b :
        forall (e : env) (M M' : term),
        beta_par_red1 e M M' ->
        forall N N' : term,
        beta_par_red1 (Ax M' :: e) N N' ->
        beta_par_red1 e (Prod M N) (Prod M' N').Inductive beta_par_red1 : env -> term -> term -> Prop :=
    | par_beta :
        forall (e : env) (M M' T : term),
        beta_par_red1 (Ax T :: e) M M' ->
        forall N N' : term,
        beta_par_red1 e N N' ->
        beta_par_red1 e (App (Abs T M) N) (subst N' M')
    | sort_par_red_b :
        forall (e : env) (s : sort), beta_par_red1 e (Srt s) (Srt s)
    | ref_par_red_b :
        forall (e : env) (n : nat), beta_par_red1 e (Ref n) (Ref n)
    | abs_par_red_b :
        forall (e : env) (M M' T T' : term),
        beta_par_red1 (Ax T' :: e) M M' ->
        beta_par_red1 e T T' -> beta_par_red1 e (Abs T M) (Abs T' M')
    | app_par_red_b :
        forall (e : env) (M M' : term),
        beta_par_red1 e M M' ->
        forall N N' : term,
        beta_par_red1 e N N' -> beta_par_red1 e (App M N) (App M' N')
    | prod_par_red_b :
        forall (e : env) (M M' : term),
        beta_par_red1 e M M' ->
        forall N N' : term,
        beta_par_red1 (Ax M' :: e) N N' ->
        beta_par_red1 e (Prod M N) (Prod M' N').Inductive beta_par_red1 : env -> term -> term -> Prop :=
    | par_beta :
        forall (e : env) (M M' T : term),
        beta_par_red1 (Ax T :: e) M M' ->
        forall N N' : term,
        beta_par_red1 e N N' ->
        beta_par_red1 e (App (Abs T M) N) (subst N' M')
    | sort_par_red_b :
        forall (e : env) (s : sort), beta_par_red1 e (Srt s) (Srt s)
    | ref_par_red_b :
        forall (e : env) (n : nat), beta_par_red1 e (Ref n) (Ref n)
    | abs_par_red_b :
        forall (e : env) (M M' T T' : term),
        beta_par_red1 (Ax T' :: e) M M' ->
        beta_par_red1 e T T' -> beta_par_red1 e (Abs T M) (Abs T' M')
    | app_par_red_b :
        forall (e : env) (M M' : term),
        beta_par_red1 e M M' ->
        forall N N' : term,
        beta_par_red1 e N N' -> beta_par_red1 e (App M N) (App M' N')
    | prod_par_red_b :
        forall (e : env) (M M' : term),
        beta_par_red1 e M M' ->
        forall N N' : term,
        beta_par_red1 (Ax M' :: e) N N' ->
        beta_par_red1 e (Prod M N) (Prod M' N').

Lemma inv_prod_beta_conv : product_inversion (conv beta).