Proof
fun X x e => e (fun z => z (fun _ => top) -> bot) (fun p => p) top_intro.
(** On the other hand, the corresponding elimination scheme does not hold, due to the existence of inhabitants of the type (opt X) that are neither of the form (some X x) nor of the form (none X), such as the term  [f:X->Prop]top : (opt X)  for instance.  In practice, the existence of such parasitic elements will not pose a problem.  When defining edge relations on data-types such as (opt X), we will simply ignore these extra elements so that they will become invisible up to a bisimulation. *)
(** ** Extended sum type **)
(** The (extended) sum type (sum X Y) : Typ1 (parametrized by the types X,Y : Typ1) that would be inductively defined in Coq by  Inductive sum [X,Y:Typ1] : Typ1 := | inl : X->(sum X Y)                  (left injection) | inr : Y->(sum X Y)                  (right injection) | out : (sum X Y).                    (extra element)  is mimicked by the following definitions: *)
Definition sum (X Y : Typ1) : Typ1 := (X -> Prop) -> (Y -> Prop) -> Prop.
Definition inl (X Y : Typ1) (x : X) : sum X Y := fun f _ => f x.
Definition inr (X Y : Typ1) (y : Y) : sum X Y := fun _ g => g y.
Definition out (X Y : Typ1) : sum X Y := fun _ _ => bot.
(** Again, these definitions fulfill the expected properties of injectivity and non-confusion: *)

(* Specifications: *)
Lemma eq_inl_inl :
forall (X Y : Typ1) (x1 x2 : X),
eq (sum X Y) (inl X Y x1) (inl X Y x2) -> eq X x1 x2.