(** The empty type. **)

Notation void := Empty_set.Definition of_void T (x : void) : T := match x with end.Definition tag := projT1.Definition tagged : forall w, T_(tag w) := @projT2 I [eta T_].Definition Tagged x := @existT I [eta T_] i x.Definition tag2 (w : @sigT2 I T_ U_) := let: existT2 _ _ i _ _ := w in i.Definition tagged2 w : T_(tag2 w) := let: existT2 _ _ _ x _ := w in x.Definition tagged2' w : U_(tag2 w) := let: existT2 _ _ _ _ y := w in y.Definition Tagged2 x y := @existT2 I [eta T_] [eta U_] i x y.Coercion tag_of_tag2 I T_ U_ (w : @sigT2 I T_ U_) :=
  Tagged (fun i => T_ i * U_ i)%type (tagged2 w, tagged2' w).

(* Specifications: *)
Lemma all_tag I T U : (forall x : I, {y : T x & U x y}) -> {f : forall x, T x & forall x, U x (f x)}.
Lemma all_tag2 I T U V : (forall i : I, {y : T i & U i y & V i y}) -> {f : forall i, T i & forall i, U i (f i) & forall i, V i (f i)}.