(******** Isabelle/HoTT: Type families as fibrations Feb 2019 Various results viewing type families as fibrations: transport, dependent map, path lifting etc. ********) theory Type_Families imports HoTT_Methods Sum Projections Eq begin section \Transport\ schematic_goal transport: assumes [intro]: "A: U i" "P: A \ U j" "x: A" "y: A" "p: x =[A] y" shows "?prf: P x \ P y" proof (path_ind' x y p) show "\x. x: A \ id P x: P x \ P x" by derive qed routine definition transport :: "[t, t \ t, t, t] \ t" ("(2transport[_, _, _, _])") where "transport[A, P, x, y] \ \p: x =[A] y. indEq (\a b. & (P a \ P b)) (\x. id P x) x y p" syntax "_transport'" :: "t \ t" ("transport[_]") ML \val pretty_transport = Attrib.setup_config_bool @{binding "pretty_transport"} (K true)\ print_translation \ let fun transport_tr' ctxt [A, P, x, y] = if Config.get ctxt pretty_transport then Syntax.const @{syntax_const "_transport'"} $ P else @{const transport} $ A $ P $ x $ y in [(@{const_syntax transport}, transport_tr')] end \ corollary transport_type: assumes [intro]: "A: U i" "P: A \ U j" "x: A" "y: A" "p: x =[A] y" shows "transport[A, P, x, y]`p: P x \ P y" unfolding transport_def by derive lemma transport_comp: assumes [intro]: "A: U i" "P: A \ U j" "a: A" shows "transport[A, P, a, a]`(refl a) \ id P a" unfolding transport_def by derive declare transport_type [intro] transport_comp [comp] schematic_goal transport_invl: assumes [intro]: "A: U i" "P: A \ U j" "x: A" "y: A" "p: x =[A] y" shows "?prf: (transport[A, P, y, x]`(inv[A, x, y]`p)) o[P x] (transport[A, P, x, y]`p) =[P x \ P x] id P x" proof (path_ind' x y p) fix x assume [intro]: "x: A" show "refl (id P x) : transport[A, P, x, x]`(inv[A, x, x]`(refl x)) o[P x] (transport[A, P, x, x]`(refl x)) =[P x \ P x] id P x" by derive fix y p assume [intro]: "y: A" "p: x =[A] y" show "transport[A, P, y, x]`(inv[A, x, y]`p) o[P x] transport[A, P, x, y]`p =[P x \ P x] id P x : U j" by derive qed schematic_goal transport_invr: assumes [intro]: "A: U i" "P: A \ U j" "x: A" "y: A" "p: x =[A] y" shows "?prf: (transport[A, P, x, y]`p) o[P y] (transport[A, P, y, x]`(inv[A, x, y]`p)) =[P y \ P y] id P y" proof (path_ind' x y p) fix x assume [intro]: "x: A" show "refl (id P x) : (transport[A, P, x, x]`(refl x)) o[P x] transport[A, P, x, x]`(inv[A, x, x]`(refl x)) =[P x \ P x] id P x" by derive fix y p assume [intro]: "y: A" "p: x =[A] y" show "transport[A, P, x, y]`p o[P y] transport[A, P, y, x]`(inv[A, x, y]`p) =[P y \ P y] id P y : U j" by derive qed declare transport_invl [intro] transport_invr [intro] schematic_goal path_lifting: assumes [intro]: "P: A \ U i" "A: U i" "x: A" "y: A" "p: x =[A] y" shows "?prf: \u: P x. =[\x: A. P x] " proof (path_ind' x y p, rule Prod_routine) fix x u assume [intro]: "x: A" "u: P x" have "(transport[A, P, x, x]`(refl x))`u \ u" by derive thus "(refl ): =[\(x: A). P x] " proof simp qed routine qed routine definition lift :: "[t, t \ t, t, t] \ t" ("(2lift[_, _, _, _])") where "lift[A, P, x, y] \ \u: P x. \p: x =[A] y. (indEq (\x y p. \u: P x. =[\(x: A). P x] ) (\x. \(u: P x). refl ) x y p)`u" corollary lift_type: assumes [intro]: "P: A \ U i" "A: U i" "x: A" "y: A" "p: x =[A] y" "u: P x" shows "lift[A, P, x, y]`u`p: =[\x: A. P x] " unfolding lift_def by (derive lems: path_lifting) schematic_goal lift_comp: assumes [intro]: "P: A \ U i" "A: U i" "x: A" "y: A" "p: x =[A] y" "u: P x" defines "Fst \ ap[fst[A, P], \x: A. P x, A, , ]" shows "?prf: Fst`(lift[A, P, x, y]`u`p) =[x =[A] y] p" proof derive oops end