Definition PRED := forall X : Typ1, Rel X -> X -> Prop.Definition Compat (P : PRED) : Prop :=
  forall (X : Typ1) (A : Rel X) (a : X) (Y : Typ1) (B : Rel Y) (b : Y),
  EQV X A a Y B b -> P X A a -> P Y B b.Definition SELECT (X : Typ1) (A : Rel X) (a : X) (P : PRED) : 
  Rel (opt X) :=
  fun z' z : opt X =>
  forall E : Prop,
  (forall x x' : X,
   eq (opt X) z (some X x) -> eq (opt X) z' (some X x') -> A x' x -> E) ->
  (forall x' : X,
   eq (opt X) z' (some X x') ->
   eq (opt X) z (none X) -> A x' a -> P X A x' -> E) -> E.

(* Specifications: *)
Lemma SELECT_in : forall (X : Typ1) (A : Rel X) (a : X) (P : PRED) (x x' : X), A x' x -> SELECT X A a P (some X x') (some X x).
Lemma SELECT_rt : forall (X : Typ1) (A : Rel X) (a : X) (P : PRED) (x' : X), A x' a -> P X A x' -> SELECT X A a P (some X x') (none X).
Lemma SELECT_deloc : forall (X : Typ1) (A : Rel X) (a : X) (P : PRED), deloc X A (opt X) (SELECT X A a P) (some X).
Lemma SELECT_eqv : forall (X : Typ1) (A : Rel X) (a : X) (P : PRED) (x : X), EQV X A x (opt X) (SELECT X A a P) (some X x).
Lemma selection_intro : forall (X : Typ1) (A : Rel X) (a : X) (P : PRED), Compat P -> forall (Y : Typ1) (B : Rel Y) (b : Y), ELT Y B b X A a -> P Y B b -> ELT Y B b (opt X) (SELECT X A a P) (none X).
Lemma selection_elim : forall (X : Typ1) (A : Rel X) (a : X) (P : PRED), Compat P -> forall (Y : Typ1) (B : Rel Y) (b : Y), ELT Y B b (opt X) (SELECT X A a P) (none X) -> and (ELT Y B b X A a) (P Y B b).
Theorem selection : forall (X : Typ1) (A : Rel X) (a : X) (P : PRED), Compat P -> forall (Y : Typ1) (B : Rel Y) (b : Y), iff (ELT Y B b (opt X) (SELECT X A a P) (none X)) (and (ELT Y B b X A a) (P Y B b)).