(* Inductive t : Type -> Type := *) (* | Just : forall (A : Type), t A -> t A. *) (* Fixpoint test {A : Type} (x : t A) : t (A + unit) := *) (* match x in t A return t (A + unit) with *) (* | Just T x => @test T x *) (* end. *) Definition Type1 := Type. Definition Type2 := Type. Definition cast (x:Type2) := x:Type1. Axiom f: Type2 -> Prop. Definition A := let T := fun A:Type1 => _ in fun A':Type2 => eq_refl : T A' = f A' :> Prop. (* Type2 <= Type1... f A -> Type1 <= Type2 *) Inductive t : Type -> Type := | Just : forall (A : Type), t A -> t A. Fixpoint test {A : Type} (x : t A) : t (A + unit) := match x in t A with | Just B x => @test B x end.