Proof fun X x y z e1 e2 P p => e2 P (e1 P p).
(****************************)
(** * Some data structures  *)
(****************************)
(** ** Option type **)
(** The option type (opt X) : Typ1 (parametrized by X : Typ1) that would be inductively defined in Coq by  Inductive opt [X:Typ1] : Typ1 := | some : X->(opt X) | none : (opt X).  is mimicked by the following definitions: *)
Definition opt (X : Typ1) : Typ1 := (X -> Prop) -> Prop.
Definition some (X : Typ1) (x : X) : opt X := fun f => f x.
Definition none (X : Typ1) : opt X := fun _ => bot.
(** These definitions fulfill the expected properties of injectivity and non-confusion: *)

(* Specifications: *)
Lemma eq_some_some :
forall (X : Typ1) (x1 x2 : X),
eq (opt X) (some X x1) (some X x2) -> eq X x1 x2.