Section SortsOfV6.
(* Definition des composantes du calcul *)
Inductive calc : Set :=
| Pos : calc
| Neg : calc.
Inductive srt_v6 : Set :=
| Sprop : calc -> srt_v6
| Stype : nat -> srt_v6.
Inductive axiom_v6 : srt_v6 -> srt_v6 -> Prop :=
| ax_prop : forall (c : calc) (n : nat), axiom_v6 (Sprop c) (Stype n)
| ax_type : forall n m : nat, n < m -> axiom_v6 (Stype n) (Stype m).
Inductive rules_v6 : srt_v6 -> srt_v6 -> srt_v6 -> Prop :=
| rule_prop_l : forall (c : calc) (s : srt_v6), rules_v6 (Sprop c) s s
| rule_prop_r :
forall (c : calc) (s : srt_v6), rules_v6 s (Sprop c) (Sprop c)
| rule_type :
forall n m p : nat,
n <= p -> m <= p -> rules_v6 (Stype n) (Stype m) (Stype p).
Inductive univ_v6 : srt_v6 -> srt_v6 -> Prop :=
| univ_prop : forall (c : calc) (n : nat), univ_v6 (Sprop c) (Stype n)
| univ_type : forall n m : nat, n <= m -> univ_v6 (Stype n) (Stype m).
Definition univ : srt_v6 -> srt_v6 -> Prop := clos_refl_trans _ univ_v6.
Hint Resolve ax_prop ax_type rule_prop_l rule_prop_r rule_type univ_prop
univ_type: pts.
Hint Unfold univ: pts.
(* Inversion et Decidabilite de l'inclusion entre sortes *)
Let univ_trans : forall x y z : srt_v6, univ x y -> univ y z -> univ x z.
Proof rt_trans srt_v6 univ_v6.
Inductive inv_univ : srt_v6 -> srt_v6 -> Prop :=
| iu_prop : forall c : calc, inv_univ (Sprop c) (Sprop c)
| iu_pr_ty : forall (c : calc) (n : nat), inv_univ (Sprop c) (Stype n)
| iu_type : forall n m : nat, n <= m -> inv_univ (Stype n) (Stype m).
Hint Resolve iu_prop iu_pr_ty iu_type: pts.
simple induction 1; intros; auto with arith pts.
inversion_clear H0; auto with arith pts.
inversion_clear H1.
apply iu_type.
apply le_trans with m; auto with arith pts.
Qed.

Lemma univ_inv :
forall s s' : srt_v6,
univ s s' -> forall P : Prop, (inv_univ s s' -> P) -> P.