Built with Alectryon, running Coq+SerAPI v8.10.0+0.7.0. Coq sources are in this panel; goals and messages will appear in the other. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus.
(* -*- coding: utf-8 -*- *)
(************************************************************************)
(* * The Coq Proof Assistant / The Coq Development Team *)
(* v * INRIA, CNRS and contributors - Copyright 1999-2018 *)
(* <O___,, * (see CREDITS file for the list of authors) *)
(* \VV/ **************************************************************)
(* // * This file is distributed under the terms of the *)
(* * GNU Lesser General Public License Version 2.1 *)
(* * (see LICENSE file for the text of the license) *)
(************************************************************************)
(* File Eqdep.v created by Christine Paulin-Mohring in Coq V5.6, May 1992 *)
(* Further documentation and variants of eq_rect_eq by Hugo Herbelin,
Apr 2003 *)
(* Abstraction with respect to the eq_rect_eq axiom and renaming to
EqdepFacts.v by Hugo Herbelin, Mar 2006 *)
This file defines dependent equality and shows its equivalence with
equality on dependent pairs (inhabiting sigma-types). It derives
the consequence of axiomatizing the invariance by substitution of
reflexive equality proofs and shows the equivalence between the 4
following statements
These statements are independent of the calculus of constructions 2.
References:
1 T. Streicher, Semantical Investigations into Intensional Type Theory,
Habilitationsschrift, LMU München, 1993.
2 M. Hofmann, T. Streicher, The groupoid interpretation of type theory,
Proceedings of the meeting Twenty-five years of constructive
type theory, Venice, Oxford University Press, 1998
Table of contents:
1. Definition of dependent equality and equivalence with equality of
dependent pairs and with dependent pair of equalities
2. Eq_rect_eq <-> Eq_dep_eq <-> UIP <-> UIP_refl <-> K
3. Definition of the functor that builds properties of dependent
equalities assuming axiom eq_rect_eq
- Invariance by Substitution of Reflexive Equality Proofs.
- Injectivity of Dependent Equality
- Uniqueness of Identity Proofs
- Uniqueness of Reflexive Identity Proofs
- Streicher's Axiom K
(************************************************************************)
Import EqNotations. (* Set Universe Polymorphism. *) Section Dependent_Equality. Variable U : Type. Variable P : U -> Type.
Dependent equality
Inductive eq_dep (p:U) (x:P p) : forall q:U, P q -> Prop := eq_dep_intro : eq_dep p x p x. Hint Constructors eq_dep: core.Proof eq_dep_intro.U:TypeP:U -> Typeforall (p : U) (x : P p), eq_dep p x p xU:TypeP:U -> Typeforall (p q : U) (x : P p) (y : P q), eq_dep p x q y -> eq_dep q y p xdestruct 1; auto. Qed. Hint Immediate eq_dep_sym: core.U:TypeP:U -> Typeforall (p q : U) (x : P p) (y : P q), eq_dep p x q y -> eq_dep q y p xU:TypeP:U -> Typeforall (p q r : U) (x : P p) (y : P q) (z : P r), eq_dep p x q y -> eq_dep q y r z -> eq_dep p x r zdestruct 1; auto. Qed. Scheme eq_indd := Induction for eq Sort Prop.U:TypeP:U -> Typeforall (p q r : U) (x : P p) (y : P q) (z : P r), eq_dep p x q y -> eq_dep q y r z -> eq_dep p x r z
Equivalent definition of dependent equality as a dependent pair of
equalities
Inductive eq_dep1 (p:U) (x:P p) (q:U) (y:P q) : Prop := eq_dep1_intro : forall h:q = p, x = rew h in y -> eq_dep1 p x q y.U:TypeP:U -> Typeforall (p : U) (x : P p) (q : U) (y : P q), eq_dep1 p x q y -> eq_dep p x q yU:TypeP:U -> Typeforall (p : U) (x : P p) (q : U) (y : P q), eq_dep1 p x q y -> eq_dep p x q yU:TypeP:U -> Typep:Ux:P pq:Uy:P qeq_qp:q = pH:x = rew [P] eq_qp in yeq_dep p x q yU:TypeP:U -> Typeq:Ux, y:P qH:x = rew [P] eq_refl in yeq_dep q x q yapply eq_dep_intro. Qed.U:TypeP:U -> Typeq:Ux, y:P qH:x = rew [P] eq_refl in yeq_dep q (rew [P] eq_refl in y) q yU:TypeP:U -> Typeforall (p q : U) (x : P p) (y : P q), eq_dep p x q y -> eq_dep1 p x q yU:TypeP:U -> Typeforall (p q : U) (x : P p) (y : P q), eq_dep p x q y -> eq_dep1 p x q yU:TypeP:U -> Typep:Ux:P peq_dep1 p x p xsimpl; trivial. Qed. End Dependent_Equality. Arguments eq_dep [U P] p x q _. Arguments eq_dep1 [U P] p x q y.U:TypeP:U -> Typep:Ux:P px = rew [P] eq_refl in x
Dependent equality is equivalent to equality on dependent pairs
forall (U : Type) (P : U -> Type) (p q : U) (x : P p) (y : P q), existT P p x = existT P q y -> eq_dep p x q yforall (U : Type) (P : U -> Type) (p q : U) (x : P p) (y : P q), existT P p x = existT P q y -> eq_dep p x q yU:TypeP:U -> Typep, q:Ux:P py:P qH:existT P p x = existT P q yeq_dep p x q yapply eq_dep_intro. Qed.U:TypeP:U -> Typep, q:Ux:P py:P qH:existT P p x = existT P q yeq_dep q y q yforall (U : Type) (P : U -> Type) (p q : U) (x : P p) (y : P q), eq_dep p x q y -> existT P p x = existT P q ydestruct 1; reflexivity. Qed.forall (U : Type) (P : U -> Type) (p q : U) (x : P p) (y : P q), eq_dep p x q y -> existT P p x = existT P q yforall (U : Type) (P : U -> Type) (p q : U) (x : P p) (y : P q), existT P p x = existT P q y <-> eq_dep p x q ysplit; auto using eq_sigT_eq_dep, eq_dep_eq_sigT. Qed. Notation equiv_eqex_eqdep := eq_sigT_iff_eq_dep (only parsing). (* Compat *)forall (U : Type) (P : U -> Type) (p q : U) (x : P p) (y : P q), existT P p x = existT P q y <-> eq_dep p x q yforall (U : Type) (P : U -> Prop) (p q : U) (x : P p) (y : P q), exist P p x = exist P q y -> eq_dep p x q yforall (U : Type) (P : U -> Prop) (p q : U) (x : P p) (y : P q), exist P p x = exist P q y -> eq_dep p x q yU:TypeP:U -> Propp, q:Ux:P py:P qH:exist P p x = exist P q yeq_dep p x q yapply eq_dep_intro. Qed.U:TypeP:U -> Propp, q:Ux:P py:P qH:exist P p x = exist P q yeq_dep q y q yforall (U : Type) (P : U -> Prop) (p q : U) (x : P p) (y : P q), eq_dep p x q y -> exist P p x = exist P q ydestruct 1; reflexivity. Qed.forall (U : Type) (P : U -> Prop) (p q : U) (x : P p) (y : P q), eq_dep p x q y -> exist P p x = exist P q yforall (U : Type) (P : U -> Prop) (p q : U) (x : P p) (y : P q), exist P p x = exist P q y <-> eq_dep p x q ysplit; auto using eq_sig_eq_dep, eq_dep_eq_sig. Qed.forall (U : Type) (P : U -> Prop) (p q : U) (x : P p) (y : P q), exist P p x = exist P q y <-> eq_dep p x q y
Dependent equality is equivalent to a dependent pair of equalities
Set Implicit Arguments.forall (X : Type) (P : X -> Type) (x1 x2 : X) (H1 : P x1) (H2 : P x2), existT P x1 H1 = existT P x2 H2 <-> {H : x1 = x2 | rew [P] H in H1 = H2}forall (X : Type) (P : X -> Type) (x1 x2 : X) (H1 : P x1) (H2 : P x2), existT P x1 H1 = existT P x2 H2 <-> {H : x1 = x2 | rew [P] H in H1 = H2}X:TypeP:X -> Typex1, x2:XH1:P x1H2:P x2H:existT P x1 H1 = existT P x2 H2{H0 : x1 = x2 | rew [P] H0 in H1 = H2}X:TypeP:X -> Typex1, x2:XH1:P x1H2:P x2H:{H0 : x1 = x2 | rew [P] H0 in H1 = H2}existT P x1 H1 = existT P x2 H2X:TypeP:X -> Typex1, x2:XH1:P x1H2:P x2H:existT P x1 H1 = existT P x2 H2{H0 : x1 = x2 | rew [P] H0 in H1 = H2}X:TypeP:X -> Typex1, x2:XH1:P x1H2:P x2H:existT P x1 H1 = existT P x2 H2{H0 : x1 = projT1 (existT P x2 H2) | rew [P] H0 in H1 = H2}X:TypeP:X -> Typex1, x2:XH1:P x1H2:P x2H:existT P x1 H1 = existT P x2 H2{H0 : x1 = projT1 (existT P x2 H2) | rew [P] H0 in H1 = projT2 (existT P x2 H2)}X:TypeP:X -> Typex1, x2:XH1:P x1H2:P x2{H : x1 = projT1 (existT P x1 H1) | rew [P] H in H1 = projT2 (existT P x1 H1)}X:TypeP:X -> Typex1, x2:XH1:P x1H2:P x2{H : x1 = x1 | rew [P] H in H1 = H1}reflexivity.X:TypeP:X -> Typex1, x2:XH1:P x1H2:P x2rew [P] eq_refl in H1 = H1X:TypeP:X -> Typex1, x2:XH1:P x1H2:P x2H:{H0 : x1 = x2 | rew [P] H0 in H1 = H2}existT P x1 H1 = existT P x2 H2reflexivity. Defined.X:TypeP:X -> Typex2:XH1:P x2existT P x2 H1 = existT P x2 (rew [P] eq_refl in H1)forall (X : Type) (P : X -> Type) (x1 x2 : X) (H1 : P x1) (H2 : P x2), existT P x1 H1 = existT P x2 H2 -> x1 = x2forall (X : Type) (P : X -> Type) (x1 x2 : X) (H1 : P x1) (H2 : P x2), existT P x1 H1 = existT P x2 H2 -> x1 = x2X:TypeP:X -> Typex1, x2:XH1:P x1H2:P x2H:existT P x1 H1 = existT P x2 H2x1 = x2X:TypeP:X -> Typex1, x2:XH1:P x1H2:P x2H:existT P x1 H1 = existT P x2 H2x1 = projT1 (existT P x2 H2)reflexivity. Defined.X:TypeP:X -> Typex1, x2:XH1:P x1H2:P x2x1 = projT1 (existT P x1 H1)forall (X : Type) (P : X -> Type) (x1 x2 : X) (H1 : P x1) (H2 : P x2) (H : existT P x1 H1 = existT P x2 H2), rew [P] eq_sigT_fst H in H1 = H2forall (X : Type) (P : X -> Type) (x1 x2 : X) (H1 : P x1) (H2 : P x2) (H : existT P x1 H1 = existT P x2 H2), rew [P] eq_sigT_fst H in H1 = H2X:TypeP:X -> Typex1, x2:XH1:P x1H2:P x2H:existT P x1 H1 = existT P x2 H2rew [P] eq_sigT_fst H in H1 = H2X:TypeP:X -> Typex1, x2:XH1:P x1H2:P x2H:existT P x1 H1 = existT P x2 H2rew [P] match H in (_ = y) return (x1 = projT1 y) with | eq_refl => eq_refl end in H1 = H2X:TypeP:X -> Typex1, x2:XH1:P x1H2:P x2H:existT P x1 H1 = existT P x2 H2rew [P] match H in (_ = y) return (x1 = projT1 y) with | eq_refl => eq_refl end in H1 = H2X:TypeP:X -> Typex1, x2:XH1:P x1H2:P x2H:existT P x1 H1 = existT P x2 H2rew [P] match H in (_ = y) return (x1 = projT1 y) with | eq_refl => eq_refl end in H1 = projT2 (existT P x2 H2)reflexivity. Defined.X:TypeP:X -> Typex1, x2:XH1:P x1H2:P x2rew [P] eq_refl in H1 = projT2 (existT P x1 H1)forall (X : Type) (P : X -> Prop) (x1 x2 : X) (H1 : P x1) (H2 : P x2), exist P x1 H1 = exist P x2 H2 -> x1 = x2forall (X : Type) (P : X -> Prop) (x1 x2 : X) (H1 : P x1) (H2 : P x2), exist P x1 H1 = exist P x2 H2 -> x1 = x2X:TypeP:X -> Propx1, x2:XH1:P x1H2:P x2H:exist P x1 H1 = exist P x2 H2x1 = x2X:TypeP:X -> Propx1, x2:XH1:P x1H2:P x2H:exist P x1 H1 = exist P x2 H2x1 = proj1_sig (exist P x2 H2)reflexivity. Defined.X:TypeP:X -> Propx1, x2:XH1:P x1H2:P x2x1 = proj1_sig (exist P x1 H1)forall (X : Type) (P : X -> Prop) (x1 x2 : X) (H1 : P x1) (H2 : P x2) (H : exist P x1 H1 = exist P x2 H2), rew [P] eq_sig_fst H in H1 = H2forall (X : Type) (P : X -> Prop) (x1 x2 : X) (H1 : P x1) (H2 : P x2) (H : exist P x1 H1 = exist P x2 H2), rew [P] eq_sig_fst H in H1 = H2X:TypeP:X -> Propx1, x2:XH1:P x1H2:P x2H:exist P x1 H1 = exist P x2 H2rew [P] eq_sig_fst H in H1 = H2X:TypeP:X -> Propx1, x2:XH1:P x1H2:P x2H:exist P x1 H1 = exist P x2 H2rew [P] match H in (_ = y) return (x1 = proj1_sig y) with | eq_refl => eq_refl end in H1 = H2X:TypeP:X -> Propx1, x2:XH1:P x1H2:P x2H:exist P x1 H1 = exist P x2 H2rew [P] match H in (_ = y) return (x1 = proj1_sig y) with | eq_refl => eq_refl end in H1 = H2X:TypeP:X -> Propx1, x2:XH1:P x1H2:P x2H:exist P x1 H1 = exist P x2 H2rew [P] match H in (_ = y) return (x1 = proj1_sig y) with | eq_refl => eq_refl end in H1 = proj2_sig (exist P x2 H2)reflexivity. Defined. Unset Implicit Arguments.X:TypeP:X -> Propx1, x2:XH1:P x1H2:P x2rew [P] eq_refl in H1 = proj2_sig (exist P x1 H1)
Exported hints
Hint Resolve eq_dep_intro: core. Hint Immediate eq_dep_sym: core. (************************************************************************)
Section Equivalences. Variable U:Type.
Invariance by Substitution of Reflexive Equality Proofs
Definition Eq_rect_eq_on (p : U) (Q : U -> Type) (x : Q p) := forall (h : p = p), x = eq_rect p Q x p h. Definition Eq_rect_eq := forall p Q x, Eq_rect_eq_on p Q x.
Injectivity of Dependent Equality
Definition Eq_dep_eq_on (P : U -> Type) (p : U) (x : P p) := forall (y : P p), eq_dep p x p y -> x = y. Definition Eq_dep_eq := forall P p x, Eq_dep_eq_on P p x.
Uniqueness of Identity Proofs (UIP)
Definition UIP_on_ (x y : U) (p1 : x = y) := forall (p2 : x = y), p1 = p2. Definition UIP_ := forall x y p1, UIP_on_ x y p1.
Uniqueness of Reflexive Identity Proofs
Definition UIP_refl_on_ (x : U) := forall (p : x = x), p = eq_refl x. Definition UIP_refl_ := forall x, UIP_refl_on_ x.
Streicher's axiom K
Definition Streicher_K_on_ (x : U) (P : x = x -> Prop) := P (eq_refl x) -> forall p : x = x, P p. Definition Streicher_K_ := forall x P, Streicher_K_on_ x P.
Injectivity of Dependent Equality is a consequence of
Invariance by Substitution of Reflexive Equality Proof
U:Typep:UP:U -> Typey:P pEq_rect_eq_on p P y -> forall x : P p, eq_dep1 p x p y -> x = yU:Typep:UP:U -> Typey:P pEq_rect_eq_on p P y -> forall x : P p, eq_dep1 p x p y -> x = yU:Typep:UP:U -> Typey:P peq_rect_eq:Eq_rect_eq_on p P yforall x : P p, eq_dep1 p x p y -> x = yrewrite <- eq_rect_eq; auto. Qed.U:Typep:UP:U -> Typey:P peq_rect_eq:Eq_rect_eq_on p P yx:P pH:eq_dep1 p x p yh:p = px = rew [P] h in y -> x = yProof (fun eq_rect_eq P p y x => @eq_rect_eq_on__eq_dep1_eq_on p P x (eq_rect_eq p P x) y).U:TypeEq_rect_eq -> forall (P : U -> Type) (p : U) (x y : P p), eq_dep1 p x p y -> x = yU:Typep:UP:U -> Typex:P pEq_rect_eq_on p P x -> Eq_dep_eq_on P p xU:Typep:UP:U -> Typex:P pEq_rect_eq_on p P x -> Eq_dep_eq_on P p xU:Typep:UP:U -> Typex:P peq_rect_eq:Eq_rect_eq_on p P xy:P pH:eq_dep p x p yx = yapply eq_dep_sym in H; apply eq_dep_dep1; trivial. Qed.U:Typep:UP:U -> Typex:P peq_rect_eq:Eq_rect_eq_on p P xy:P pH:eq_dep p x p yeq_dep1 p y p xProof (fun eq_rect_eq P p x y => @eq_rect_eq_on__eq_dep_eq_on p P x (eq_rect_eq p P x) y).U:TypeEq_rect_eq -> Eq_dep_eq
Uniqueness of Identity Proofs (UIP) is a consequence of
Injectivity of Dependent Equality
U:Typex, y:Up1:x = yEq_dep_eq_on (fun y0 : U => x = y0) x eq_refl -> UIP_on_ x y p1U:Typex, y:Up1:x = yEq_dep_eq_on (fun y0 : U => x = y0) x eq_refl -> UIP_on_ x y p1U:Typex, y:Up1:x = yeq_dep_eq:Eq_dep_eq_on (fun y0 : U => x = y0) x eq_reflforall p2 : x = y, p1 = p2U:Typex, y:Up1:x = yeq_dep_eq:Eq_dep_eq_on (fun y0 : U => x = y0) x eq_reflforall p2 : x = x, eq_refl = p2U:Typex, y:Up1:x = yeq_dep_eq:Eq_dep_eq_on (fun y0 : U => x = y0) x eq_reflp2:x = xeq_dep x eq_refl x p2apply eq_dep_intro. Qed.U:Typex, y:Up1:x = yeq_dep_eq:Eq_dep_eq_on (fun y0 : U => x = y0) x eq_reflp2:x = xeq_dep x eq_refl x eq_reflProof (fun eq_dep_eq x y p1 => @eq_dep_eq_on__UIP_on x y p1 (eq_dep_eq _ _ _)).U:TypeEq_dep_eq -> UIP_
Uniqueness of Reflexive Identity Proofs is a direct instance of UIP
U:Typex:UUIP_on_ x x eq_refl -> UIP_refl_on_ xintro UIP; red; intros; symmetry; apply UIP. Qed.U:Typex:UUIP_on_ x x eq_refl -> UIP_refl_on_ xProof (fun UIP x p => @UIP_on__UIP_refl_on x (UIP x x eq_refl) p).U:TypeUIP_ -> UIP_refl_
Streicher's axiom K is a direct consequence of Uniqueness of
Reflexive Identity Proofs
U:Typex:UP:x = x -> PropUIP_refl_on_ x -> Streicher_K_on_ x Pintro UIP_refl; red; intros; rewrite UIP_refl; assumption. Qed.U:Typex:UP:x = x -> PropUIP_refl_on_ x -> Streicher_K_on_ x PProof (fun UIP_refl x P => @UIP_refl_on__Streicher_K_on x P (UIP_refl x)).U:TypeUIP_refl_ -> Streicher_K_
We finally recover from K the Invariance by Substitution of
Reflexive Equality Proofs
U:Typep:UP:U -> Typex:P pStreicher_K_on_ p (fun h : p = p => x = rew [P] h in x) -> Eq_rect_eq_on p P xU:Typep:UP:U -> Typex:P pStreicher_K_on_ p (fun h : p = p => x = rew [P] h in x) -> Eq_rect_eq_on p P xU:Typep:UP:U -> Typex:P pStreicher_K:Streicher_K_on_ p (fun h0 : p = p => x = rew [P] h0 in x)h:p = px = rew [P] h in xreflexivity. Qed.U:Typep:UP:U -> Typex:P pStreicher_K:Streicher_K_on_ p (fun h0 : p = p => x = rew [P] h0 in x)h:p = px = rew [P] eq_refl in xProof (fun Streicher_K p P x => @Streicher_K_on__eq_rect_eq_on p P x (Streicher_K p _)).U:TypeStreicher_K_ -> Eq_rect_eq
Remark: It is reasonable to think that eq_rect_eq is strictly
stronger than eq_rec_eq (which is eq_rect_eq restricted on Set):
Definition Eq_rec_eq :=
∀ (P:U → Set) (p:U) (x:P p) (h:p = p), x = eq_rec p P x p h.
Typically, eq_rect_eq allows proving UIP and Streicher's K what
does not seem possible with eq_rec_eq. In particular, the proof of UIP
requires to use eq_rect_eq on fun y → x=y which is in Type but not
in Set.
End Equivalences.
UIP_refl is downward closed (a short proof of the key lemma of Voevodsky's
proof of inclusion of h-level n into h-level n+1; see hlevelntosn
in https://github.com/vladimirias/Foundations.git).
X:Typex:XUIP_refl_on_ X x -> forall y : x = x, UIP_refl_on_ (x = x) yX:Typex:XUIP_refl_on_ X x -> forall y : x = x, UIP_refl_on_ (x = x) yX:Typex:XUIP_refl:UIP_refl_on_ X xy:x = xUIP_refl_on_ (x = x) yX:Typex:XUIP_refl:UIP_refl_on_ X xy:x = xUIP_refl_on_ (x = x) eq_reflX:Typex:XUIP_refl:UIP_refl_on_ X xy:x = xz:eq_refl = eq_reflz = eq_reflX:Typex:XUIP_refl:UIP_refl_on_ X xy:x = xz:eq_refl = eq_reflforall y' y'' : x = x, y' = y''X:Typex:XUIP_refl:UIP_refl_on_ X xy:x = xz:eq_refl = eq_reflUIP:forall y' y'' : x = x, y' = y''z = eq_reflX:Typex:XUIP_refl:UIP_refl_on_ X xy:x = xz:eq_refl = eq_reflforall y' y'' : x = x, y' = y''apply eq_trans_r with (eq_refl x); apply UIP_refl.X:Typex:XUIP_refl:UIP_refl_on_ X xy:x = xz:eq_refl = eq_refly', y'':x = xy' = y''X:Typex:XUIP_refl:UIP_refl_on_ X xy:x = xz:eq_refl = eq_reflUIP:forall y' y'' : x = x, y' = y''z = eq_reflX:Typex:XUIP_refl:UIP_refl_on_ X xy:x = xz:eq_refl = eq_reflUIP:forall y' y'' : x = x, y' = y''z = eq_trans (eq_trans (UIP eq_refl eq_refl) z) (eq_sym (UIP eq_refl eq_refl))X:Typex:XUIP_refl:UIP_refl_on_ X xy:x = xz:eq_refl = eq_reflUIP:forall y' y'' : x = x, y' = y''eq_trans (eq_trans (UIP eq_refl eq_refl) z) (eq_sym (UIP eq_refl eq_refl)) = eq_reflX:Typex:XUIP_refl:UIP_refl_on_ X xy:x = xz:eq_refl = eq_reflUIP:forall y' y'' : x = x, y' = y''z = eq_trans (eq_trans (UIP eq_refl eq_refl) z) (eq_sym (UIP eq_refl eq_refl))X:Typex:XUIP_refl:UIP_refl_on_ X xy:x = xUIP:forall y' y'' : x = x, y' = y''eq_refl = eq_trans (eq_trans (UIP eq_refl eq_refl) eq_refl) (eq_sym (UIP eq_refl eq_refl))reflexivity.X:Typex:XUIP_refl:UIP_refl_on_ X xy:x = xUIP:forall y' y'' : x = x, y' = y''eq_refl = eq_trans (eq_trans eq_refl eq_refl) (eq_sym eq_refl)X:Typex:XUIP_refl:UIP_refl_on_ X xy:x = xz:eq_refl = eq_reflUIP:forall y' y'' : x = x, y' = y''eq_trans (eq_trans (UIP eq_refl eq_refl) z) (eq_sym (UIP eq_refl eq_refl)) = eq_reflX:Typex:XUIP_refl:UIP_refl_on_ X xy:x = xz:eq_refl = eq_reflUIP:forall y' y'' : x = x, y' = y''match eq_refl as y' in (_ = x') return (y' = y' -> Prop) with | eq_refl => fun z0 : eq_refl = eq_refl => z0 = eq_refl end (eq_trans (eq_trans (UIP eq_refl eq_refl) z) (eq_sym (UIP eq_refl eq_refl)))X:Typex:XUIP_refl:UIP_refl_on_ X xy:x = xUIP:forall y' y'' : x = x, y' = y''eq_trans (eq_trans (UIP eq_refl eq_refl) eq_refl) (eq_sym (UIP eq_refl eq_refl)) = eq_reflreflexivity. Qed.X:Typex:XUIP_refl:UIP_refl_on_ X xy:x = xUIP:forall y' y'' : x = x, y' = y''eq_trans (eq_trans eq_refl eq_refl) (eq_sym eq_refl) = eq_reflProof (fun U UIP_refl x => @UIP_shift_on U x (UIP_refl x)). Section Corollaries. Variable U:Type.forall U : Type, UIP_refl_ U -> forall x : U, UIP_refl_ (x = x)
UIP implies the injectivity of equality on dependent pairs in Type
Definition Inj_dep_pair_on (P : U -> Type) (p : U) (x : P p) := forall (y : P p), existT P p x = existT P p y -> x = y. Definition Inj_dep_pair := forall P p x, Inj_dep_pair_on P p x.U:TypeP:U -> Typep:Ux:P pEq_dep_eq_on U P p x -> Inj_dep_pair_on P p xU:TypeP:U -> Typep:Ux:P pEq_dep_eq_on U P p x -> Inj_dep_pair_on P p xU:TypeP:U -> Typep:Ux:P peq_dep_eq:Eq_dep_eq_on U P p xy:P pH:existT P p x = existT P p yx = yU:TypeP:U -> Typep:Ux:P peq_dep_eq:Eq_dep_eq_on U P p xy:P pH:existT P p x = existT P p yeq_dep p x p yassumption. Qed.U:TypeP:U -> Typep:Ux:P peq_dep_eq:Eq_dep_eq_on U P p xy:P pH:existT P p x = existT P p yexistT P p x = existT P p yProof (fun eq_dep_eq P p x => @eq_dep_eq_on__inj_pair2_on P p x (eq_dep_eq P p x)). End Corollaries. Notation Inj_dep_pairS := Inj_dep_pair. Notation Inj_dep_pairT := Inj_dep_pair. Notation eq_dep_eq__inj_pairT2 := eq_dep_eq__inj_pair2. (************************************************************************)U:TypeEq_dep_eq U -> Inj_dep_pair
Module Type EqdepElimination. Axiom eq_rect_eq : forall (U:Type) (p:U) (Q:U -> Type) (x:Q p) (h:p = p), x = eq_rect p Q x p h. End EqdepElimination. Module EqdepTheory (M:EqdepElimination). Section Axioms. Variable U:Type.
Invariance by Substitution of Reflexive Equality Proofs
Proof M.eq_rect_eq U.U:Typeforall (p : U) (Q : U -> Type) (x : Q p) (h : p = p), x = rew [Q] h in xProof (fun p Q => M.eq_rect_eq U p Q).U:Typeforall (p : U) (Q : U -> Set) (x : Q p) (h : p = p), x = eq_rec p Q x p h
Injectivity of Dependent Equality
Proof (eq_rect_eq__eq_dep_eq U eq_rect_eq).U:Typeforall (P : U -> Type) (p : U) (x y : P p), eq_dep p x p y -> x = y
Uniqueness of Identity Proofs (UIP) is a consequence of
Injectivity of Dependent Equality
Proof (eq_dep_eq__UIP U eq_dep_eq).U:Typeforall (x y : U) (p1 p2 : x = y), p1 = p2
Uniqueness of Reflexive Identity Proofs is a direct instance of UIP
Proof (UIP__UIP_refl U UIP).U:Typeforall (x : U) (p : x = x), p = eq_refl
Streicher's axiom K is a direct consequence of Uniqueness of
Reflexive Identity Proofs
Proof (UIP_refl__Streicher_K U UIP_refl). End Axioms.U:Typeforall (x : U) (P : x = x -> Prop), P eq_refl -> forall p : x = x, P p
UIP implies the injectivity of equality on dependent pairs in Type
Proof (fun U => eq_dep_eq__inj_pair2 U (eq_dep_eq U)). Notation inj_pairT2 := inj_pair2. End EqdepTheory.forall (U : Type) (P : U -> Type) (p : U) (x y : P p), existT P p x = existT P p y -> x = y
Basic facts about eq_dep
forall (U : Type) (P R : U -> Type) (p q : U) (x : P p) (y : P q) (f : forall p0 : U, P p0 -> R p0), eq_dep p x q y -> eq_dep p (f p x) q (f q y)forall (U : Type) (P R : U -> Type) (p q : U) (x : P p) (y : P q) (f : forall p0 : U, P p0 -> R p0), eq_dep p x q y -> eq_dep p (f p x) q (f q y)reflexivity. Qed.U:TypeP, R:U -> Typep, q:Ux:P py:P qf:forall p0 : U, P p0 -> R p0eq_dep p (f p x) p (f p x)forall (U P : Type) (p q : U) (x y : P), eq_dep p x q y -> x = yforall (U P : Type) (p q : U) (x y : P), eq_dep p x q y -> x = yreflexivity. Qed.U, P:Typep, q:Ux, y:Px = xforall (U : Type) (P : U -> Type) (R : Type) (p q : U) (x : P p) (y : P q) (f : forall p0 : U, P p0 -> R), eq_dep p x q y -> f p x = f q yforall (U : Type) (P : U -> Type) (R : Type) (p q : U) (x : P p) (y : P q) (f : forall p0 : U, P p0 -> R), eq_dep p x q y -> f p x = f q yreflexivity. Qed. Arguments eq_dep U P p x q _ : clear implicits. Arguments eq_dep1 U P p x q y : clear implicits.U:TypeP:U -> TypeR:Typep, q:Ux:P py:P qf:forall p0 : U, P p0 -> Rf p x = f p x