Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Types.Forall Types.Sigma Types.Prod Types.WType.(** In this file we define indexed W-types. We show that indexed W-types can be reduced to W-types whilst still having definitional computation rules. We also characterize the path space of indexed W-types. This allows us to derive sufficient conditions for an indexed W-type to be truncated. *)(** This is mostly adapted from Jasper Hugunin's formalization in Coq: https://github.com/jashug/IWTypes *)(** On a more meta-theoretic note, this partly justifies the use of indexed inductive types in Coq with respect to homotopy type theory. *)InductiveIW
(I : Type) (** The indexing type *)
(A : Type) (** The type of labels / constructors / data *)
(B : A -> Type) (** The the type of arities / arguments / children *)
(i : A -> I) (** The index map (for labels) *)
(j : forallx, B x -> I) (** The index map for arguments *)
: I -> Type :=
| iw_sup (x : A)
: (forall (y : B x), IW I A B i j (j x y)) -> IW I A B i j (i x).Definitioniw_label {ABIij} {l : I} (w : IW I A B i j l) : A :=
match w with
| iw_sup x y => x
end.Definitioniw_arity {ABIij} (l : I) (w : IW I A B i j l)
: forall (y : B (iw_label w)), IW I A B i j (j (iw_label w) y) :=
match w with
| iw_sup x y => y
end.
A: Type B: A -> Type I: Type i: A -> I j: forallx : A, B x -> I l: I w: IW I A B i j l
i (iw_label w) = l
A: Type B: A -> Type I: Type i: A -> I j: forallx : A, B x -> I l: I w: IW I A B i j l
i (iw_label w) = l
bydestruct w.Defined.
A: Type B: A -> Type I: Type i: A -> I j: forallx : A, B x -> I l: I w: IW I A B i j l
transport (IW I A B i j) (path_index_iw_label l w)
(iw_sup I A B i j (iw_label w) (iw_arity l w)) = w
A: Type B: A -> Type I: Type i: A -> I j: forallx : A, B x -> I l: I w: IW I A B i j l
transport (IW I A B i j) (path_index_iw_label l w)
(iw_sup I A B i j (iw_label w) (iw_arity l w)) = w
bydestruct w.Defined.(** We have a canonical map from the IW-type to the fiber of the index map *)
A: Type B: A -> Type I: Type i: A -> I j: forallx : A, B x -> I l: I
IW I A B i j l -> hfiber i l
A: Type B: A -> Type I: Type i: A -> I j: forallx : A, B x -> I l: I
IW I A B i j l -> hfiber i l
A: Type B: A -> Type I: Type i: A -> I j: forallx : A, B x -> I l: I w: IW I A B i j l
hfiber i l
A: Type B: A -> Type I: Type i: A -> I j: forallx : A, B x -> I l: I w: IW I A B i j l
i (iw_label w) = l
apply path_index_iw_label.Defined.
H: Funext A: Type B: A -> Type a: forallx : A, B x P: forallb : forallx : A, B x, a == b -> Type f: P a (funx : A => 1) b: forallx : A, B x p: a == b
P b p
H: Funext A: Type B: A -> Type a: forallx : A, B x P: forallb : forallx : A, B x, a == b -> Type f: P a (funx : A => 1) b: forallx : A, B x p: a == b
P b p
H: Funext A: Type B: A -> Type a: forallx : A, B x P: forallb : forallx : A, B x, a == b -> Type f: P a (funx : A => 1) b: forallx : A, B x p: a == b
forallx : a = b, P b (apD10 x)
H: Funext A: Type B: A -> Type a: forallx : A, B x P: forallb : forallx : A, B x, a == b -> Type f: P a (funx : A => 1) b: forallx : A, B x p: a == b
P a (apD10 1)
exact f.Defined.(** * Reduction of indexed W-types to W-types *)(** Jasper Hugunin found this construction (typecheck un-indexed trees) in "Indexed Containers by Thorsten Altenkirch and Peter Morris". http://www.cs.nott.ac.uk/~psztxa/publ/ICont.pdfThis references the following: * M. Abbott, T. Altenkirch, and N. Ghani. Containers - constructing strictly positive types. Theoretical Computer Science, 342:327, September 2005. Applied Semantics: Selected Topics. * N. Gambino and M. Hyland. Well-founded trees and dependent polynomial functors. In S. Berardi, M. Coppo, and F. Damiani, editors, types for Proofs and Programs (TYPES 2003), Lecture Notes in Computer Science, 2004as previous examples of the technique. *)SectionReduction.Context (I : Type) (A : Type) (B : A -> Type)
(i : A -> I) (j : forallx, B x -> I).FixpointIsIndexedBy (x : I) (w : W A B) : Type :=
match w with
| w_sup a b => (i a = x) * (forallc, IsIndexedBy (j a c) (b c))
end.DefinitionIW' (x : I) := sig (IsIndexedBy x).Definitioniw_sup' (x : A) (y : forallz : B x, IW' (j x z)) : IW' (i x)
:= (w_sup A B x (funa => pr1 (y a)); (idpath, (funa => pr2 (y a)))).(** We can derive the induction principle for IW-types *)
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I P: foralli : I, IW' i -> Type S: forall (x : A)
(y : forallx0 : B x, IW' (j x x0)),
(forallc : B x, P (j x c) (y c)) ->
P (i x) (iw_sup' x y)
forall (x : I) (w : IW' x), P x w
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I P: foralli : I, IW' i -> Type S: forall (x : A)
(y : forallx0 : B x, IW' (j x x0)),
(forallc : B x, P (j x c) (y c)) ->
P (i x) (iw_sup' x y)
forall (x : I) (w : IW' x), P x w
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I P: foralli : I, IW' i -> Type S: forall (x : A)
(y : forallx0 : B x, IW' (j x x0)),
(forallc : B x, P (j x c) (y c)) ->
P (i x) (iw_sup' x y) x: I w: W A B r: IsIndexedBy x w
P x (w; r)
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I P: foralli : I, IW' i -> Type S: forall (x : A)
(y : forallx0 : B x, IW' (j x x0)),
(forallc : B x, P (j x c) (y c)) ->
P (i x) (iw_sup' x y)
forall (w : W A B) (x : I) (r : IsIndexedBy x w),
P x (w; r)
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I P: foralli : I, IW' i -> Type S: forall (x : A)
(y : forallx0 : B x, IW' (j x x0)),
(forallc : B x, P (j x c) (y c)) ->
P (i x) (iw_sup' x y) a: A b: B a -> W A B k: forall (b0 : B a) (x : I)
(r : IsIndexedBy x (b b0)), P x (b b0; r)
forall (x : I) (r : IsIndexedBy x (w_sup A B a b)),
P x (w_sup A B a b; r)
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I P: foralli : I, IW' i -> Type S: forall (x : A)
(y : forallx0 : B x, IW' (j x x0)),
(forallc : B x, P (j x c) (y c)) ->
P (i x) (iw_sup' x y) a: A b: B a -> W A B k: forall (b0 : B a) (x : I)
(r : IsIndexedBy x (b b0)), P x (b b0; r) x: I p: i a = x IH: forallc : B a, IsIndexedBy (j a c) (b c)
P x (w_sup A B a b; (p, IH))
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I P: foralli : I, IW' i -> Type S: forall (x : A)
(y : forallx0 : B x, IW' (j x x0)),
(forallc : B x, P (j x c) (y c)) ->
P (i x) (iw_sup' x y) a: A b: B a -> W A B k: forall (b0 : B a) (x : I)
(r : IsIndexedBy x (b b0)), P x (b b0; r) IH: forallc : B a, IsIndexedBy (j a c) (b c)
P (i a) (w_sup A B a b; (1, IH))
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I P: foralli : I, IW' i -> Type S: forall (x : A)
(y : forallx0 : B x, IW' (j x x0)),
(forallc : B x, P (j x c) (y c)) ->
P (i x) (iw_sup' x y) a: A b: B a -> W A B k: forall (b0 : B a) (x : I)
(r : IsIndexedBy x (b b0)), P x (b b0; r) IH: forallc : B a, IsIndexedBy (j a c) (b c)
forallc : B a, P (j a c) (b c; IH c)
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I P: foralli : I, IW' i -> Type S: forall (x : A)
(y : forallx0 : B x, IW' (j x x0)),
(forallc : B x, P (j x c) (y c)) ->
P (i x) (iw_sup' x y) a: A b: B a -> W A B k: forall (b0 : B a) (x : I)
(r : IsIndexedBy x (b b0)), P x (b b0; r) IH: forallc : B a, IsIndexedBy (j a c) (b c) c: B a
P (j a c) (b c; IH c)
apply k.Defined.(** We have definitional computation rules for this eliminator. *)DefinitionIW'_ind_beta_iw_sup' (P : foralli, IW' i -> Type)
(S : forallxy, (forallc, P _ (y c)) -> P _ (iw_sup' x y)) xy
: IW'_ind P S _ (iw_sup' x y) = S x y (func => IW'_ind P S _ (y c))
:= idpath.(** Showing that IW-types are equivalent to W-types requires funext. *)
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
IW' x <~> IW I A B i j x
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
IW' x <~> IW I A B i j x
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
IW' x -> IW I A B i j x
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
IW I A B i j x -> IW' x
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
?f o ?g == idmap
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
?g o ?f == idmap
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
IW' x -> IW I A B i j x
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
forallx : A,
(forallx0 : B x, IW' (j x x0)) ->
(forallc : B x, IW I A B i j (j x c)) ->
IW I A B i j (i x)
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I a: A b: forallx0 : B a, IW' (j a x0) c: forallc : B a, IW I A B i j (j a c)
IW I A B i j (i a)
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I a: A b: forallx0 : B a, IW' (j a x0) c: forallc : B a, IW I A B i j (j a c)
forally : B a, IW I A B i j (j a y)
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I a: A b: forallx0 : B a, IW' (j a x0) c: forallc : B a, IW I A B i j (j a c) y: B a
IW I A B i j (j a y)
apply c.
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
IW I A B i j x -> IW' x
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
IW'_ind (fun (l : I) (_ : IW' l) => IW I A B i j l)
(fun (a : A) (_ : forallx0 : B a, IW' (j a x0))
(c : forallc : B a, IW I A B i j (j a c)) =>
iw_sup I A B i j a (funy : B a => c y)) x o ?g ==
idmap
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
?g
o IW'_ind (fun (l : I) (_ : IW' l) => IW I A B i j l)
(fun (a : A) (_ : forallx0 : B a, IW' (j a x0))
(c : forallc : B a, IW I A B i j (j a c)) =>
iw_sup I A B i j a (funy : B a => c y)) x ==
idmap
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
IW I A B i j x -> IW' x
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
forallx : A,
(forally : B x, IW I A B i j (j x y)) ->
(forally : B x, IW' (j x y)) -> IW' (i x)
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I a: A b: forally : B a, IW I A B i j (j a y) c: forally : B a, IW' (j a y)
IW' (i a)
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I a: A b: forally : B a, IW I A B i j (j a y) c: forally : B a, IW' (j a y)
forallz : B a, IW' (j a z)
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I a: A b: forally : B a, IW I A B i j (j a y) c: forally : B a, IW' (j a y) y: B a
IW' (j a y)
apply c.
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
IW'_ind (fun (l : I) (_ : IW' l) => IW I A B i j l)
(fun (a : A) (_ : forallx0 : B a, IW' (j a x0))
(c : forallc : B a, IW I A B i j (j a c)) =>
iw_sup I A B i j a (funy : B a => c y)) x
o IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally : B a, IW I A B i j (j a y))
(c : forally : B a, IW' (j a y)) =>
iw_sup' a (funy : B a => c y)) x == idmap
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally : B a, IW I A B i j (j a y))
(c : forally : B a, IW' (j a y)) =>
iw_sup' a (funy : B a => c y)) x
o IW'_ind (fun (l : I) (_ : IW' l) => IW I A B i j l)
(fun (a : A) (_ : forallx0 : B a, IW' (j a x0))
(c : forallc : B a, IW I A B i j (j a c)) =>
iw_sup I A B i j a (funy : B a => c y)) x ==
idmap
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
IW'_ind (fun (l : I) (_ : IW' l) => IW I A B i j l)
(fun (a : A) (_ : forallx0 : B a, IW' (j a x0))
(c : forallc : B a, IW I A B i j (j a c)) =>
iw_sup I A B i j a (funy : B a => c y)) x
o IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally : B a, IW I A B i j (j a y))
(c : forally : B a, IW' (j a y)) =>
iw_sup' a (funy : B a => c y)) x == idmap
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
forall (x : A)
(i0 : forally : B x, IW I A B i j (j x y)),
(forally : B x,
IW'_ind (fun (l : I) (_ : IW' l) => IW I A B i j l)
(fun (a : A) (_ : forallx0 : B a, IW' (j a x0))
(c : forallc : B a, IW I A B i j (j a c)) =>
iw_sup I A B i j a (funy0 : B a => c y0)) (j x y)
(IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally0 : B a, IW I A B i j (j a y0))
(c : forally0 : B a, IW' (j a y0)) =>
iw_sup' a (funy0 : B a => c y0)) (j x y)
(i0 y)) = i0 y) ->
IW'_ind (fun (l : I) (_ : IW' l) => IW I A B i j l)
(fun (a : A) (_ : forallx0 : B a, IW' (j a x0))
(c : forallc : B a, IW I A B i j (j a c)) =>
iw_sup I A B i j a (funy : B a => c y)) (i x)
(IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally : B a, IW I A B i j (j a y))
(c : forally : B a, IW' (j a y)) =>
iw_sup' a (funy : B a => c y)) (i x)
(iw_sup I A B i j x i0)) = iw_sup I A B i j x i0
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I a: A b: forally : B a, IW I A B i j (j a y) c: forally : B a,
IW'_ind
(fun (l : I) (_ : IW' l) => IW I A B i j l)
(fun (a : A) (_ : forallx0 : B a, IW' (j a x0))
(c : forallc : B a, IW I A B i j (j a c)) =>
iw_sup I A B i j a (funy0 : B a => c y0))
(j a y)
(IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally0 : B a,
IW I A B i j (j a y0))
(c : forally0 : B a, IW' (j a y0)) =>
iw_sup' a (funy0 : B a => c y0)) (j a y)
(b y)) = b y
iw_sup I A B i j a
(funy : B a =>
W_rect A B
(funw : W A B =>
forallx : I, IsIndexedBy x w -> IW I A B i j x)
(fun (a : A) (b : B a -> W A B)
(k : forall (b0 : B a) (x : I),
IsIndexedBy x (b b0) -> IW I A B i j x)
(x : I)
(r : (i a = x) *
(forallc : B a,
IsIndexedBy (j a c) (b c))) =>
match
fst r in (_ = i0) return (IW I A B i j i0)
with
| 1 =>
iw_sup I A B i j a
(funy0 : B a => k y0 (j a y0) (snd r y0))
end)
(IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally0 : B a, IW I A B i j (j a y0))
(c : forally0 : B a, IW' (j a y0)) =>
iw_sup' a (funy0 : B a => c y0)) (j a y)
(b y)).1 (j a y)
(IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally0 : B a, IW I A B i j (j a y0))
(c : forally0 : B a, IW' (j a y0)) =>
iw_sup' a (funy0 : B a => c y0)) (j a y)
(b y)).2) = iw_sup I A B i j a b
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I a: A b: forally : B a, IW I A B i j (j a y) c: forally : B a,
IW'_ind
(fun (l : I) (_ : IW' l) => IW I A B i j l)
(fun (a : A) (_ : forallx0 : B a, IW' (j a x0))
(c : forallc : B a, IW I A B i j (j a c)) =>
iw_sup I A B i j a (funy0 : B a => c y0))
(j a y)
(IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally0 : B a,
IW I A B i j (j a y0))
(c : forally0 : B a, IW' (j a y0)) =>
iw_sup' a (funy0 : B a => c y0)) (j a y)
(b y)) = b y
(funy : B a =>
W_rect A B
(funw : W A B =>
forallx : I, IsIndexedBy x w -> IW I A B i j x)
(fun (a : A) (b : B a -> W A B)
(k : forall (b0 : B a) (x : I),
IsIndexedBy x (b b0) -> IW I A B i j x)
(x : I)
(r : (i a = x) *
(forallc : B a, IsIndexedBy (j a c) (b c)))
=>
match
fst r in (_ = i0) return (IW I A B i j i0)
with
| 1 =>
iw_sup I A B i j a
(funy0 : B a => k y0 (j a y0) (snd r y0))
end)
(IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally0 : B a, IW I A B i j (j a y0))
(c : forally0 : B a, IW' (j a y0)) =>
iw_sup' a (funy0 : B a => c y0)) (j a y) (b y)).1
(j a y)
(IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally0 : B a, IW I A B i j (j a y0))
(c : forally0 : B a, IW' (j a y0)) =>
iw_sup' a (funy0 : B a => c y0)) (j a y) (b y)).2) =
b
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I a: A b: forally : B a, IW I A B i j (j a y) c: forally : B a,
IW'_ind
(fun (l : I) (_ : IW' l) => IW I A B i j l)
(fun (a : A) (_ : forallx0 : B a, IW' (j a x0))
(c : forallc : B a, IW I A B i j (j a c)) =>
iw_sup I A B i j a (funy0 : B a => c y0))
(j a y)
(IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally0 : B a,
IW I A B i j (j a y0))
(c : forally0 : B a, IW' (j a y0)) =>
iw_sup' a (funy0 : B a => c y0)) (j a y)
(b y)) = b y y: B a
W_rect A B
(funw : W A B =>
forallx : I, IsIndexedBy x w -> IW I A B i j x)
(fun (a : A) (b : B a -> W A B)
(k : forall (b0 : B a) (x : I),
IsIndexedBy x (b b0) -> IW I A B i j x)
(x : I)
(r : (i a = x) *
(forallc : B a, IsIndexedBy (j a c) (b c)))
=>
match
fst r in (_ = i0) return (IW I A B i j i0)
with
| 1 =>
iw_sup I A B i j a
(funy : B a => k y (j a y) (snd r y))
end)
(IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally : B a, IW I A B i j (j a y))
(c : forally : B a, IW' (j a y)) =>
iw_sup' a (funy : B a => c y)) (j a y) (b y)).1
(j a y)
(IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally : B a, IW I A B i j (j a y))
(c : forally : B a, IW' (j a y)) =>
iw_sup' a (funy : B a => c y)) (j a y) (b y)).2 =
b y
apply c.
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally : B a, IW I A B i j (j a y))
(c : forally : B a, IW' (j a y)) =>
iw_sup' a (funy : B a => c y)) x
o IW'_ind (fun (l : I) (_ : IW' l) => IW I A B i j l)
(fun (a : A) (_ : forallx0 : B a, IW' (j a x0))
(c : forallc : B a, IW I A B i j (j a c)) =>
iw_sup I A B i j a (funy : B a => c y)) x ==
idmap
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I
(funx0 : IW' x =>
IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally : B a, IW I A B i j (j a y))
(c : forally : B a, IW' (j a y)) =>
iw_sup' a (funy : B a => c y)) x
(IW'_ind
(fun (l : I) (_ : IW' l) => IW I A B i j l)
(fun (a : A) (_ : forallx1 : B a, IW' (j a x1))
(c : forallc : B a, IW I A B i j (j a c)) =>
iw_sup I A B i j a (funy : B a => c y)) x x0)) ==
idmap
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I y: IW' x
IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally : B a, IW I A B i j (j a y))
(c : forally : B a, IW' (j a y)) =>
iw_sup' a (funy : B a => c y)) x
(IW'_ind (fun (l : I) (_ : IW' l) => IW I A B i j l)
(fun (a : A) (_ : forallx0 : B a, IW' (j a x0))
(c : forallc : B a, IW I A B i j (j a c)) =>
iw_sup I A B i j a (funy : B a => c y)) x y) =
y
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I y: IW' x
forall (x : A) (y : forallx0 : B x, IW' (j x x0)),
(forallc : B x,
IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally0 : B a, IW I A B i j (j a y0))
(c0 : forally0 : B a, IW' (j a y0)) =>
iw_sup' a (funy0 : B a => c0 y0)) (j x c)
(IW'_ind
(fun (l : I) (_ : IW' l) => IW I A B i j l)
(fun (a : A) (_ : forallx0 : B a, IW' (j a x0))
(c0 : forallc0 : B a, IW I A B i j (j a c0))
=> iw_sup I A B i j a (funy0 : B a => c0 y0))
(j x c) (y c)) = y c) ->
IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally0 : B a, IW I A B i j (j a y0))
(c : forally0 : B a, IW' (j a y0)) =>
iw_sup' a (funy0 : B a => c y0)) (i x)
(IW'_ind (fun (l : I) (_ : IW' l) => IW I A B i j l)
(fun (a : A) (_ : forallx0 : B a, IW' (j a x0))
(c : forallc : B a, IW I A B i j (j a c)) =>
iw_sup I A B i j a (funy0 : B a => c y0)) (i x)
(iw_sup' x y)) = iw_sup' x y
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I y: IW' x a: A b: forallx0 : B a, IW' (j a x0) c: forallc : B a,
IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally : B a, IW I A B i j (j a y))
(c0 : forally : B a, IW' (j a y)) =>
iw_sup' a (funy : B a => c0 y)) (j a c)
(IW'_ind
(fun (l : I) (_ : IW' l) => IW I A B i j l)
(fun (a : A)
(_ : forallx0 : B a, IW' (j a x0))
(c0 : forallc0 : B a,
IW I A B i j (j a c0)) =>
iw_sup I A B i j a (funy : B a => c0 y))
(j a c) (b c)) = b c
iw_sup' a
(funy : B a =>
IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally0 : B a, IW I A B i j (j a y0))
(c : forally0 : B a, IW' (j a y0)) =>
iw_sup' a (funy0 : B a => c y0)) (j a y)
(W_rect A B
(funw : W A B =>
forallx : I,
IsIndexedBy x w -> IW I A B i j x)
(fun (a : A) (b : B a -> W A B)
(k : forall (b0 : B a) (x : I),
IsIndexedBy x (b b0) -> IW I A B i j x)
(x : I)
(r : (i a = x) *
(forallc : B a,
IsIndexedBy (j a c) (b c))) =>
match
fst r in (_ = i0) return (IW I A B i j i0)
with
| 1 =>
iw_sup I A B i j a
(funy0 : B a =>
k y0 (j a y0) (snd r y0))
end) (b y).1 (j a y) (b y).2)) = iw_sup' a b
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I y: IW' x a: A b: forallx0 : B a, IW' (j a x0) c: forallc : B a,
IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally : B a, IW I A B i j (j a y))
(c0 : forally : B a, IW' (j a y)) =>
iw_sup' a (funy : B a => c0 y)) (j a c)
(IW'_ind
(fun (l : I) (_ : IW' l) => IW I A B i j l)
(fun (a : A)
(_ : forallx0 : B a, IW' (j a x0))
(c0 : forallc0 : B a,
IW I A B i j (j a c0)) =>
iw_sup I A B i j a (funy : B a => c0 y))
(j a c) (b c)) = b c
(funy : B a =>
IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally0 : B a, IW I A B i j (j a y0))
(c : forally0 : B a, IW' (j a y0)) =>
iw_sup' a (funy0 : B a => c y0)) (j a y)
(W_rect A B
(funw : W A B =>
forallx : I, IsIndexedBy x w -> IW I A B i j x)
(fun (a : A) (b : B a -> W A B)
(k : forall (b0 : B a) (x : I),
IsIndexedBy x (b b0) -> IW I A B i j x)
(x : I)
(r : (i a = x) *
(forallc : B a,
IsIndexedBy (j a c) (b c))) =>
match
fst r in (_ = i0) return (IW I A B i j i0)
with
| 1 =>
iw_sup I A B i j a
(funy0 : B a => k y0 (j a y0) (snd r y0))
end) (b y).1 (j a y) (b y).2)) = b
I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I H: Funext x: I y: IW' x a: A b: forallx0 : B a, IW' (j a x0) c: forallc : B a,
IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally : B a, IW I A B i j (j a y))
(c0 : forally : B a, IW' (j a y)) =>
iw_sup' a (funy : B a => c0 y)) (j a c)
(IW'_ind
(fun (l : I) (_ : IW' l) => IW I A B i j l)
(fun (a : A)
(_ : forallx0 : B a, IW' (j a x0))
(c0 : forallc0 : B a,
IW I A B i j (j a c0)) =>
iw_sup I A B i j a (funy : B a => c0 y))
(j a c) (b c)) = b c d: B a
IW_rect I A B i j
(fun (l : I) (_ : IW I A B i j l) => IW' l)
(fun (a : A)
(_ : forally : B a, IW I A B i j (j a y))
(c : forally : B a, IW' (j a y)) =>
iw_sup' a (funy : B a => c y)) (j a d)
(W_rect A B
(funw : W A B =>
forallx : I, IsIndexedBy x w -> IW I A B i j x)
(fun (a : A) (b : B a -> W A B)
(k : forall (b0 : B a) (x : I),
IsIndexedBy x (b b0) -> IW I A B i j x)
(x : I)
(r : (i a = x) *
(forallc : B a,
IsIndexedBy (j a c) (b c))) =>
match
fst r in (_ = i0) return (IW I A B i j i0)
with
| 1 =>
iw_sup I A B i j a
(funy : B a => k y (j a y) (snd r y))
end) (b d).1 (j a d) (b d).2) = b d
apply c.Defined.EndReduction.(** * Characterization of path types of IW-types. Argument due to Jasper Hugunin. *)SectionPaths.Context `{Funext}
(I : Type) (A : Type) (B : A -> Type)
(i : A -> I) (j : forallx, B x -> I).(** We wish to show that path types of IW-types are IW-types themselves. We do this by showing the path type satisfies the same induction principle as the IW-type hence they are equivalent. *)LetI' : Type := {k : I & IW I A B i j k * IW I A B i j k}.LetA' : Type := {e : A & (forallc, IW I A B i j (j e c)) * (forallc, IW I A B i j (j e c))}.LetB' : A' -> Type := funX => B X.1.Leti' : A' -> I' := functor_sigma i (funa : A => functor_prod (iw_sup I A B i j a) (iw_sup I A B i j a)).Letj' : forallk, B' k -> I' := funkc => (j k.1 c; (fst k.2 c, snd k.2 c)).LetIWPath : I' -> Type := funx => fst (pr2 x) = snd (pr2 x).
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: A'
(forally : B' x, IWPath (j' x y)) -> IWPath (i' x)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: A'
(forally : B' x, IWPath (j' x y)) -> IWPath (i' x)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: A c1, c2: forallc : B x, IW I A B i j (j x c)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: A c1, c2: forallc : B x, IW I A B i j (j x c) y: forally : B' (x; (c1, c2)),
IWPath (j' (x; (c1, c2)) y)
IWPath (i' (x; (c1, c2)))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: A c1, c2: forallc : B x, IW I A B i j (j x c) y: forally : B' (x; (c1, c2)),
IWPath (j' (x; (c1, c2)) y)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: A c1, c2: forallc : B x, IW I A B i j (j x c) y: forally : B' (x; (c1, c2)),
IWPath (j' (x; (c1, c2)) y)
c1 = c2
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: A c1, c2: forallc : B x, IW I A B i j (j x c) y: forally : B' (x; (c1, c2)),
IWPath (j' (x; (c1, c2)) y) l: B x
c1 l = c2 l
apply y.Defined.
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: A a: forallc : B x, IW I A B i j (j x c)
iwpath_sup (x; (a, a)) (apD10 1) = 1
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: A a: forallc : B x, IW I A B i j (j x c)
iwpath_sup (x; (a, a)) (apD10 1) = 1
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: A a: forallc : B x, IW I A B i j (j x c)
ap (iw_sup I A B i j x)
(path_forall a a (funl : B x => apD10 1 l)) = 1
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: A a: forallc : B x, IW I A B i j (j x c)
ap (iw_sup I A B i j x) 1 = 1
reflexivity.Defined.SectionInd.Context
(P : forallxab, IWPath xab -> Type)
(S : forallab, (forallc, P _ (b c)) -> P (i' a) (iwpath_sup a b)).
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b)
forall (l : I) (a : IW I A B i j l), P (l; (a, a)) 1
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b)
forall (l : I) (a : IW I A B i j l), P (l; (a, a)) 1
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b)
forall (x : A)
(i0 : forally : B x, IW I A B i j (j x y)),
(forally : B x, P (j x y; (i0 y, i0 y)) 1) ->
P
(i x;
(iw_sup I A B i j x i0, iw_sup I A B i j x i0)) 1
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: A a: forally : B x, IW I A B i j (j x y) q: forally : B x, P (j x y; (a y, a y)) 1
P (i x; (iw_sup I A B i j x a, iw_sup I A B i j x a))
1
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: A a: forally : B x, IW I A B i j (j x y) q: forally : B x, P (j x y; (a y, a y)) 1 p:= S (x; (a, a)) (funy : B x => 1) q: P (i' (x; (a, a)))
(iwpath_sup (x; (a, a)) (funy : B x => 1))
P (i x; (iw_sup I A B i j x a, iw_sup I A B i j x a))
1
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: A a: forally : B x, IW I A B i j (j x y) q: forally : B x, P (j x y; (a y, a y)) 1 p:= S (x; (a, a)) (funy : B x => 1) q: P (i' (x; (a, a)))
(ap (iw_sup I A B i j x)
(path_forall a a (funl : B x => 1)))
P (i x; (iw_sup I A B i j x a, iw_sup I A B i j x a))
1
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: A a: forally : B x, IW I A B i j (j x y) q: forally : B x, P (j x y; (a y, a y)) 1 p:= S (x; (a, a)) (funy : B x => 1) q: P (i' (x; (a, a)))
(ap (iw_sup I A B i j x)
(path_forall a a (funl : B x => 1)))
ap (iw_sup I A B i j x)
(path_forall a a (funl : B x => 1)) = 1
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: A a: forally : B x, IW I A B i j (j x y) q: forally : B x, P (j x y; (a y, a y)) 1 p:= S (x; (a, a)) (funy : B x => 1) q: P (i' (x; (a, a)))
(ap (iw_sup I A B i j x)
(path_forall a a (funl : B x => 1)))
ap (iw_sup I A B i j x) (path_forall a a (apD10 1)) =
ap (iw_sup I A B i j x) 1
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: A a: forally : B x, IW I A B i j (j x y) q: forally : B x, P (j x y; (a y, a y)) 1 p:= S (x; (a, a)) (funy : B x => 1) q: P (i' (x; (a, a)))
(ap (iw_sup I A B i j x)
(path_forall a a (funl : B x => 1)))
path_forall a a (apD10 1) = 1
apply eissect.Defined.
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b)
forall (x : I') (p : IWPath x), P x p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b)
forall (x : I') (p : IWPath x), P x p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: I a, b: IW I A B i j x
forallp : IWPath (x; (a, b)), P (x; (a, b)) p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: I a, b: IW I A B i j x
forallp : a = b, P (x; (a, b)) p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: I a: IW I A B i j x
P (x; (a, a)) 1
apply IWPath_ind_refl.Defined.(** The computation rule for the induction principle. *)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: A' h: forally : B' x, IWPath (j' x y)
IWPath_ind (i' x) (iwpath_sup x h) =
S x h (func : B' x => IWPath_ind (j' x c) (h c))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: A' h: forally : B' x, IWPath (j' x y)
IWPath_ind (i' x) (iwpath_sup x h) =
S x h (func : B' x => IWPath_ind (j' x c) (h c))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: A a, b: forallc : B x, IW I A B i j (j x c) h: forally : B' (x; (a, b)),
IWPath (j' (x; (a, b)) y)
IWPath_ind (i' (x; (a, b))) (iwpath_sup (x; (a, b)) h) =
S (x; (a, b)) h
(func : B' (x; (a, b)) =>
IWPath_ind (j' (x; (a, b)) c) (h c))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: A a, b: forallc : B x, IW I A B i j (j x c) h: forally : B x, a y = b y
IWPath_ind (i' (x; (a, b))) (iwpath_sup (x; (a, b)) h) =
S (x; (a, b)) h
(func : B' (x; (a, b)) =>
IWPath_ind (j' (x; (a, b)) c) (h c))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: A a, b: forallc : B x, IW I A B i j (j x c) h: forally : B x, a y = b y
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: A a, b: forallc : B x, IW I A B i j (j x c) h: forally : B x, a y = b y
?Goal =
S (x; (a, b)) h
(func : B' (x; (a, b)) =>
IWPath_ind (j' (x; (a, b)) c) (h c))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: A a, b: forallc : B x, IW I A B i j (j x c) h: forally : B x, a y = b y
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: A a, b: forallc : B x, IW I A B i j (j x c) h: forally : B x, a y = b y
IWPath_ind (i' (x; (a, b))) (iwpath_sup (x; (a, b)) h) =
?Goal1 (eisretr (path_forall a b) (path_forall a b h))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: A a, b: forallc : B x, IW I A B i j (j x c) h: forally : B x, a y = b y
paths_ind (iw_sup I A B i j x a)
(fun (r : IW I A B i j (i x))
(p'' : iw_sup I A B i j x a = r) =>
P (i x; (iw_sup I A B i j x a, r)) p'')
(IWPath_ind_refl (i x) (iw_sup I A B i j x a))
(iw_sup I A B i j x a) (ap (iw_sup I A B i j x) 1) =
paths_rec (path_forall a a (apD10 1))
(funp'' : a = a =>
P
(i x;
(iw_sup I A B i j x a, iw_sup I A B i j x a))
(ap (iw_sup I A B i j x) p''))
(S (x; (a, a)) (apD10 1)
(func : B' (x; (a, a)) =>
IWPath_ind (j x c; (a c, a c)) (apD10 1 c))) 1
(eissect apD10 1)
exact (transport_compose _ _ _ _)^.
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forallxab : I', IWPath xab -> Type S: forall (a : A')
(b : forallx : B' a, IWPath (j' a x)),
(forallc : B' a, P (j' a c) (b c)) ->
P (i' a) (iwpath_sup a b) x: A a, b: forallc : B x, IW I A B i j (j x c) h: forally : B x, a y = b y
paths_rec
(path_forall a (snd (x; (a, b)).2)
(apD10
(path_forall (fst (x; (a, b)).2)
(snd (x; (a, b)).2)
((funl : B (x; (a, b)).1 => h l)
:
fst (x; (a, b)).2 == snd (x; (a, b)).2))))
(funp'' : a = snd (x; (a, b)).2 =>
P
(i x;
(iw_sup I A B i j x a,
iw_sup I A B i j x (snd (x; (a, b)).2)))
(ap (iw_sup I A B i j x) p''))
(S (x; (a, snd (x; (a, b)).2))
(apD10
(path_forall (fst (x; (a, b)).2)
(snd (x; (a, b)).2)
((funl : B (x; (a, b)).1 => h l)
:
fst (x; (a, b)).2 == snd (x; (a, b)).2)))
(func : B' (x; (a, snd (x; (a, b)).2)) =>
IWPath_ind (j x c; (a c, snd (x; (a, b)).2 c))
(apD10
(path_forall (fst (x; (a, b)).2)
(snd (x; (a, b)).2)
((funl : B (x; (a, b)).1 => h l)
:
fst (x; (a, b)).2 == snd (x; (a, b)).2))
c)))
(path_forall (fst (x; (a, b)).2) (snd (x; (a, b)).2)
((funl : B (x; (a, b)).1 => h l)
:
fst (x; (a, b)).2 == snd (x; (a, b)).2))
(ap (path_forall a b) (eissect (path_forall a b) h)) =
S (x; (a, b)) h
(func : B' (x; (a, b)) =>
IWPath_ind (j' (x; (a, b)) c) (h c))
bycbn; destruct (eisretr apD10 h).Defined.EndInd.(** The path type of an IW-type is again an IW-type. *)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x
IW I' A' B' i' j' (x; (a, b)) <~> a = b
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x
IW I' A' B' i' j' (x; (a, b)) <~> a = b
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x
IW I' A' B' i' j' (x; (a, b)) <~> IWPath (x; (a, b))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x
IW I' A' B' i' j' (x; (a, b)) -> IWPath (x; (a, b))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x
IWPath (x; (a, b)) -> IW I' A' B' i' j' (x; (a, b))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x
?f o ?g == idmap
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x
?g o ?f == idmap
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x
IW I' A' B' i' j' (x; (a, b)) -> IWPath (x; (a, b))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x y: IW I' A' B' i' j' (x; (a, b))
IWPath (x; (a, b))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x e: A' f: forally : B' e, IW I' A' B' i' j' (j' e y) g: forally : B' e, IWPath (j' e y)
IWPath (i' e)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x e: A' f: forally : B' e, IW I' A' B' i' j' (j' e y) g: forally : B' e, IWPath (j' e y)
forally : B' e, IWPath (j' e y)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x e: A' f: forally : B' e, IW I' A' B' i' j' (j' e y) g: forally : B' e, IWPath (j' e y) y: B' e
IWPath (j' e y)
apply g.
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x
IWPath (x; (a, b)) -> IW I' A' B' i' j' (x; (a, b))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x
(funy : IW I' A' B' i' j' (x; (a, b)) =>
lets := (x; (a, b)) in
IW_rect I' A' B' i' j'
(fun (s0 : I') (_ : IW I' A' B' i' j' s0) =>
IWPath s0)
(fun (e : A')
(_ : forally0 : B' e,
IW I' A' B' i' j' (j' e y0))
(g : forally0 : B' e, IWPath (j' e y0)) =>
iwpath_sup e (funy0 : B' e => g y0)) s y) o
?g == idmap
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x
?g
o (funy : IW I' A' B' i' j' (x; (a, b)) =>
lets := (x; (a, b)) in
IW_rect I' A' B' i' j'
(fun (s0 : I') (_ : IW I' A' B' i' j' s0) =>
IWPath s0)
(fun (e : A')
(_ : forally0 : B' e,
IW I' A' B' i' j' (j' e y0))
(g : forally0 : B' e, IWPath (j' e y0)) =>
iwpath_sup e (funy0 : B' e => g y0)) s y) ==
idmap
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x
IWPath (x; (a, b)) -> IW I' A' B' i' j' (x; (a, b))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x y: IWPath (x; (a, b))
IW I' A' B' i' j' (x; (a, b))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x e: A' f: forallx : B' e, IWPath (j' e x) g: forallc : B' e, IW I' A' B' i' j' (j' e c)
IW I' A' B' i' j' (i' e)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x e: A' f: forallx : B' e, IWPath (j' e x) g: forallc : B' e, IW I' A' B' i' j' (j' e c)
forally : B' e, IW I' A' B' i' j' (j' e y)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x e: A' f: forallx : B' e, IWPath (j' e x) g: forallc : B' e, IW I' A' B' i' j' (j' e c) y: B' e
IW I' A' B' i' j' (j' e y)
apply g.
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x
(funy : IW I' A' B' i' j' (x; (a, b)) =>
lets := (x; (a, b)) in
IW_rect I' A' B' i' j'
(fun (s0 : I') (_ : IW I' A' B' i' j' s0) =>
IWPath s0)
(fun (e : A')
(_ : forally0 : B' e,
IW I' A' B' i' j' (j' e y0))
(g : forally0 : B' e, IWPath (j' e y0)) =>
iwpath_sup e (funy0 : B' e => g y0)) s y)
o (funy : IWPath (x; (a, b)) =>
lets := (x; (a, b)) in
IWPath_ind
(fun (s0 : I') (_ : IWPath s0) =>
IW I' A' B' i' j' s0)
(fun (e : A')
(_ : forallx : B' e, IWPath (j' e x))
(g : forallc : B' e,
IW I' A' B' i' j' (j' e c)) =>
iw_sup I' A' B' i' j' e (funy0 : B' e => g y0))
s y) == idmap
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x
(funy : IWPath (x; (a, b)) =>
lets := (x; (a, b)) in
IWPath_ind
(fun (s0 : I') (_ : IWPath s0) =>
IW I' A' B' i' j' s0)
(fun (e : A')
(_ : forallx : B' e, IWPath (j' e x))
(g : forallc : B' e, IW I' A' B' i' j' (j' e c))
=> iw_sup I' A' B' i' j' e (funy0 : B' e => g y0))
s y)
o (funy : IW I' A' B' i' j' (x; (a, b)) =>
lets := (x; (a, b)) in
IW_rect I' A' B' i' j'
(fun (s0 : I') (_ : IW I' A' B' i' j' s0) =>
IWPath s0)
(fun (e : A')
(_ : forally0 : B' e,
IW I' A' B' i' j' (j' e y0))
(g : forally0 : B' e, IWPath (j' e y0)) =>
iwpath_sup e (funy0 : B' e => g y0)) s y) ==
idmap
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x
(funy : IW I' A' B' i' j' (x; (a, b)) =>
lets := (x; (a, b)) in
IW_rect I' A' B' i' j'
(fun (s0 : I') (_ : IW I' A' B' i' j' s0) =>
IWPath s0)
(fun (e : A')
(_ : forally0 : B' e,
IW I' A' B' i' j' (j' e y0))
(g : forally0 : B' e, IWPath (j' e y0)) =>
iwpath_sup e (funy0 : B' e => g y0)) s y)
o (funy : IWPath (x; (a, b)) =>
lets := (x; (a, b)) in
IWPath_ind
(fun (s0 : I') (_ : IWPath s0) =>
IW I' A' B' i' j' s0)
(fun (e : A')
(_ : forallx : B' e, IWPath (j' e x))
(g : forallc : B' e,
IW I' A' B' i' j' (j' e c)) =>
iw_sup I' A' B' i' j' e (funy0 : B' e => g y0))
s y) == idmap
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x y: IWPath (x; (a, b))
IW_rect I' A' B' i' j'
(fun (s : I') (_ : IW I' A' B' i' j' s) => IWPath s)
(fun (e : A')
(_ : forally : B' e, IW I' A' B' i' j' (j' e y))
(g : forally : B' e, IWPath (j' e y)) =>
iwpath_sup e (funy : B' e => g y)) (x; (a, b))
(IWPath_ind
(fun (s : I') (_ : IWPath s) =>
IW I' A' B' i' j' s)
(fun (e : A')
(_ : forallx : B' e, IWPath (j' e x))
(g : forallc : B' e,
IW I' A' B' i' j' (j' e c)) =>
iw_sup I' A' B' i' j' e (funy : B' e => g y))
(x; (a, b)) y) = y
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x a': A' b': forallx : B' a', IWPath (j' a' x) IH: forallc : B' a',
IW_rect I' A' B' i' j'
(fun (s : I') (_ : IW I' A' B' i' j' s) =>
IWPath s)
(fun (e : A')
(_ : forally : B' e,
IW I' A' B' i' j' (j' e y))
(g : forally : B' e, IWPath (j' e y)) =>
iwpath_sup e (funy : B' e => g y))
(j' a' c)
(IWPath_ind
(fun (s : I') (_ : IWPath s) =>
IW I' A' B' i' j' s)
(fun (e : A')
(_ : forallx : B' e, IWPath (j' e x))
(g : forallc0 : B' e,
IW I' A' B' i' j' (j' e c0)) =>
iw_sup I' A' B' i' j' e
(funy : B' e => g y))
(j' a' c) (b' c)) =
b' c
IW_rect I' A' B' i' j'
(fun (s : I') (_ : IW I' A' B' i' j' s) => IWPath s)
(fun (e : A')
(_ : forally : B' e, IW I' A' B' i' j' (j' e y))
(g : forally : B' e, IWPath (j' e y)) =>
iwpath_sup e (funy : B' e => g y)) (i' a')
(IWPath_ind
(fun (s : I') (_ : IWPath s) =>
IW I' A' B' i' j' s)
(fun (e : A')
(_ : forallx : B' e, IWPath (j' e x))
(g : forallc : B' e,
IW I' A' B' i' j' (j' e c)) =>
iw_sup I' A' B' i' j' e (funy : B' e => g y))
(i' a') (iwpath_sup a' b')) = iwpath_sup a' b'
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x a': A' b': forallx : B' a', IWPath (j' a' x) IH: forallc : B' a',
IW_rect I' A' B' i' j'
(fun (s : I') (_ : IW I' A' B' i' j' s) =>
IWPath s)
(fun (e : A')
(_ : forally : B' e,
IW I' A' B' i' j' (j' e y))
(g : forally : B' e, IWPath (j' e y)) =>
iwpath_sup e (funy : B' e => g y))
(j' a' c)
(IWPath_ind
(fun (s : I') (_ : IWPath s) =>
IW I' A' B' i' j' s)
(fun (e : A')
(_ : forallx : B' e, IWPath (j' e x))
(g : forallc0 : B' e,
IW I' A' B' i' j' (j' e c0)) =>
iw_sup I' A' B' i' j' e
(funy : B' e => g y))
(j' a' c) (b' c)) =
b' c
IW_rect I' A' B' i' j'
(fun (s : I') (_ : IW I' A' B' i' j' s) => IWPath s)
(fun (e : A')
(_ : forally : B' e, IW I' A' B' i' j' (j' e y))
(g : forally : B' e, IWPath (j' e y)) =>
iwpath_sup e (funy : B' e => g y)) (i' a')
(iw_sup I' A' B' i' j' a'
(funy : B' a' =>
IWPath_ind
(fun (s : I') (_ : IWPath s) =>
IW I' A' B' i' j' s)
(fun (e : A')
(_ : forallx : B' e, IWPath (j' e x))
(g : forallc : B' e,
IW I' A' B' i' j' (j' e c)) =>
iw_sup I' A' B' i' j' e
(funy0 : B' e => g y0)) (j' a' y) (b' y))) =
iwpath_sup a' b'
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x a': A' b': forallx : B' a', IWPath (j' a' x) IH: forallc : B' a',
IW_rect I' A' B' i' j'
(fun (s : I') (_ : IW I' A' B' i' j' s) =>
IWPath s)
(fun (e : A')
(_ : forally : B' e,
IW I' A' B' i' j' (j' e y))
(g : forally : B' e, IWPath (j' e y)) =>
iwpath_sup e (funy : B' e => g y))
(j' a' c)
(IWPath_ind
(fun (s : I') (_ : IWPath s) =>
IW I' A' B' i' j' s)
(fun (e : A')
(_ : forallx : B' e, IWPath (j' e x))
(g : forallc0 : B' e,
IW I' A' B' i' j' (j' e c0)) =>
iw_sup I' A' B' i' j' e
(funy : B' e => g y))
(j' a' c) (b' c)) =
b' c
(funy : B' a' =>
IW_rect I' A' B' i' j'
(fun (s : I') (_ : IW I' A' B' i' j' s) => IWPath s)
(fun (e : A')
(_ : forally0 : B' e,
IW I' A' B' i' j' (j' e y0))
(g : forally0 : B' e, IWPath (j' e y0)) =>
iwpath_sup e (funy0 : B' e => g y0)) (j' a' y)
(IWPath_ind
(fun (s : I') (_ : IWPath s) =>
IW I' A' B' i' j' s)
(fun (e : A')
(_ : forallx : B' e, IWPath (j' e x))
(g : forallc : B' e,
IW I' A' B' i' j' (j' e c)) =>
iw_sup I' A' B' i' j' e (funy0 : B' e => g y0))
(j' a' y) (b' y))) = b'
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x a': A' b': forallx : B' a', IWPath (j' a' x) IH: forallc : B' a',
IW_rect I' A' B' i' j'
(fun (s : I') (_ : IW I' A' B' i' j' s) =>
IWPath s)
(fun (e : A')
(_ : forally : B' e,
IW I' A' B' i' j' (j' e y))
(g : forally : B' e, IWPath (j' e y)) =>
iwpath_sup e (funy : B' e => g y))
(j' a' c)
(IWPath_ind
(fun (s : I') (_ : IWPath s) =>
IW I' A' B' i' j' s)
(fun (e : A')
(_ : forallx : B' e, IWPath (j' e x))
(g : forallc0 : B' e,
IW I' A' B' i' j' (j' e c0)) =>
iw_sup I' A' B' i' j' e
(funy : B' e => g y))
(j' a' c) (b' c)) =
b' c c: B' a'
IW_rect I' A' B' i' j'
(fun (s : I') (_ : IW I' A' B' i' j' s) => IWPath s)
(fun (e : A')
(_ : forally : B' e, IW I' A' B' i' j' (j' e y))
(g : forally : B' e, IWPath (j' e y)) =>
iwpath_sup e (funy : B' e => g y)) (j' a' c)
(IWPath_ind
(fun (s : I') (_ : IWPath s) =>
IW I' A' B' i' j' s)
(fun (e : A')
(_ : forallx : B' e, IWPath (j' e x))
(g : forallc : B' e,
IW I' A' B' i' j' (j' e c)) =>
iw_sup I' A' B' i' j' e (funy : B' e => g y))
(j' a' c) (b' c)) = b' c
apply IH.
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x
(funy : IWPath (x; (a, b)) =>
lets := (x; (a, b)) in
IWPath_ind
(fun (s0 : I') (_ : IWPath s0) =>
IW I' A' B' i' j' s0)
(fun (e : A')
(_ : forallx : B' e, IWPath (j' e x))
(g : forallc : B' e, IW I' A' B' i' j' (j' e c))
=> iw_sup I' A' B' i' j' e (funy0 : B' e => g y0))
s y)
o (funy : IW I' A' B' i' j' (x; (a, b)) =>
lets := (x; (a, b)) in
IW_rect I' A' B' i' j'
(fun (s0 : I') (_ : IW I' A' B' i' j' s0) =>
IWPath s0)
(fun (e : A')
(_ : forally0 : B' e,
IW I' A' B' i' j' (j' e y0))
(g : forally0 : B' e, IWPath (j' e y0)) =>
iwpath_sup e (funy0 : B' e => g y0)) s y) ==
idmap
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x y: IW I' A' B' i' j' (x; (a, b))
IWPath_ind
(fun (s : I') (_ : IWPath s) => IW I' A' B' i' j' s)
(fun (e : A') (_ : forallx : B' e, IWPath (j' e x))
(g : forallc : B' e, IW I' A' B' i' j' (j' e c))
=> iw_sup I' A' B' i' j' e (funy : B' e => g y))
(x; (a, b))
(IW_rect I' A' B' i' j'
(fun (s : I') (_ : IW I' A' B' i' j' s) =>
IWPath s)
(fun (e : A')
(_ : forally : B' e,
IW I' A' B' i' j' (j' e y))
(g : forally : B' e, IWPath (j' e y)) =>
iwpath_sup e (funy : B' e => g y)) (x; (a, b))
y) = y
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x e: A' f: forally : B' e, IW I' A' B' i' j' (j' e y) IH: forally : B' e,
IWPath_ind
(fun (s : I') (_ : IWPath s) =>
IW I' A' B' i' j' s)
(fun (e : A')
(_ : forallx : B' e, IWPath (j' e x))
(g : forallc : B' e,
IW I' A' B' i' j' (j' e c)) =>
iw_sup I' A' B' i' j' e
(funy0 : B' e => g y0))
(j' e y)
(IW_rect I' A' B' i' j'
(fun (s : I') (_ : IW I' A' B' i' j' s) =>
IWPath s)
(fun (e : A')
(_ : forally0 : B' e,
IW I' A' B' i' j' (j' e y0))
(g : forally0 : B' e, IWPath (j' e y0))
=> iwpath_sup e (funy0 : B' e => g y0))
(j' e y) (f y)) = f y
IWPath_ind
(fun (s : I') (_ : IWPath s) => IW I' A' B' i' j' s)
(fun (e : A') (_ : forallx : B' e, IWPath (j' e x))
(g : forallc : B' e, IW I' A' B' i' j' (j' e c))
=> iw_sup I' A' B' i' j' e (funy : B' e => g y))
(i' e)
(IW_rect I' A' B' i' j'
(fun (s : I') (_ : IW I' A' B' i' j' s) =>
IWPath s)
(fun (e : A')
(_ : forally : B' e,
IW I' A' B' i' j' (j' e y))
(g : forally : B' e, IWPath (j' e y)) =>
iwpath_sup e (funy : B' e => g y)) (i' e)
(iw_sup I' A' B' i' j' e f)) =
iw_sup I' A' B' i' j' e f
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x e: A' f: forally : B' e, IW I' A' B' i' j' (j' e y) IH: forally : B' e,
IWPath_ind
(fun (s : I') (_ : IWPath s) =>
IW I' A' B' i' j' s)
(fun (e : A')
(_ : forallx : B' e, IWPath (j' e x))
(g : forallc : B' e,
IW I' A' B' i' j' (j' e c)) =>
iw_sup I' A' B' i' j' e
(funy0 : B' e => g y0))
(j' e y)
(IW_rect I' A' B' i' j'
(fun (s : I') (_ : IW I' A' B' i' j' s) =>
IWPath s)
(fun (e : A')
(_ : forally0 : B' e,
IW I' A' B' i' j' (j' e y0))
(g : forally0 : B' e, IWPath (j' e y0))
=> iwpath_sup e (funy0 : B' e => g y0))
(j' e y) (f y)) = f y
iw_sup I' A' B' i' j' e
(funy : B' e =>
IWPath_ind
(fun (s : I') (_ : IWPath s) =>
IW I' A' B' i' j' s)
(fun (e : A')
(_ : forallx : B' e, IWPath (j' e x))
(g : forallc : B' e,
IW I' A' B' i' j' (j' e c)) =>
iw_sup I' A' B' i' j' e (funy0 : B' e => g y0))
(j' e y)
((fix F
(y0 : I') (i : IW I' A' B' i' j' y0) {struct
i} : IWPath y0 :=
match
i in (IW _ _ _ _ _ y1) return (IWPath y1)
with
| @iw_sup _ _ _ _ _ x i0 =>
iwpath_sup x
(funy1 : B' x => F (j' x y1) (i0 y1))
end) (j' e y) (f y))) =
iw_sup I' A' B' i' j' e f
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: I a, b: IW I A B i j x e: A' f: forally : B' e, IW I' A' B' i' j' (j' e y) IH: forally : B' e,
IWPath_ind
(fun (s : I') (_ : IWPath s) =>
IW I' A' B' i' j' s)
(fun (e : A')
(_ : forallx : B' e, IWPath (j' e x))
(g : forallc : B' e,
IW I' A' B' i' j' (j' e c)) =>
iw_sup I' A' B' i' j' e
(funy0 : B' e => g y0))
(j' e y)
(IW_rect I' A' B' i' j'
(fun (s : I') (_ : IW I' A' B' i' j' s) =>
IWPath s)
(fun (e : A')
(_ : forally0 : B' e,
IW I' A' B' i' j' (j' e y0))
(g : forally0 : B' e, IWPath (j' e y0))
=> iwpath_sup e (funy0 : B' e => g y0))
(j' e y) (f y)) = f y c: B' e
IWPath_ind
(fun (s : I') (_ : IWPath s) => IW I' A' B' i' j' s)
(fun (e : A') (_ : forallx : B' e, IWPath (j' e x))
(g : forallc : B' e, IW I' A' B' i' j' (j' e c))
=> iw_sup I' A' B' i' j' e (funy : B' e => g y))
(j' e c)
((fix F
(y : I') (i : IW I' A' B' i' j' y) {struct i} :
IWPath y :=
match
i in (IW _ _ _ _ _ y0) return (IWPath y0)
with
| @iw_sup _ _ _ _ _ x i0 =>
iwpath_sup x
(funy0 : B' x => F (j' x y0) (i0 y0))
end) (j' e c) (f c)) = f c
apply IH.Defined.(** ** Characterization of fiber *)(** We begin with two auxiliary lemmas that will be explained shortly. *)Local Definitionadjust_hfiber {XY} {f : X -> Y} {yz}
: hfiber f y -> y = z -> hfiber f z
:= fun '(x ; p) => match p with idpath => funq => (x ; q) end.
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type X, Y: Type f: X -> Y y: Y xp: hfiber f y
adjust_hfiber xp (1 : y = y) = xp
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type X, Y: Type f: X -> Y y: Y xp: hfiber f y
adjust_hfiber xp (1 : y = y) = xp
bydestruct xp as [x []].Defined.(** We wish to show an induction principle coming from the path type of the fiber. However to do this we need to be a bit more general by allowing the elements of the IW-type to differ in label up to equality. This allows us to do prove this induction principle easily, and later we will derive the induction principle where the labels are the same. *)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (i x) 1 (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1
forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb)
(p : iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le),
P la lb le a b p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (i x) 1 (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1
forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb)
(p : iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le),
P la lb le a b p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (i x) 1 (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 la, lb: I le: lb = la a: IW I A B i j la b: IW I A B i j lb
forallp : iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le,
P la lb le a b p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (i x) 1 (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 xa, xb: A le: i xb = i xa cha: forally : B xa, IW I A B i j (j xa y) chb: forally : B xb, IW I A B i j (j xb y)
forallp : iw_to_hfiber_index (i xa)
(iw_sup I A B i j xa cha) =
adjust_hfiber
(iw_to_hfiber_index (i xb)
(iw_sup I A B i j xb chb)) le,
P (i xa) (i xb) le (iw_sup I A B i j xa cha)
(iw_sup I A B i j xb chb) p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (i x) 1 (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 xa, xb: A le: i xb = i xa cha: forally : B xa, IW I A B i j (j xa y) chb: forally : B xb, IW I A B i j (j xb y) p: iw_to_hfiber_index (i xa)
(iw_sup I A B i j xa cha) =
adjust_hfiber
(iw_to_hfiber_index (i xb)
(iw_sup I A B i j xb chb)) le
P (i xa) (i xb) le (iw_sup I A B i j xa cha)
(iw_sup I A B i j xb chb) p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (i x) 1 (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 xa, xb: A le: i xb = i xa cha: forally : B xa, IW I A B i j (j xa y) chb: forally : B xb, IW I A B i j (j xb y) p: iw_to_hfiber_index (i xa)
(iw_sup I A B i j xa cha) =
adjust_hfiber
(iw_to_hfiber_index (i xb)
(iw_sup I A B i j xb chb)) le
forallchb : forally : B
(iw_to_hfiber_index (i xa)
(iw_sup I A B i j xa cha)).1,
IW I A B i j
(j
(iw_to_hfiber_index (i xa)
(iw_sup I A B i j xa cha)).1 y),
P (i xa)
(i
(iw_to_hfiber_index (i xa)
(iw_sup I A B i j xa cha)).1)
(iw_to_hfiber_index (i xa) (iw_sup I A B i j xa cha)).2
(iw_sup I A B i j xa cha)
(iw_sup I A B i j
(iw_to_hfiber_index (i xa)
(iw_sup I A B i j xa cha)).1 chb) 1
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (i x) 1 (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 xa, xb: A le: i xb = i xa cha: forally : B xa, IW I A B i j (j xa y) chb: forally : B xb, IW I A B i j (j xb y) p: iw_to_hfiber_index (i xa)
(iw_sup I A B i j xa cha) =
adjust_hfiber
(iw_to_hfiber_index (i xb)
(iw_sup I A B i j xb chb)) le x: forally : B
(iw_to_hfiber_index
(i xa) (iw_sup I A B i j xa cha)).1,
IW I A B i j
(j
(iw_to_hfiber_index
(i xa) (iw_sup I A B i j xa cha)).1 y)
P (i xa)
(i
(iw_to_hfiber_index (i xa)
(iw_sup I A B i j xa cha)).1)
(iw_to_hfiber_index (i xa) (iw_sup I A B i j xa cha)).2
(iw_sup I A B i j xa cha)
(iw_sup I A B i j
(iw_to_hfiber_index (i xa)
(iw_sup I A B i j xa cha)).1 x) 1
apply h.Defined.(** Induction principle for paths in the fiber. *)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1
forall (l : I) (ab : IW I A B i j l)
(p : iw_to_hfiber_index l a = iw_to_hfiber_index l b),
P l a b p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1
forall (l : I) (ab : IW I A B i j l)
(p : iw_to_hfiber_index l a = iw_to_hfiber_index l b),
P l a b p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 l: I a, b: IW I A B i j l p: iw_to_hfiber_index l a = iw_to_hfiber_index l b
P l a b p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 l: I a, b: IW I A B i j l p: iw_to_hfiber_index l a = iw_to_hfiber_index l b
forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 l: I a, b: IW I A B i j l p: iw_to_hfiber_index l a = iw_to_hfiber_index l b Q:= ?Goal: forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type
P l a b p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 l: I a, b: IW I A B i j l p: iw_to_hfiber_index l a = iw_to_hfiber_index l b
forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 l: I a, b: IW I A B i j l p: iw_to_hfiber_index l a = iw_to_hfiber_index l b la, lb: I le: lb = la
forall (a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 l: I a, b: IW I A B i j l p: iw_to_hfiber_index l a = iw_to_hfiber_index l b lb: I
forallab : IW I A B i j lb,
iw_to_hfiber_index lb a =
adjust_hfiber (iw_to_hfiber_index lb b) 1 -> Type
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 l: I a, b: IW I A B i j l p: iw_to_hfiber_index l a = iw_to_hfiber_index l b lb: I a', b': IW I A B i j lb p': iw_to_hfiber_index lb a' =
adjust_hfiber (iw_to_hfiber_index lb b') 1
Type
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 l: I a, b: IW I A B i j l p: iw_to_hfiber_index l a = iw_to_hfiber_index l b lb: I a', b': IW I A B i j lb p': iw_to_hfiber_index lb a' =
adjust_hfiber (iw_to_hfiber_index lb b') 1
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 l: I a, b: IW I A B i j l p: iw_to_hfiber_index l a = iw_to_hfiber_index l b Q:= fun (lalb : I) (le : lb = la) =>
match
le as p in (_ = i0)
return
(forall (a : IW I A B i j i0)
(b : IW I A B i j lb),
iw_to_hfiber_index i0 a =
adjust_hfiber (iw_to_hfiber_index lb b) p ->
Type)
with
| 1 =>
fun (a'b' : IW I A B i j lb)
(p' : iw_to_hfiber_index lb a' =
adjust_hfiber
(iw_to_hfiber_index lb b') 1) =>
P lb a' b' (p' @ adjust_hfiber_idpath)
end: forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type
P l a b p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 l: I a, b: IW I A B i j l p: iw_to_hfiber_index l a = iw_to_hfiber_index l b Q:= fun (lalb : I) (le : lb = la) =>
match
le as p in (_ = i0)
return
(forall (a : IW I A B i j i0)
(b : IW I A B i j lb),
iw_to_hfiber_index i0 a =
adjust_hfiber (iw_to_hfiber_index lb b) p ->
Type)
with
| 1 =>
fun (a'b' : IW I A B i j lb)
(p' : iw_to_hfiber_index lb a' =
adjust_hfiber
(iw_to_hfiber_index lb b') 1) =>
P lb a' b' (p' @ adjust_hfiber_idpath)
end: forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type
forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
Q (i x) (i x) 1 (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 l: I a, b: IW I A B i j l p: iw_to_hfiber_index l a = iw_to_hfiber_index l b Q:= fun (lalb : I) (le : lb = la) =>
match
le as p in (_ = i0)
return
(forall (a : IW I A B i j i0)
(b : IW I A B i j lb),
iw_to_hfiber_index i0 a =
adjust_hfiber (iw_to_hfiber_index lb b) p ->
Type)
with
| 1 =>
fun (a'b' : IW I A B i j lb)
(p' : iw_to_hfiber_index lb a' =
adjust_hfiber
(iw_to_hfiber_index lb b') 1) =>
P lb a' b' (p' @ adjust_hfiber_idpath)
end: forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type h':= ?Goal: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
Q (i x) (i x) 1 (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1
P l a b p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 l: I a, b: IW I A B i j l p: iw_to_hfiber_index l a = iw_to_hfiber_index l b Q:= fun (lalb : I) (le : lb = la) =>
match
le as p in (_ = i0)
return
(forall (a : IW I A B i j i0)
(b : IW I A B i j lb),
iw_to_hfiber_index i0 a =
adjust_hfiber (iw_to_hfiber_index lb b) p ->
Type)
with
| 1 =>
fun (a'b' : IW I A B i j lb)
(p' : iw_to_hfiber_index lb a' =
adjust_hfiber
(iw_to_hfiber_index lb b') 1) =>
P lb a' b' (p' @ adjust_hfiber_idpath)
end: forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type
forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
Q (i x) (i x) 1 (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 l: I a, b: IW I A B i j l p: iw_to_hfiber_index l a = iw_to_hfiber_index l b Q:= fun (lalb : I) (le : lb = la) =>
match
le as p in (_ = i0)
return
(forall (a : IW I A B i j i0)
(b : IW I A B i j lb),
iw_to_hfiber_index i0 a =
adjust_hfiber (iw_to_hfiber_index lb b) p ->
Type)
with
| 1 =>
fun (a'b' : IW I A B i j lb)
(p' : iw_to_hfiber_index lb a' =
adjust_hfiber
(iw_to_hfiber_index lb b') 1) =>
P lb a' b' (p' @ adjust_hfiber_idpath)
end: forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type x: A a', b': forally : B x, IW I A B i j (j x y)
Q (i x) (i x) 1 (iw_sup I A B i j x a')
(iw_sup I A B i j x b') 1
apply h.
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 l: I a, b: IW I A B i j l p: iw_to_hfiber_index l a = iw_to_hfiber_index l b Q:= fun (lalb : I) (le : lb = la) =>
match
le as p in (_ = i0)
return
(forall (a : IW I A B i j i0)
(b : IW I A B i j lb),
iw_to_hfiber_index i0 a =
adjust_hfiber (iw_to_hfiber_index lb b) p ->
Type)
with
| 1 =>
fun (a'b' : IW I A B i j lb)
(p' : iw_to_hfiber_index lb a' =
adjust_hfiber
(iw_to_hfiber_index lb b') 1) =>
P lb a' b' (p' @ adjust_hfiber_idpath)
end: forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type h':= fun (x : A)
(a'b' : forally : B x, IW I A B i j (j x y))
=> h x a' b': forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
Q (i x) (i x) 1 (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1
P l a b p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 l: I a, b: IW I A B i j l p: iw_to_hfiber_index l a = iw_to_hfiber_index l b Q:= fun (lalb : I) (le : lb = la) =>
match
le as p in (_ = i0)
return
(forall (a : IW I A B i j i0)
(b : IW I A B i j lb),
iw_to_hfiber_index i0 a =
adjust_hfiber (iw_to_hfiber_index lb b) p ->
Type)
with
| 1 =>
fun (a'b' : IW I A B i j lb)
(p' : iw_to_hfiber_index lb a' =
adjust_hfiber
(iw_to_hfiber_index lb b') 1) =>
P lb a' b' (p' @ adjust_hfiber_idpath)
end: forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type h':= fun (x : A)
(a'b' : forally : B x, IW I A B i j (j x y))
=> h x a' b': forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
Q (i x) (i x) 1 (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 q:= path_iw_to_hfiber_ind' Q h' l l 1 a b
(p @ adjust_hfiber_idpath^): Q l l 1 a b (p @ adjust_hfiber_idpath^)
P l a b p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 l: I a, b: IW I A B i j l p: iw_to_hfiber_index l a = iw_to_hfiber_index l b Q:= fun (lalb : I) (le : lb = la) =>
match
le as p in (_ = i0)
return
(forall (a : IW I A B i j i0)
(b : IW I A B i j lb),
iw_to_hfiber_index i0 a =
adjust_hfiber (iw_to_hfiber_index lb b) p ->
Type)
with
| 1 =>
fun (a'b' : IW I A B i j lb)
(p' : iw_to_hfiber_index lb a' =
adjust_hfiber
(iw_to_hfiber_index lb b') 1) =>
P lb a' b' (p' @ adjust_hfiber_idpath)
end: forall (lalb : I) (le : lb = la)
(a : IW I A B i j la) (b : IW I A B i j lb),
iw_to_hfiber_index la a =
adjust_hfiber (iw_to_hfiber_index lb b) le -> Type h':= fun (x : A)
(a'b' : forally : B x, IW I A B i j (j x y))
=> h x a' b': forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
Q (i x) (i x) 1 (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1 q:= path_iw_to_hfiber_ind' Q h' l l 1 a b
(p @ adjust_hfiber_idpath^): Q l l 1 a b (p @ adjust_hfiber_idpath^)
(p @ adjust_hfiber_idpath^) @ adjust_hfiber_idpath = p
apply concat_pV_p.Defined.(** Induction principle for families over hfiber of i' *)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
hfiber i' (l; (a, b)) -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b)
((x; (a, b)); 1)
forall (l : I) (ab : IW I A B i j l)
(p : hfiber i' (l; (a, b))), P l a b p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
hfiber i' (l; (a, b)) -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b)
((x; (a, b)); 1)
forall (l : I) (ab : IW I A B i j l)
(p : hfiber i' (l; (a, b))), P l a b p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
hfiber i' (l; (a, b)) -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b)
((x; (a, b)); 1) l: I a, b: IW I A B i j l x: A y, z: forallc : B x, IW I A B i j (j x c) p: i' (x; (y, z)) = (l; (a, b))
P l a b ((x; (y, z)); p)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
hfiber i' (l; (a, b)) -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b)
((x; (a, b)); 1) l: I a, b: IW I A B i j l x: A y, z: forallc : B x, IW I A B i j (j x c) p: (i x;
(iw_sup I A B i j x y, iw_sup I A B i j x z)) =
(l; (a, b))
P l a b ((x; (y, z)); p)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
hfiber i' (l; (a, b)) -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b)
((x; (a, b)); 1) l: I a, b: IW I A B i j l x: A y, z: forallc : B x, IW I A B i j (j x c)
forallp : (i x;
(iw_sup I A B i j x y, iw_sup I A B i j x z)) =
(l; (a, b)), P l a b ((x; (y, z)); p)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
hfiber i' (l; (a, b)) -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b)
((x; (a, b)); 1) l: I a, b: IW I A B i j l x: A y, z: forallc : B x, IW I A B i j (j x c)
forallx0 : {p
: (i x;
(iw_sup I A B i j x y, iw_sup I A B i j x z)).1 =
(l; (a, b)).1 &
transport
(funk : I => IW I A B i j k * IW I A B i j k)
p
(i x;
(iw_sup I A B i j x y, iw_sup I A B i j x z)).2 =
(l; (a, b)).2},
P l a b
((x; (y, z));
equiv_path_sigma
(funk : I => IW I A B i j k * IW I A B i j k)
(i x;
(iw_sup I A B i j x y, iw_sup I A B i j x z))
(l; (a, b)) x0)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
hfiber i' (l; (a, b)) -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b)
((x; (a, b)); 1) l: I a, b: IW I A B i j l x: A y, z: forallc : B x, IW I A B i j (j x c) p: i x = l q: transport
(funk : I => IW I A B i j k * IW I A B i j k) p
(iw_sup I A B i j x y, iw_sup I A B i j x z) =
(a, b)
P l a b
((x; (y, z));
equiv_path_sigma
(funk : I => IW I A B i j k * IW I A B i j k)
(i x;
(iw_sup I A B i j x y, iw_sup I A B i j x z))
(l; (a, b)) (p; q))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
hfiber i' (l; (a, b)) -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b)
((x; (a, b)); 1) x: A a, b: IW I A B i j (i x) y, z: forallc : B x, IW I A B i j (j x c) q: transport
(funk : I => IW I A B i j k * IW I A B i j k) 1
(iw_sup I A B i j x y, iw_sup I A B i j x z) =
(a, b)
P (i x) a b
((x; (y, z));
equiv_path_sigma
(funk : I => IW I A B i j k * IW I A B i j k)
(i x;
(iw_sup I A B i j x y, iw_sup I A B i j x z))
(i x; (a, b)) (1; q))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
hfiber i' (l; (a, b)) -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b)
((x; (a, b)); 1) x: A a, b: IW I A B i j (i x) y, z: forallc : B x, IW I A B i j (j x c)
forallq : (iw_sup I A B i j x y, iw_sup I A B i j x z) =
(a, b),
P (i x) a b
((x; (y, z));
path_sigma_uncurried
(funk : I => IW I A B i j k * IW I A B i j k)
(i x;
(iw_sup I A B i j x y, iw_sup I A B i j x z))
(i x; (a, b)) (1; q))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
hfiber i' (l; (a, b)) -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b)
((x; (a, b)); 1) x: A a, b: IW I A B i j (i x) y, z: forallc : B x, IW I A B i j (j x c)
forallx0 : (fst (iw_sup I A B i j x y, iw_sup I A B i j x z) =
fst (a, b)) *
(snd (iw_sup I A B i j x y, iw_sup I A B i j x z) =
snd (a, b)),
P (i x) a b
((x; (y, z));
path_sigma_uncurried
(funk : I => IW I A B i j k * IW I A B i j k)
(i x;
(iw_sup I A B i j x y, iw_sup I A B i j x z))
(i x; (a, b))
(1;
equiv_path_prod
(iw_sup I A B i j x y, iw_sup I A B i j x z)
(a, b) x0))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
hfiber i' (l; (a, b)) -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b)
((x; (a, b)); 1) x: A a, b: IW I A B i j (i x) y, z: forallc : B x, IW I A B i j (j x c) p: iw_sup I A B i j x y = a q: iw_sup I A B i j x z = b
P (i x) a b
((x; (y, z));
path_sigma_uncurried
(funk : I => IW I A B i j k * IW I A B i j k)
(i x;
(iw_sup I A B i j x y, iw_sup I A B i j x z))
(i x; (a, b))
(1;
path_prod_uncurried
(iw_sup I A B i j x y, iw_sup I A B i j x z)
(a, b) (p, q)))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type P: forall (l : I) (ab : IW I A B i j l),
hfiber i' (l; (a, b)) -> Type h: forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
P (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b)
((x; (a, b)); 1) x: A y, z: forallc : B x, IW I A B i j (j x c)
P (i x) (iw_sup I A B i j x y) (iw_sup I A B i j x z)
((x; (y, z));
path_sigma_uncurried
(funk : I => IW I A B i j k * IW I A B i j k)
(i x;
(iw_sup I A B i j x y, iw_sup I A B i j x z))
(i x;
(iw_sup I A B i j x y, iw_sup I A B i j x z))
(1;
path_prod_uncurried
(iw_sup I A B i j x y, iw_sup I A B i j x z)
(iw_sup I A B i j x y, iw_sup I A B i j x z)
(1, 1)))
apply h.Defined.Local Definitionpath_iw_to_hfiberlab
: iw_to_hfiber_index l a = iw_to_hfiber_index l b -> hfiber i' (l; (a, b))
:= path_iw_to_hfiber_ind (funlab_ => hfiber i' (l ; (a, b)))
(funxab => ((x ; (a, b)); idpath)) l a b.Local Definitionhfiber_to_path_iwlab
: hfiber i' (l; (a, b)) -> iw_to_hfiber_index l a = iw_to_hfiber_index l b
:= hfiber_ind
(funlab_ => iw_to_hfiber_index l a = iw_to_hfiber_index l b)
(funxab => idpath) l a b.
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type
forall (l : I) (ab : IW I A B i j l)
(p : hfiber i' (l; (a, b))),
path_iw_to_hfiber l a b (hfiber_to_path_iw l a b p) =
p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type
forall (l : I) (ab : IW I A B i j l)
(p : hfiber i' (l; (a, b))),
path_iw_to_hfiber l a b (hfiber_to_path_iw l a b p) =
p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type
forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
path_iw_to_hfiber (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b)
(hfiber_to_path_iw (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) ((x; (a, b)); 1)) =
((x; (a, b)); 1)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: A a, b: forally : B x, IW I A B i j (j x y)
path_iw_to_hfiber (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b)
(hfiber_to_path_iw (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) ((x; (a, b)); 1)) =
((x; (a, b)); 1)
reflexivity.Defined.
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type
forall (l : I) (ab : IW I A B i j l)
(p : iw_to_hfiber_index l a = iw_to_hfiber_index l b),
hfiber_to_path_iw l a b (path_iw_to_hfiber l a b p) =
p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type
forall (l : I) (ab : IW I A B i j l)
(p : iw_to_hfiber_index l a = iw_to_hfiber_index l b),
hfiber_to_path_iw l a b (path_iw_to_hfiber l a b p) =
p
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type
forall (x : A)
(ab : forally : B x, IW I A B i j (j x y)),
hfiber_to_path_iw (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b)
(path_iw_to_hfiber (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1) = 1
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type x: A a, b: forally : B x, IW I A B i j (j x y)
hfiber_to_path_iw (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b)
(path_iw_to_hfiber (i x) (iw_sup I A B i j x a)
(iw_sup I A B i j x b) 1) = 1
reflexivity.Defined.(** The path type of the fibers of [i] is equivalent to the fibers of [i']. *)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type l: I a, b: IW I A B i j l
iw_to_hfiber_index l a = iw_to_hfiber_index l b <~>
hfiber i' (l; (a, b))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type l: I a, b: IW I A B i j l
iw_to_hfiber_index l a = iw_to_hfiber_index l b <~>
hfiber i' (l; (a, b))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type l: I a, b: IW I A B i j l
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
hfiber i' (l; (a, b))
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type l: I a, b: IW I A B i j l
hfiber i' (l; (a, b)) ->
iw_to_hfiber_index l a = iw_to_hfiber_index l b
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type l: I a, b: IW I A B i j l
?f o ?g == idmap
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type l: I a, b: IW I A B i j l
?g o ?f == idmap
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type l: I a, b: IW I A B i j l
iw_to_hfiber_index l a = iw_to_hfiber_index l b ->
hfiber i' (l; (a, b))
apply path_iw_to_hfiber.
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type l: I a, b: IW I A B i j l
hfiber i' (l; (a, b)) ->
iw_to_hfiber_index l a = iw_to_hfiber_index l b
apply hfiber_to_path_iw.
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type l: I a, b: IW I A B i j l
path_iw_to_hfiber l a b o hfiber_to_path_iw l a b ==
idmap
rapply path_iw_to_hfiber_to_path_iw.
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I I':= {k : I & IW I A B i j k * IW I A B i j k}: Type A':= {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}: Type B':= funX : A' => B X.1: A' -> Type i':= functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)): A' -> I' j':= fun (k : A') (c : B' k) =>
(j k.1 c; (fst k.2 c, snd k.2 c)): forallk : A', B' k -> I' IWPath:= funx : I' => fst x.2 = snd x.2: I' -> Type l: I a, b: IW I A B i j l
hfiber_to_path_iw l a b o path_iw_to_hfiber l a b ==
idmap
rapply hfiber_to_path_iw_to_hfiber.Defined.EndPaths.(** Some properties of the (fibers of the) index map [i] hold for the IW-type as well. For example, if [i] is an embedding then the corresponding IW-type is a hprop. *)(** ** IW-types preserve truncation *)(** We can show that if the index map is an embedding then the IW-type is a hprop. *)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsEmbedding i
forallx : I, IsHProp (IW I A B i j x)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsEmbedding i
forallx : I, IsHProp (IW I A B i j x)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsEmbedding i l: I
IsHProp (IW I A B i j l)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsEmbedding i l: I
forallxy : IW I A B i j l, x = y
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsEmbedding i l: I x: IW I A B i j l
forally : IW I A B i j l, x = y
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsEmbedding i x: A x': forally : B x, IW I A B i j (j x y) IHx: forall (y : B x) (y0 : IW I A B i j (j x y)), x' y = y0
forally : IW I A B i j (i x),
iw_sup I A B i j x x' = y
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsEmbedding i x: A x': forally : B x, IW I A B i j (j x y) IHx: forall (y : B x) (y0 : IW I A B i j (j x y)), x' y = y0 y: IW I A B i j (i x)
iw_sup I A B i j x x' = y
(** We need to induct on y and at the same time generalize the goal to become a dependent equality. This can be difficult to do with tactics so we just refine the corresponding match statement. All we have done is turn the RHS into a transport over an equality allowing the induction on y to go through. *)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsEmbedding i x: A x': forally : B x, IW I A B i j (j x y) IHx: forall (y : B x) (y0 : IW I A B i j (j x y)), x' y = y0 y0: IW I A B i j (i x) y: A y': forally0 : B y, IW I A B i j (j y y0)
forallq : i y = i x,
iw_sup I A B i j x x' =
transport (IW I A B i j) q (iw_sup I A B i j y y')
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsEmbedding i x: A x': forally : B x, IW I A B i j (j x y) IHx: forall (y : B x) (y0 : IW I A B i j (j x y)), x' y = y0 y0: IW I A B i j (i x) y: A y': forally0 : B y, IW I A B i j (j y y0) q: i y = i x
iw_sup I A B i j x x' =
transport (IW I A B i j) q (iw_sup I A B i j y y')
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsEmbedding i x: A x': forally : B x, IW I A B i j (j x y) IHx: forall (y : B x) (y0 : IW I A B i j (j x y)), x' y = y0 y0: IW I A B i j (i x) y: A y': forally0 : B y, IW I A B i j (j y y0) q: i y = i x r:= path_ishprop (x; 1) (y; q): (x; 1) = (y; q)
iw_sup I A B i j x x' =
transport (IW I A B i j) q (iw_sup I A B i j y y')
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsEmbedding i x: A x': forally : B x, IW I A B i j (j x y) IHx: forall (y : B x) (y0 : IW I A B i j (j x y)), x' y = y0 y0: IW I A B i j (i x) y: A y': forally0 : B y, IW I A B i j (j y y0) q: i y = i x r:= path_ishprop (x; 1) (y; q): (x; 1) = (y; q) r2:= r ..2: transport (funx0 : A => i x0 = i x) r ..11 = q
iw_sup I A B i j x x' =
transport (IW I A B i j) q (iw_sup I A B i j y y')
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsEmbedding i x: A x': forally : B x, IW I A B i j (j x y) IHx: forall (y : B x) (y0 : IW I A B i j (j x y)), x' y = y0 y0: IW I A B i j (i x) y: A y': forally0 : B y, IW I A B i j (j y y0) q: i y = i x r:= path_ishprop (x; 1) (y; q): (x; 1) = (y; q) r1:= r ..1: x = y r2:= r ..2: transport (funx0 : A => i x0 = i x) r1 1 = q
iw_sup I A B i j x x' =
transport (IW I A B i j) q (iw_sup I A B i j y y')
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsEmbedding i x: A x': forally : B x, IW I A B i j (j x y) IHx: forall (y : B x) (y0 : IW I A B i j (j x y)), x' y = y0 y0: IW I A B i j (i x) y: A y': forally0 : B y, IW I A B i j (j y y0) q: i y = i x r:= path_ishprop (x; 1) (y; q): (x; 1) = (y; q) r1: x = y r2: transport (funx0 : A => i x0 = i x) r1 1 = q
iw_sup I A B i j x x' =
transport (IW I A B i j) q (iw_sup I A B i j y y')
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsEmbedding i x: A x': forally : B x, IW I A B i j (j x y) IHx: forall (y : B x) (y0 : IW I A B i j (j x y)), x' y = y0 y0: IW I A B i j (i x) y': forally : B x, IW I A B i j (j x y) q: i x = i x r:= path_ishprop (x; 1) (x; q): (x; 1) = (x; q) r2: transport (funx0 : A => i x0 = i x) 11 = q
iw_sup I A B i j x x' =
transport (IW I A B i j) q (iw_sup I A B i j x y')
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsEmbedding i x: A x': forally : B x, IW I A B i j (j x y) IHx: forall (y : B x) (y0 : IW I A B i j (j x y)), x' y = y0 y0: IW I A B i j (i x) y': forally : B x, IW I A B i j (j x y) q: i x = i x r:= path_ishprop (x; 1) (x; q): (x; 1) = (x; q) r2: 1 = q
iw_sup I A B i j x x' =
transport (IW I A B i j) q (iw_sup I A B i j x y')
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsEmbedding i x: A x': forally : B x, IW I A B i j (j x y) IHx: forall (y : B x) (y0 : IW I A B i j (j x y)), x' y = y0 y0: IW I A B i j (i x) y': forally : B x, IW I A B i j (j x y) r:= path_ishprop (x; 1) (x; 1): (x; 1) = (x; 1)
iw_sup I A B i j x x' =
transport (IW I A B i j) 1 (iw_sup I A B i j x y')
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsEmbedding i x: A x': forally : B x, IW I A B i j (j x y) IHx: forall (y : B x) (y0 : IW I A B i j (j x y)), x' y = y0 y0: IW I A B i j (i x) y': forally : B x, IW I A B i j (j x y) r:= path_ishprop (x; 1) (x; 1): (x; 1) = (x; 1)
x' = y'
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsEmbedding i x: A x': forally : B x, IW I A B i j (j x y) IHx: forall (y : B x) (y0 : IW I A B i j (j x y)), x' y = y0 y0: IW I A B i j (i x) y': forally : B x, IW I A B i j (j x y) r:= path_ishprop (x; 1) (x; 1): (x; 1) = (x; 1) a: B x
x' a = y' a
apply IHx.Defined.(** Now by induction on truncation indices we show that IW-types are n.+1 truncated if the index maps are also n.+1 truncated. *)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I n: trunc_index h: IsTruncMap n.+1 i l: I
IsTrunc n.+1 (IW I A B i j l)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I n: trunc_index h: IsTruncMap n.+1 i l: I
IsTrunc n.+1 (IW I A B i j l)
(** We need a general induction hypothesis *)
H: Funext
forall (n : trunc_index) (IA : Type) (B : A -> Type)
(i : A -> I) (j : forallx : A, B x -> I),
IsTruncMap n.+1 i ->
foralll : I, IsTrunc n.+1 (IW I A B i j l)
H: Funext
forall (IA : Type) (B : A -> Type) (i : A -> I)
(j : forallx : A, B x -> I),
IsEmbedding i ->
foralll : I, IsHProp (IW I A B i j l)
H: Funext n: trunc_index IHn: forall (IA : Type) (B : A -> Type) (i : A -> I)
(j : forallx : A, B x -> I),
IsTruncMap n.+1 i -> foralll : I, IsTrunc n.+1 (IW I A B i j l)
forall (IA : Type) (B : A -> Type) (i : A -> I)
(j : forallx : A, B x -> I),
IsTruncMap n.+2 i ->
foralll : I, IsTrunc n.+2 (IW I A B i j l)
H: Funext n: trunc_index IHn: forall (IA : Type) (B : A -> Type) (i : A -> I)
(j : forallx : A, B x -> I),
IsTruncMap n.+1 i -> foralll : I, IsTrunc n.+1 (IW I A B i j l)
forall (IA : Type) (B : A -> Type) (i : A -> I)
(j : forallx : A, B x -> I),
IsTruncMap n.+2 i ->
foralll : I, IsTrunc n.+2 (IW I A B i j l)
H: Funext n: trunc_index IHn: forall (IA : Type) (B : A -> Type) (i : A -> I)
(j : forallx : A, B x -> I),
IsTruncMap n.+1 i -> foralll : I, IsTrunc n.+1 (IW I A B i j l) I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsTruncMap n.+2 i l: I
IsTrunc n.+2 (IW I A B i j l)
H: Funext n: trunc_index IHn: forall (IA : Type) (B : A -> Type) (i : A -> I)
(j : forallx : A, B x -> I),
IsTruncMap n.+1 i -> foralll : I, IsTrunc n.+1 (IW I A B i j l) I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsTruncMap n.+2 i l: I
forallxy : IW I A B i j l, IsTrunc n.+1 (x = y)
H: Funext n: trunc_index IHn: forall (IA : Type) (B : A -> Type) (i : A -> I)
(j : forallx : A, B x -> I),
IsTruncMap n.+1 i -> foralll : I, IsTrunc n.+1 (IW I A B i j l) I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsTruncMap n.+2 i l: I x, y: IW I A B i j l
IsTrunc n.+1 (x = y)
H: Funext n: trunc_index IHn: forall (IA : Type) (B : A -> Type) (i : A -> I)
(j : forallx : A, B x -> I),
IsTruncMap n.+1 i -> foralll : I, IsTrunc n.+1 (IW I A B i j l) I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsTruncMap n.+2 i l: I x, y: IW I A B i j l
IsTrunc n.+1
(IW {k : I & IW I A B i j k * IW I A B i j k}
{e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))}
(funX : {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))} =>
B X.1)
(functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)))
(fun
(k : {e : A &
(forallc : B e, IW I A B i j (j e c)) *
(forallc : B e, IW I A B i j (j e c))})
(c : B k.1) =>
(j k.1 c; (fst k.2 c, snd k.2 c))) (l; (x, y)))
H: Funext n: trunc_index IHn: forall (IA : Type) (B : A -> Type) (i : A -> I)
(j : forallx : A, B x -> I),
IsTruncMap n.+1 i -> foralll : I, IsTrunc n.+1 (IW I A B i j l) I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsTruncMap n.+2 i l: I x, y: IW I A B i j l
IsTruncMap n.+1
(functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a)))
H: Funext n: trunc_index IHn: forall (IA : Type) (B : A -> Type) (i : A -> I)
(j : forallx : A, B x -> I),
IsTruncMap n.+1 i -> foralll : I, IsTrunc n.+1 (IW I A B i j l) I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I h: IsTruncMap n.+2 i l: I x, y: IW I A B i j l k: I a, b: IW I A B i j k
IsTrunc n.+1
(hfiber
(functor_sigma i
(funa : A =>
functor_prod (iw_sup I A B i j a)
(iw_sup I A B i j a))) (k; (a, b)))
(** The crucial step is to characterize the fiber of [i'] which was done previously. *)exact (istrunc_equiv_istrunc _
(equiv_path_hfiber_index I A B i j k a b)).Defined.(** ** Decidable equality for IW-types *)(** If A has decidable paths then it is a hset and therefore equality of sigma types over it are determined by the second component. *)
A: Type A_dec: DecidablePaths A P: A -> Type x: A y, y': P x H: (x; y) = (x; y')
y = y'
A: Type A_dec: DecidablePaths A P: A -> Type x: A y, y': P x H: (x; y) = (x; y')
y = y'
A: Type A_dec: DecidablePaths A P: A -> Type x: A y, y': P x H: {p : (x; y).1 = (x; y').1 &
transport P p (x; y).2 = (x; y').2}
y = y'
A: Type A_dec: DecidablePaths A P: A -> Type x: A y, y': P x p: x = x q: transport P p y = y'
y = y'
A: Type A_dec: DecidablePaths A P: A -> Type x: A y, y': P x p: x = x q: transport P p y = y' r: 1 = p
y = y'
A: Type A_dec: DecidablePaths A P: A -> Type x: A y, y': P x q: transport P 1 y = y'
y = y'
exact q.Defined.(** IW-types have decidable equality if [liftP] holds and the fibers of the indexing map have decidable paths. Notably, if B x is finitely enumerable, then [liftP] holds. *)SectionDecidablePaths.Context `{Funext}
(I : Type) (A : Type) (B : A -> Type) (i : A -> I) (j : forallx, B x -> I)
(liftP : forall (x : A) (P : B x -> Type),
(forallc, Decidable (P c)) -> Decidable (forallc, P c))
(fibers_dec : forallx, DecidablePaths (hfiber i x)).Letchildren_for (x : A) : Type := forallc, IW I A B i j (j x c).Letgetfib {x} (a : IW I A B i j x) : hfiber i x
:= match a with iw_sup x _ => (x ; idpath) end.Letgetfib_computesxychildrenp
: getfib (paths_rec (i y) _ (iw_sup _ _ _ _ _ y children) (i x) p) = exist _ y p
:= match p
return getfib (paths_rec _ _ (iw_sup _ _ _ _ _ y children) _ p) = exist _ y p
with idpath => idpath end.Letgetfib_plus {x} (a : IW I A B i j x)
: {f : hfiber i x & children_for (pr1 f)}
:= match a with iw_sup x c => ((x; idpath); c) end.Letchildren_eq (x : A) (c1c2 : forallc, IW I A B i j (j x c))
: iw_sup I A B i j x c1 = iw_sup I A B i j x c2 -> c1 = c2
:= funr => inj_right_pair_on (funf => children_for (pr1 f))
(x; idpath) _ _ (ap getfib_plus r).
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) l: I a: IW I A B i j l
forallb : IW I A B i j l, Decidable (a = b)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) l: I a: IW I A B i j l
forallb : IW I A B i j l, Decidable (a = b)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y)
forallb : IW I A B i j (i x),
Decidable (iw_sup I A B i j x c1 = b)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x)
Decidable (iw_sup I A B i j x c1 = b)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x)
forallc2 : forally : B x, IW I A B i j (j x y),
Decidable (c1 = c2)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) decide_children:= ?Goal: forallc2 : forally : B x,
IW I A B i j (j x y),
Decidable (c1 = c2)
Decidable (iw_sup I A B i j x c1 = b)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x)
forallc2 : forally : B x, IW I A B i j (j x y),
Decidable (c1 = c2)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) c2: forally : B x, IW I A B i j (j x y)
Decidable (c1 = c2)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) c2: forally : B x, IW I A B i j (j x y) p: forallc : B x, c1 c = c2 c
Decidable (c1 = c2)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) c2: forally : B x, IW I A B i j (j x y) p: ~ (forallc : B x, c1 c = c2 c)
Decidable (c1 = c2)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) c2: forally : B x, IW I A B i j (j x y) p: forallc : B x, c1 c = c2 c
Decidable (c1 = c2)
left; byapply path_forall.
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) c2: forally : B x, IW I A B i j (j x y) p: ~ (forallc : B x, c1 c = c2 c)
Decidable (c1 = c2)
right; intro h; byapply p, apD10.
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) decide_children:= func2 : forally : B x,
IW I A B i j (j x y) =>
letd :=
liftP x
(func : B x => c1 c = c2 c)
(func : B x =>
decide_eq (j x c) (c1 c) (c2 c))
inmatch d with
| inl p =>
(funp0 : forallc : B x,
c1 c = c2 c =>
inl (path_forall c1 c2 p0)) p
| inr n =>
(funp : ~
(forallc : B x,
c1 c = c2 c) =>
inr
((funh : c1 = c2 =>
p (apD10 h))
:
c1 <> c2)) n
end: forallc2 : forally : B x,
IW I A B i j (j x y),
Decidable (c1 = c2)
Decidable (iw_sup I A B i j x c1 = b)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) decide_children:= func2 : forally : B x,
IW I A B i j (j x y) =>
letd :=
liftP x
(func : B x => c1 c = c2 c)
(func : B x =>
decide_eq (j x c) (c1 c) (c2 c))
inmatch d with
| inl p =>
(funp0 : forallc : B x,
c1 c = c2 c =>
inl (path_forall c1 c2 p0)) p
| inr n =>
(funp : ~
(forallc : B x,
c1 c = c2 c) =>
inr
((funh : c1 = c2 =>
p (apD10 h))
:
c1 <> c2)) n
end: forallc2 : forally : B x,
IW I A B i j (j x y),
Decidable (c1 = c2) y: A c2: forally0 : B y, IW I A B i j (j y y0) iy: i y = i x
Decidable
(iw_sup I A B i j x c1 =
paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y c2) (i x) iy)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) decide_children:= func2 : forally : B x,
IW I A B i j (j x y) =>
letd :=
liftP x
(func : B x => c1 c = c2 c)
(func : B x =>
decide_eq (j x c) (c1 c) (c2 c))
inmatch d with
| inl p =>
(funp0 : forallc : B x,
c1 c = c2 c =>
inl (path_forall c1 c2 p0)) p
| inr n =>
(funp : ~
(forallc : B x,
c1 c = c2 c) =>
inr
((funh : c1 = c2 =>
p (apD10 h))
:
c1 <> c2)) n
end: forallc2 : forally : B x,
IW I A B i j (j x y),
Decidable (c1 = c2) y: A c2: forally0 : B y, IW I A B i j (j y y0) iy: i y = i x feq: (x; 1) = (y; iy)
Decidable
(iw_sup I A B i j x c1 =
paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y c2) (i x) iy)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) decide_children:= func2 : forally : B x,
IW I A B i j (j x y) =>
letd :=
liftP x
(func : B x => c1 c = c2 c)
(func : B x =>
decide_eq (j x c) (c1 c) (c2 c))
inmatch d with
| inl p =>
(funp0 : forallc : B x,
c1 c = c2 c =>
inl (path_forall c1 c2 p0)) p
| inr n =>
(funp : ~
(forallc : B x,
c1 c = c2 c) =>
inr
((funh : c1 = c2 =>
p (apD10 h))
:
c1 <> c2)) n
end: forallc2 : forally : B x,
IW I A B i j (j x y),
Decidable (c1 = c2) y: A c2: forally0 : B y, IW I A B i j (j y y0) iy: i y = i x fneq: (x; 1) <> (y; iy)
Decidable
(iw_sup I A B i j x c1 =
paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y c2)
(i x) iy)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) decide_children:= func2 : forally : B x,
IW I A B i j (j x y) =>
letd :=
liftP x
(func : B x => c1 c = c2 c)
(func : B x =>
decide_eq (j x c) (c1 c) (c2 c))
inmatch d with
| inl p =>
(funp0 : forallc : B x,
c1 c = c2 c =>
inl (path_forall c1 c2 p0)) p
| inr n =>
(funp : ~
(forallc : B x,
c1 c = c2 c) =>
inr
((funh : c1 = c2 =>
p (apD10 h))
:
c1 <> c2)) n
end: forallc2 : forally : B x,
IW I A B i j (j x y),
Decidable (c1 = c2) y: A c2: forally0 : B y, IW I A B i j (j y y0) iy: i y = i x feq: (x; 1) = (y; iy)
Decidable
(iw_sup I A B i j x c1 =
paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y c2) (i x) iy)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) decide_children:= func2 : forally : B x,
IW I A B i j (j x y) =>
letd :=
liftP x
(func : B x => c1 c = c2 c)
(func : B x =>
decide_eq (j x c) (c1 c) (c2 c))
inmatch d with
| inl p =>
(funp0 : forallc : B x,
c1 c = c2 c =>
inl (path_forall c1 c2 p0)) p
| inr n =>
(funp : ~
(forallc : B x,
c1 c = c2 c) =>
inr
((funh : c1 = c2 =>
p (apD10 h))
:
c1 <> c2)) n
end: forallc2 : forally : B x,
IW I A B i j (j x y),
Decidable (c1 = c2) y: A c2: forally0 : B y, IW I A B i j (j y y0) iy: i y = i x feq: (x; 1) = (y; iy)
forall (iV := (x; 1)) (y := iV.1) (iy := iV.2)
(c2 : forally0 : B y, IW I A B i j (j y y0)),
Decidable
(iw_sup I A B i j x c1 =
paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y c2) (i x) iy)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) decide_children:= func2 : forally : B x,
IW I A B i j (j x y) =>
letd :=
liftP x
(func : B x => c1 c = c2 c)
(func : B x =>
decide_eq (j x c) (c1 c) (c2 c))
inmatch d with
| inl p =>
(funp0 : forallc : B x,
c1 c = c2 c =>
inl (path_forall c1 c2 p0)) p
| inr n =>
(funp : ~
(forallc : B x,
c1 c = c2 c) =>
inr
((funh : c1 = c2 =>
p (apD10 h))
:
c1 <> c2)) n
end: forallc2 : forally : B x,
IW I A B i j (j x y),
Decidable (c1 = c2) y: A c2: forally0 : B y, IW I A B i j (j y y0) iy: i y = i x feq: (x; 1) = (y; iy) c3: forally : B x, IW I A B i j (j x y)
Decidable
(iw_sup I A B i j x c1 = iw_sup I A B i j x c3)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) decide_children:= func2 : forally : B x,
IW I A B i j (j x y) =>
letd :=
liftP x
(func : B x => c1 c = c2 c)
(func : B x =>
decide_eq (j x c) (c1 c) (c2 c))
inmatch d with
| inl p =>
(funp0 : forallc : B x,
c1 c = c2 c =>
inl (path_forall c1 c2 p0)) p
| inr n =>
(funp : ~
(forallc : B x,
c1 c = c2 c) =>
inr
((funh : c1 = c2 =>
p (apD10 h))
:
c1 <> c2)) n
end: forallc2 : forally : B x,
IW I A B i j (j x y),
Decidable (c1 = c2) y: A c2: forally0 : B y, IW I A B i j (j y y0) iy: i y = i x feq: (x; 1) = (y; iy) c3: forally : B x, IW I A B i j (j x y) ceq: c1 = c3
Decidable
(iw_sup I A B i j x c1 = iw_sup I A B i j x c3)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) decide_children:= func2 : forally : B x,
IW I A B i j (j x y) =>
letd :=
liftP x
(func : B x => c1 c = c2 c)
(func : B x =>
decide_eq (j x c) (c1 c) (c2 c))
inmatch d with
| inl p =>
(funp0 : forallc : B x,
c1 c = c2 c =>
inl (path_forall c1 c2 p0)) p
| inr n =>
(funp : ~
(forallc : B x,
c1 c = c2 c) =>
inr
((funh : c1 = c2 =>
p (apD10 h))
:
c1 <> c2)) n
end: forallc2 : forally : B x,
IW I A B i j (j x y),
Decidable (c1 = c2) y: A c2: forally0 : B y, IW I A B i j (j y y0) iy: i y = i x feq: (x; 1) = (y; iy) c3: forally : B x, IW I A B i j (j x y) cneq: c1 <> c3
Decidable
(iw_sup I A B i j x c1 = iw_sup I A B i j x c3)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) decide_children:= func2 : forally : B x,
IW I A B i j (j x y) =>
letd :=
liftP x
(func : B x => c1 c = c2 c)
(func : B x =>
decide_eq (j x c) (c1 c) (c2 c))
inmatch d with
| inl p =>
(funp0 : forallc : B x,
c1 c = c2 c =>
inl (path_forall c1 c2 p0)) p
| inr n =>
(funp : ~
(forallc : B x,
c1 c = c2 c) =>
inr
((funh : c1 = c2 =>
p (apD10 h))
:
c1 <> c2)) n
end: forallc2 : forally : B x,
IW I A B i j (j x y),
Decidable (c1 = c2) y: A c2: forally0 : B y, IW I A B i j (j y y0) iy: i y = i x feq: (x; 1) = (y; iy) c3: forally : B x, IW I A B i j (j x y) ceq: c1 = c3
Decidable
(iw_sup I A B i j x c1 = iw_sup I A B i j x c3)
left; exact (ap _ ceq).
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) decide_children:= func2 : forally : B x,
IW I A B i j (j x y) =>
letd :=
liftP x
(func : B x => c1 c = c2 c)
(func : B x =>
decide_eq (j x c) (c1 c) (c2 c))
inmatch d with
| inl p =>
(funp0 : forallc : B x,
c1 c = c2 c =>
inl (path_forall c1 c2 p0)) p
| inr n =>
(funp : ~
(forallc : B x,
c1 c = c2 c) =>
inr
((funh : c1 = c2 =>
p (apD10 h))
:
c1 <> c2)) n
end: forallc2 : forally : B x,
IW I A B i j (j x y),
Decidable (c1 = c2) y: A c2: forally0 : B y, IW I A B i j (j y y0) iy: i y = i x feq: (x; 1) = (y; iy) c3: forally : B x, IW I A B i j (j x y) cneq: c1 <> c3
Decidable
(iw_sup I A B i j x c1 = iw_sup I A B i j x c3)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) decide_children:= func2 : forally : B x,
IW I A B i j (j x y) =>
letd :=
liftP x
(func : B x => c1 c = c2 c)
(func : B x =>
decide_eq (j x c) (c1 c) (c2 c))
inmatch d with
| inl p =>
(funp0 : forallc : B x,
c1 c = c2 c =>
inl (path_forall c1 c2 p0)) p
| inr n =>
(funp : ~
(forallc : B x,
c1 c = c2 c) =>
inr
((funh : c1 = c2 =>
p (apD10 h))
:
c1 <> c2)) n
end: forallc2 : forally : B x,
IW I A B i j (j x y),
Decidable (c1 = c2) y: A c2: forally0 : B y, IW I A B i j (j y y0) iy: i y = i x feq: (x; 1) = (y; iy) c3: forally : B x, IW I A B i j (j x y) cneq: c1 <> c3 r: iw_sup I A B i j x c1 = iw_sup I A B i j x c3
c1 = c3
exact (children_eq x c1 c3 r).
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) decide_children:= func2 : forally : B x,
IW I A B i j (j x y) =>
letd :=
liftP x
(func : B x => c1 c = c2 c)
(func : B x =>
decide_eq (j x c) (c1 c) (c2 c))
inmatch d with
| inl p =>
(funp0 : forallc : B x,
c1 c = c2 c =>
inl (path_forall c1 c2 p0)) p
| inr n =>
(funp : ~
(forallc : B x,
c1 c = c2 c) =>
inr
((funh : c1 = c2 =>
p (apD10 h))
:
c1 <> c2)) n
end: forallc2 : forally : B x,
IW I A B i j (j x y),
Decidable (c1 = c2) y: A c2: forally0 : B y, IW I A B i j (j y y0) iy: i y = i x fneq: (x; 1) <> (y; iy)
Decidable
(iw_sup I A B i j x c1 =
paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y c2) (i x) iy)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 decide_eq: forall (l : I) (ab : IW I A B i j l),
Decidable (a = b) x: A c1: forally : B x, IW I A B i j (j x y) b: IW I A B i j (i x) decide_children:= func2 : forally : B x,
IW I A B i j (j x y) =>
letd :=
liftP x
(func : B x => c1 c = c2 c)
(func : B x =>
decide_eq (j x c) (c1 c) (c2 c))
inmatch d with
| inl p =>
(funp0 : forallc : B x,
c1 c = c2 c =>
inl (path_forall c1 c2 p0)) p
| inr n =>
(funp : ~
(forallc : B x,
c1 c = c2 c) =>
inr
((funh : c1 = c2 =>
p (apD10 h))
:
c1 <> c2)) n
end: forallc2 : forally : B x,
IW I A B i j (j x y),
Decidable (c1 = c2) y: A c2: forally0 : B y, IW I A B i j (j y y0) iy: i y = i x fneq: (x; 1) <> (y; iy) r: iw_sup I A B i j x c1 =
paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y c2)
(i x) iy
(x; 1) = (y; iy)
exact (ap getfib r @ getfib_computes x y c2 iy).Defined.
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2
forallx : I, DecidablePaths (IW I A B i j x)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2
forallx : I, DecidablePaths (IW I A B i j x)
H: Funext I, A: Type B: A -> Type i: A -> I j: forallx : A, B x -> I liftP: forall (x : A) (P : B x -> Type),
(forallc : B x, Decidable (P c)) ->
Decidable (forallc : B x, P c) fibers_dec: forallx : I, DecidablePaths (hfiber i x) children_for:= funx : A =>
forallc : B x, IW I A B i j (j x c): A -> Type getfib:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0) return (hfiber i i0)
with
| @iw_sup _ _ _ _ _ x0 _ => (x0; 1)
end: forallx : I, IW I A B i j x -> hfiber i x getfib_computes:= fun (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x) =>
match
p as p0 in (_ = i0)
return
(getfib
(paths_rec (i y)
(IW I A B i j)
(iw_sup I A B i j y
children) i0 p0) =
(y; p0))
with
| 1 => 1end: forall (xy : A)
(children : forally0 : B y,
IW I A B i j (j y y0))
(p : i y = i x),
getfib
(paths_rec (i y) (IW I A B i j)
(iw_sup I A B i j y children)
(i x) p) = (y; p) getfib_plus:= fun (x : I) (a : IW I A B i j x) =>
match
a in (IW _ _ _ _ _ i0)
return
{f : hfiber i i0 & children_for f.1}
with
| @iw_sup _ _ _ _ _ x0 c => ((x0; 1); c)
end: forallx : I,
IW I A B i j x ->
{f : hfiber i x & children_for f.1} children_eq:= fun (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c))
(r : iw_sup I A B i j x c1 =
iw_sup I A B i j x c2) =>
inj_right_pair_on
(funf : {x0 : A & i x0 = i x} =>
children_for f.1) (x; 1) c1 c2
(ap getfib_plus r): forall (x : A)
(c1c2 : forallc : B x,
IW I A B i j (j x c)),
iw_sup I A B i j x c1 =
iw_sup I A B i j x c2 ->
c1 = c2 x: I a, b: IW I A B i j x