@@ -240,33 +240,33 @@ def internal_hom [cartesian_closed C] : C ⥤ Cᵒᵖ ⥤ C :=
240
240
map_id' := λ X, by { ext, apply functor.map_id },
241
241
map_comp' := λ X Y Z f g, by { ext, apply functor.map_comp } }
242
242
243
- /-- If an initial object `0 ` exists in a CCC, then `A ⨯ 0 ≅ 0 `. -/
243
+ /-- If an initial object `I ` exists in a CCC, then `A ⨯ I ≅ I `. -/
244
244
@[simps]
245
- def zero_mul [has_initial C] : A ⨯ ⊥_ C ≅ ⊥_ C :=
245
+ def zero_mul {I : C} (t : is_initial I) : A ⨯ I ≅ I :=
246
246
{ hom := limits.prod.snd,
247
- inv := default (⊥_ C ⟶ A ⨯ ⊥_ C) ,
247
+ inv := t.to _ ,
248
248
hom_inv_id' :=
249
249
begin
250
- have : (limits.prod.snd : A ⨯ ⊥_ C ⟶ ⊥_ C ) = uncurry (default _),
250
+ have : (limits.prod.snd : A ⨯ I ⟶ I ) = uncurry (t.to _),
251
251
rw ← curry_eq_iff,
252
- apply subsingleton.elim ,
252
+ apply t.hom_ext ,
253
253
rw [this , ← uncurry_natural_right, ← eq_curry_iff],
254
- apply subsingleton.elim
254
+ apply t.hom_ext,
255
255
end ,
256
- }
256
+ inv_hom_id' := t.hom_ext _ _ }
257
257
258
258
/-- If an initial object `0` exists in a CCC, then `0 ⨯ A ≅ 0`. -/
259
- def mul_zero [has_initial C] : ⊥_ C ⨯ A ≅ ⊥_ C :=
260
- limits.prod.braiding _ _ ≪≫ zero_mul
259
+ def mul_zero {I : C} (t : is_initial I) : I ⨯ A ≅ I :=
260
+ limits.prod.braiding _ _ ≪≫ zero_mul t
261
261
262
262
/-- If an initial object `0` exists in a CCC then `0^B ≅ 1` for any `B`. -/
263
- def pow_zero [has_initial C] [cartesian_closed C] : ⊥_C ⟹ B ≅ ⊤_ C :=
263
+ def pow_zero {I : C} (t : is_initial I) [cartesian_closed C] : I ⟹ B ≅ ⊤_ C :=
264
264
{ hom := default _,
265
- inv := curry (mul_zero.hom ≫ default (⊥_ C ⟶ B) ),
265
+ inv := curry (( mul_zero t) .hom ≫ t.to _ ),
266
266
hom_inv_id' :=
267
267
begin
268
- rw [← curry_natural_left, curry_eq_iff, ← cancel_epi mul_zero.inv],
269
- { apply subsingleton.elim },
268
+ rw [← curry_natural_left, curry_eq_iff, ← cancel_epi ( mul_zero t) .inv],
269
+ { apply t.hom_ext },
270
270
{ apply_instance },
271
271
{ apply_instance }
272
272
end }
@@ -293,20 +293,28 @@ def prod_coprod_distrib [has_binary_coproducts C] [cartesian_closed C] (X Y Z :
293
293
end }
294
294
295
295
/--
296
- If an initial object `0` exists in a CCC then it is a strict initial object,
297
- i.e. any morphism to `0` is an iso.
296
+ If an initial object `I` exists in a CCC then it is a strict initial object,
297
+ i.e. any morphism to `I` is an iso.
298
+ This actually shows a slightly stronger version: any morphism to an initial object from an
299
+ exponentiable object is an isomorphism.
298
300
-/
299
- instance strict_initial [has_initial C] { f : A ⟶ ⊥_ C} : is_iso f :=
301
+ def strict_initial {I : C} (t : is_initial I) ( f : A ⟶ I) : is_iso f :=
300
302
begin
301
- haveI : mono (limits.prod.lift (𝟙 A) f ≫ zero_mul.hom) := mono_comp _ _,
303
+ haveI : mono (limits.prod.lift (𝟙 A) f ≫ ( zero_mul t) .hom) := mono_comp _ _,
302
304
rw [zero_mul_hom, prod.lift_snd] at _inst,
303
- haveI : split_epi f := ⟨default _, subsingleton.elim _ _⟩,
305
+ haveI : split_epi f := ⟨t.to _, t.hom_ext _ _⟩,
304
306
apply is_iso_of_mono_of_split_epi
305
307
end
306
308
309
+ instance [has_initial C] (f : A ⟶ ⊥_ C) : is_iso f :=
310
+ strict_initial initial_is_initial _
311
+
307
312
/-- If an initial object `0` exists in a CCC then every morphism from it is monic. -/
308
- instance initial_mono (B : C) [has_initial C] [cartesian_closed C] : mono (initial.to B) :=
309
- ⟨λ B g h _, eq_of_inv_eq_inv (subsingleton.elim (inv g) (inv h))⟩
313
+ lemma initial_mono {I : C} (B : C) (t : is_initial I) [cartesian_closed C] : mono (t.to B) :=
314
+ ⟨λ B g h _, by { haveI := strict_initial t g, haveI := strict_initial t h, exact eq_of_inv_eq_inv (t.hom_ext _ _) }⟩
315
+
316
+ instance initial.mono_to [has_initial C] (B : C) [cartesian_closed C] : mono (initial.to B) :=
317
+ initial_mono B initial_is_initial
310
318
311
319
variables {D : Type u₂} [category.{v} D]
312
320
section functor
0 commit comments