l3lab/ntp-mathlib huggingface dataset:
/-- When `F : C ⥤ D` is a functor satisfying suitable technical assumptions,
this is the induced term of type `HasShift D A` deduced from `[HasShift C A]`. -/
noncomputable def induced : HasShift D A :=
  hasShiftMk D A
    { F := s
      zero := Induced.zero F s i hF
      add := Induced.add F s i hF
      zero_add_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF 0 n).hom =
          eqToHom (by rw [zero_add]; rfl) ≫ whiskerRight (Induced.zero F s i hF).inv (s n) by
          intro X
          simpa using NatTrans.congr_app this X
        apply ((whiskeringLeft C D D).obj F).map_injective
        ext X
        have eq := dcongr_arg (fun a => (i a).hom.app X) (zero_add n)
        dsimp
        simp only [Induced.add_hom_app_obj, eq, shiftFunctorAdd_zero_add_hom_app,
          Functor.map_comp, eqToHom_map, Category.assoc, eqToHom_trans_assoc,
          eqToHom_refl, Category.id_comp, eqToHom_app, Induced.zero_inv_app_obj]
        erw [← NatTrans.naturality_assoc, Iso.hom_inv_id_app_assoc]
        rfl
      add_zero_hom_app := fun n => by
        

Proof state:
C : Type ?u.46399
D : Type ?u.46402
inst✝³ : Category.{?u.46406, ?u.46399} C
inst✝² : Category.{?u.46410, ?u.46402} D
F : C ⥤ D
A : Type ?u.46441
inst✝¹ : AddMonoid A
inst✝ : HasShift C A
s : A → D ⥤ D
i : (a : A) → F ⋙ s a ≅ shiftFunctor C a ⋙ F
hF : Nonempty (Full ((whiskeringLeft C D D).obj F)) ∧ Faithful ((whiskeringLeft C D D).obj F)
n : A
⊢ ∀ (X : D),
    (Induced.add F s i hF n 0).hom.app X =
      eqToHom (_ : (s (n + 0)).obj X = (𝟭 D).obj ((s n).obj X)) ≫ (Induced.zero F s i hF).inv.app ((s n).obj X)

Next tactic:
have := hF.2
/-- When `F : C ⥤ D` is a functor satisfying suitable technical assumptions,
this is the induced term of type `HasShift D A` deduced from `[HasShift C A]`. -/
noncomputable def induced : HasShift D A :=
  hasShiftMk D A
    { F := s
      zero := Induced.zero F s i hF
      add := Induced.add F s i hF
      zero_add_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF 0 n).hom =
          eqToHom (by rw [zero_add]; rfl) ≫ whiskerRight (Induced.zero F s i hF).inv (s n) by
          intro X
          simpa using NatTrans.congr_app this X
        apply ((whiskeringLeft C D D).obj F).map_injective
        ext X
        have eq := dcongr_arg (fun a => (i a).hom.app X) (zero_add n)
        dsimp
        simp only [Induced.add_hom_app_obj, eq, shiftFunctorAdd_zero_add_hom_app,
          Functor.map_comp, eqToHom_map, Category.assoc, eqToHom_trans_assoc,
          eqToHom_refl, Category.id_comp, eqToHom_app, Induced.zero_inv_app_obj]
        erw [← NatTrans.naturality_assoc, Iso.hom_inv_id_app_assoc]
        rfl
      add_zero_hom_app := fun n => by
        have := hF.2
        

Proof state:
C : Type ?u.46399
D : Type ?u.46402
inst✝³ : Category.{?u.46406, ?u.46399} C
inst✝² : Category.{?u.46410, ?u.46402} D
F : C ⥤ D
A : Type ?u.46441
inst✝¹ : AddMonoid A
inst✝ : HasShift C A
s : A → D ⥤ D
i : (a : A) → F ⋙ s a ≅ shiftFunctor C a ⋙ F
hF : Nonempty (Full ((whiskeringLeft C D D).obj F)) ∧ Faithful ((whiskeringLeft C D D).obj F)
n : A
this : Faithful ((whiskeringLeft C D D).obj F)
⊢ ∀ (X : D),
    (Induced.add F s i hF n 0).hom.app X =
      eqToHom (_ : (s (n + 0)).obj X = (𝟭 D).obj ((s n).obj X)) ≫ (Induced.zero F s i hF).inv.app ((s n).obj X)

Next tactic:
suffices (Induced.add F s i hF n 0).hom =
            eqToHom (by rw [add_zero]; rfl) ≫ whiskerLeft (s n) (Induced.zero F s i hF).inv by
          intro X
          simpa using NatTrans.congr_app this X
/-- When `F : C ⥤ D` is a functor satisfying suitable technical assumptions,
this is the induced term of type `HasShift D A` deduced from `[HasShift C A]`. -/
noncomputable def induced : HasShift D A :=
  hasShiftMk D A
    { F := s
      zero := Induced.zero F s i hF
      add := Induced.add F s i hF
      zero_add_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF 0 n).hom =
          eqToHom (by rw [zero_add]; rfl) ≫ whiskerRight (Induced.zero F s i hF).inv (s n) by
          intro X
          simpa using NatTrans.congr_app this X
        apply ((whiskeringLeft C D D).obj F).map_injective
        ext X
        have eq := dcongr_arg (fun a => (i a).hom.app X) (zero_add n)
        dsimp
        simp only [Induced.add_hom_app_obj, eq, shiftFunctorAdd_zero_add_hom_app,
          Functor.map_comp, eqToHom_map, Category.assoc, eqToHom_trans_assoc,
          eqToHom_refl, Category.id_comp, eqToHom_app, Induced.zero_inv_app_obj]
        erw [← NatTrans.naturality_assoc, Iso.hom_inv_id_app_assoc]
        rfl
      add_zero_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF n 0).hom =
            eqToHom (by 

Proof state:
C : Type ?u.46399
D : Type ?u.46402
inst✝³ : Category.{?u.46406, ?u.46399} C
inst✝² : Category.{?u.46410, ?u.46402} D
F : C ⥤ D
A : Type ?u.46441
inst✝¹ : AddMonoid A
inst✝ : HasShift C A
s : A → D ⥤ D
i : (a : A) → F ⋙ s a ≅ shiftFunctor C a ⋙ F
hF : Nonempty (Full ((whiskeringLeft C D D).obj F)) ∧ Faithful ((whiskeringLeft C D D).obj F)
n : A
this : Faithful ((whiskeringLeft C D D).obj F)
⊢ s (n + 0) = s n ⋙ 𝟭 D

Next tactic:
rw [add_zero]
/-- When `F : C ⥤ D` is a functor satisfying suitable technical assumptions,
this is the induced term of type `HasShift D A` deduced from `[HasShift C A]`. -/
noncomputable def induced : HasShift D A :=
  hasShiftMk D A
    { F := s
      zero := Induced.zero F s i hF
      add := Induced.add F s i hF
      zero_add_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF 0 n).hom =
          eqToHom (by rw [zero_add]; rfl) ≫ whiskerRight (Induced.zero F s i hF).inv (s n) by
          intro X
          simpa using NatTrans.congr_app this X
        apply ((whiskeringLeft C D D).obj F).map_injective
        ext X
        have eq := dcongr_arg (fun a => (i a).hom.app X) (zero_add n)
        dsimp
        simp only [Induced.add_hom_app_obj, eq, shiftFunctorAdd_zero_add_hom_app,
          Functor.map_comp, eqToHom_map, Category.assoc, eqToHom_trans_assoc,
          eqToHom_refl, Category.id_comp, eqToHom_app, Induced.zero_inv_app_obj]
        erw [← NatTrans.naturality_assoc, Iso.hom_inv_id_app_assoc]
        rfl
      add_zero_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF n 0).hom =
            eqToHom (by rw [add_zero]; 

Proof state:
C : Type ?u.46399
D : Type ?u.46402
inst✝³ : Category.{?u.46406, ?u.46399} C
inst✝² : Category.{?u.46410, ?u.46402} D
F : C ⥤ D
A : Type ?u.46441
inst✝¹ : AddMonoid A
inst✝ : HasShift C A
s : A → D ⥤ D
i : (a : A) → F ⋙ s a ≅ shiftFunctor C a ⋙ F
hF : Nonempty (Full ((whiskeringLeft C D D).obj F)) ∧ Faithful ((whiskeringLeft C D D).obj F)
n : A
this : Faithful ((whiskeringLeft C D D).obj F)
⊢ s n = s n ⋙ 𝟭 D

Next tactic:
rfl
/-- When `F : C ⥤ D` is a functor satisfying suitable technical assumptions,
this is the induced term of type `HasShift D A` deduced from `[HasShift C A]`. -/
noncomputable def induced : HasShift D A :=
  hasShiftMk D A
    { F := s
      zero := Induced.zero F s i hF
      add := Induced.add F s i hF
      zero_add_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF 0 n).hom =
          eqToHom (by rw [zero_add]; rfl) ≫ whiskerRight (Induced.zero F s i hF).inv (s n) by
          intro X
          simpa using NatTrans.congr_app this X
        apply ((whiskeringLeft C D D).obj F).map_injective
        ext X
        have eq := dcongr_arg (fun a => (i a).hom.app X) (zero_add n)
        dsimp
        simp only [Induced.add_hom_app_obj, eq, shiftFunctorAdd_zero_add_hom_app,
          Functor.map_comp, eqToHom_map, Category.assoc, eqToHom_trans_assoc,
          eqToHom_refl, Category.id_comp, eqToHom_app, Induced.zero_inv_app_obj]
        erw [← NatTrans.naturality_assoc, Iso.hom_inv_id_app_assoc]
        rfl
      add_zero_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF n 0).hom =
            eqToHom (by rw [add_zero]; rfl) ≫ whiskerLeft (s n) (Induced.zero F s i hF).inv by
          

Proof state:
C : Type ?u.46399
D : Type ?u.46402
inst✝³ : Category.{?u.46406, ?u.46399} C
inst✝² : Category.{?u.46410, ?u.46402} D
F : C ⥤ D
A : Type ?u.46441
inst✝¹ : AddMonoid A
inst✝ : HasShift C A
s : A → D ⥤ D
i : (a : A) → F ⋙ s a ≅ shiftFunctor C a ⋙ F
hF : Nonempty (Full ((whiskeringLeft C D D).obj F)) ∧ Faithful ((whiskeringLeft C D D).obj F)
n : A
this✝ : Faithful ((whiskeringLeft C D D).obj F)
this :
  (Induced.add F s i hF n 0).hom = eqToHom (_ : s (n + 0) = s n ⋙ 𝟭 D) ≫ whiskerLeft (s n) (Induced.zero F s i hF).inv
⊢ ∀ (X : D),
    (Induced.add F s i hF n 0).hom.app X =
      eqToHom (_ : (s (n + 0)).obj X = (𝟭 D).obj ((s n).obj X)) ≫ (Induced.zero F s i hF).inv.app ((s n).obj X)

Next tactic:
intro X
/-- When `F : C ⥤ D` is a functor satisfying suitable technical assumptions,
this is the induced term of type `HasShift D A` deduced from `[HasShift C A]`. -/
noncomputable def induced : HasShift D A :=
  hasShiftMk D A
    { F := s
      zero := Induced.zero F s i hF
      add := Induced.add F s i hF
      zero_add_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF 0 n).hom =
          eqToHom (by rw [zero_add]; rfl) ≫ whiskerRight (Induced.zero F s i hF).inv (s n) by
          intro X
          simpa using NatTrans.congr_app this X
        apply ((whiskeringLeft C D D).obj F).map_injective
        ext X
        have eq := dcongr_arg (fun a => (i a).hom.app X) (zero_add n)
        dsimp
        simp only [Induced.add_hom_app_obj, eq, shiftFunctorAdd_zero_add_hom_app,
          Functor.map_comp, eqToHom_map, Category.assoc, eqToHom_trans_assoc,
          eqToHom_refl, Category.id_comp, eqToHom_app, Induced.zero_inv_app_obj]
        erw [← NatTrans.naturality_assoc, Iso.hom_inv_id_app_assoc]
        rfl
      add_zero_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF n 0).hom =
            eqToHom (by rw [add_zero]; rfl) ≫ whiskerLeft (s n) (Induced.zero F s i hF).inv by
          intro X
          

Proof state:
C : Type ?u.46399
D : Type ?u.46402
inst✝³ : Category.{?u.46406, ?u.46399} C
inst✝² : Category.{?u.46410, ?u.46402} D
F : C ⥤ D
A : Type ?u.46441
inst✝¹ : AddMonoid A
inst✝ : HasShift C A
s : A → D ⥤ D
i : (a : A) → F ⋙ s a ≅ shiftFunctor C a ⋙ F
hF : Nonempty (Full ((whiskeringLeft C D D).obj F)) ∧ Faithful ((whiskeringLeft C D D).obj F)
n : A
this✝ : Faithful ((whiskeringLeft C D D).obj F)
this :
  (Induced.add F s i hF n 0).hom = eqToHom (_ : s (n + 0) = s n ⋙ 𝟭 D) ≫ whiskerLeft (s n) (Induced.zero F s i hF).inv
X : D
⊢ (Induced.add F s i hF n 0).hom.app X =
    eqToHom (_ : (s (n + 0)).obj X = (𝟭 D).obj ((s n).obj X)) ≫ (Induced.zero F s i hF).inv.app ((s n).obj X)

Next tactic:
simpa using NatTrans.congr_app this X
/-- When `F : C ⥤ D` is a functor satisfying suitable technical assumptions,
this is the induced term of type `HasShift D A` deduced from `[HasShift C A]`. -/
noncomputable def induced : HasShift D A :=
  hasShiftMk D A
    { F := s
      zero := Induced.zero F s i hF
      add := Induced.add F s i hF
      zero_add_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF 0 n).hom =
          eqToHom (by rw [zero_add]; rfl) ≫ whiskerRight (Induced.zero F s i hF).inv (s n) by
          intro X
          simpa using NatTrans.congr_app this X
        apply ((whiskeringLeft C D D).obj F).map_injective
        ext X
        have eq := dcongr_arg (fun a => (i a).hom.app X) (zero_add n)
        dsimp
        simp only [Induced.add_hom_app_obj, eq, shiftFunctorAdd_zero_add_hom_app,
          Functor.map_comp, eqToHom_map, Category.assoc, eqToHom_trans_assoc,
          eqToHom_refl, Category.id_comp, eqToHom_app, Induced.zero_inv_app_obj]
        erw [← NatTrans.naturality_assoc, Iso.hom_inv_id_app_assoc]
        rfl
      add_zero_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF n 0).hom =
            eqToHom (by rw [add_zero]; rfl) ≫ whiskerLeft (s n) (Induced.zero F s i hF).inv by
          intro X
          simpa using NatTrans.congr_app this X
        

Proof state:
C : Type ?u.46399
D : Type ?u.46402
inst✝³ : Category.{?u.46406, ?u.46399} C
inst✝² : Category.{?u.46410, ?u.46402} D
F : C ⥤ D
A : Type ?u.46441
inst✝¹ : AddMonoid A
inst✝ : HasShift C A
s : A → D ⥤ D
i : (a : A) → F ⋙ s a ≅ shiftFunctor C a ⋙ F
hF : Nonempty (Full ((whiskeringLeft C D D).obj F)) ∧ Faithful ((whiskeringLeft C D D).obj F)
n : A
this : Faithful ((whiskeringLeft C D D).obj F)
⊢ (Induced.add F s i hF n 0).hom = eqToHom (_ : s (n + 0) = s n ⋙ 𝟭 D) ≫ whiskerLeft (s n) (Induced.zero F s i hF).inv

Next tactic:
apply ((whiskeringLeft C D D).obj F).map_injective
/-- When `F : C ⥤ D` is a functor satisfying suitable technical assumptions,
this is the induced term of type `HasShift D A` deduced from `[HasShift C A]`. -/
noncomputable def induced : HasShift D A :=
  hasShiftMk D A
    { F := s
      zero := Induced.zero F s i hF
      add := Induced.add F s i hF
      zero_add_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF 0 n).hom =
          eqToHom (by rw [zero_add]; rfl) ≫ whiskerRight (Induced.zero F s i hF).inv (s n) by
          intro X
          simpa using NatTrans.congr_app this X
        apply ((whiskeringLeft C D D).obj F).map_injective
        ext X
        have eq := dcongr_arg (fun a => (i a).hom.app X) (zero_add n)
        dsimp
        simp only [Induced.add_hom_app_obj, eq, shiftFunctorAdd_zero_add_hom_app,
          Functor.map_comp, eqToHom_map, Category.assoc, eqToHom_trans_assoc,
          eqToHom_refl, Category.id_comp, eqToHom_app, Induced.zero_inv_app_obj]
        erw [← NatTrans.naturality_assoc, Iso.hom_inv_id_app_assoc]
        rfl
      add_zero_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF n 0).hom =
            eqToHom (by rw [add_zero]; rfl) ≫ whiskerLeft (s n) (Induced.zero F s i hF).inv by
          intro X
          simpa using NatTrans.congr_app this X
        apply ((whiskeringLeft C D D).obj F).map_injective
        

Proof state:
case a
C : Type ?u.46399
D : Type ?u.46402
inst✝³ : Category.{?u.46406, ?u.46399} C
inst✝² : Category.{?u.46410, ?u.46402} D
F : C ⥤ D
A : Type ?u.46441
inst✝¹ : AddMonoid A
inst✝ : HasShift C A
s : A → D ⥤ D
i : (a : A) → F ⋙ s a ≅ shiftFunctor C a ⋙ F
hF : Nonempty (Full ((whiskeringLeft C D D).obj F)) ∧ Faithful ((whiskeringLeft C D D).obj F)
n : A
this : Faithful ((whiskeringLeft C D D).obj F)
⊢ ((whiskeringLeft C D D).obj F).map (Induced.add F s i hF n 0).hom =
    ((whiskeringLeft C D D).obj F).map
      (eqToHom (_ : s (n + 0) = s n ⋙ 𝟭 D) ≫ whiskerLeft (s n) (Induced.zero F s i hF).inv)

Next tactic:
ext X
/-- When `F : C ⥤ D` is a functor satisfying suitable technical assumptions,
this is the induced term of type `HasShift D A` deduced from `[HasShift C A]`. -/
noncomputable def induced : HasShift D A :=
  hasShiftMk D A
    { F := s
      zero := Induced.zero F s i hF
      add := Induced.add F s i hF
      zero_add_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF 0 n).hom =
          eqToHom (by rw [zero_add]; rfl) ≫ whiskerRight (Induced.zero F s i hF).inv (s n) by
          intro X
          simpa using NatTrans.congr_app this X
        apply ((whiskeringLeft C D D).obj F).map_injective
        ext X
        have eq := dcongr_arg (fun a => (i a).hom.app X) (zero_add n)
        dsimp
        simp only [Induced.add_hom_app_obj, eq, shiftFunctorAdd_zero_add_hom_app,
          Functor.map_comp, eqToHom_map, Category.assoc, eqToHom_trans_assoc,
          eqToHom_refl, Category.id_comp, eqToHom_app, Induced.zero_inv_app_obj]
        erw [← NatTrans.naturality_assoc, Iso.hom_inv_id_app_assoc]
        rfl
      add_zero_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF n 0).hom =
            eqToHom (by rw [add_zero]; rfl) ≫ whiskerLeft (s n) (Induced.zero F s i hF).inv by
          intro X
          simpa using NatTrans.congr_app this X
        apply ((whiskeringLeft C D D).obj F).map_injective
        ext X
        

Proof state:
case a.w.h
C : Type ?u.46399
D : Type ?u.46402
inst✝³ : Category.{?u.46406, ?u.46399} C
inst✝² : Category.{?u.46410, ?u.46402} D
F : C ⥤ D
A : Type ?u.46441
inst✝¹ : AddMonoid A
inst✝ : HasShift C A
s : A → D ⥤ D
i : (a : A) → F ⋙ s a ≅ shiftFunctor C a ⋙ F
hF : Nonempty (Full ((whiskeringLeft C D D).obj F)) ∧ Faithful ((whiskeringLeft C D D).obj F)
n : A
this : Faithful ((whiskeringLeft C D D).obj F)
X : C
⊢ (((whiskeringLeft C D D).obj F).map (Induced.add F s i hF n 0).hom).app X =
    (((whiskeringLeft C D D).obj F).map
          (eqToHom (_ : s (n + 0) = s n ⋙ 𝟭 D) ≫ whiskerLeft (s n) (Induced.zero F s i hF).inv)).app
      X

Next tactic:
dsimp
/-- When `F : C ⥤ D` is a functor satisfying suitable technical assumptions,
this is the induced term of type `HasShift D A` deduced from `[HasShift C A]`. -/
noncomputable def induced : HasShift D A :=
  hasShiftMk D A
    { F := s
      zero := Induced.zero F s i hF
      add := Induced.add F s i hF
      zero_add_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF 0 n).hom =
          eqToHom (by rw [zero_add]; rfl) ≫ whiskerRight (Induced.zero F s i hF).inv (s n) by
          intro X
          simpa using NatTrans.congr_app this X
        apply ((whiskeringLeft C D D).obj F).map_injective
        ext X
        have eq := dcongr_arg (fun a => (i a).hom.app X) (zero_add n)
        dsimp
        simp only [Induced.add_hom_app_obj, eq, shiftFunctorAdd_zero_add_hom_app,
          Functor.map_comp, eqToHom_map, Category.assoc, eqToHom_trans_assoc,
          eqToHom_refl, Category.id_comp, eqToHom_app, Induced.zero_inv_app_obj]
        erw [← NatTrans.naturality_assoc, Iso.hom_inv_id_app_assoc]
        rfl
      add_zero_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF n 0).hom =
            eqToHom (by rw [add_zero]; rfl) ≫ whiskerLeft (s n) (Induced.zero F s i hF).inv by
          intro X
          simpa using NatTrans.congr_app this X
        apply ((whiskeringLeft C D D).obj F).map_injective
        ext X
        dsimp
        

Proof state:
case a.w.h
C : Type ?u.46399
D : Type ?u.46402
inst✝³ : Category.{?u.46406, ?u.46399} C
inst✝² : Category.{?u.46410, ?u.46402} D
F : C ⥤ D
A : Type ?u.46441
inst✝¹ : AddMonoid A
inst✝ : HasShift C A
s : A → D ⥤ D
i : (a : A) → F ⋙ s a ≅ shiftFunctor C a ⋙ F
hF : Nonempty (Full ((whiskeringLeft C D D).obj F)) ∧ Faithful ((whiskeringLeft C D D).obj F)
n : A
this : Faithful ((whiskeringLeft C D D).obj F)
X : C
⊢ (Induced.add F s i hF n 0).hom.app (F.obj X) =
    (eqToHom (_ : s (n + 0) = s n ⋙ 𝟭 D)).app (F.obj X) ≫ (Induced.zero F s i hF).inv.app ((s n).obj (F.obj X))

Next tactic:
erw [Induced.add_hom_app_obj, dcongr_arg (fun a => (i a).hom.app X) (add_zero n),
          ← cancel_mono ((s 0).map ((i n).hom.app X)), Category.assoc,
          Category.assoc, Category.assoc, Category.assoc, Category.assoc,
          Category.assoc, ← (s 0).map_comp, Iso.inv_hom_id_app, Functor.map_id, Category.comp_id,
          ← NatTrans.naturality, Induced.zero_inv_app_obj,
          shiftFunctorAdd_add_zero_hom_app]
/-- When `F : C ⥤ D` is a functor satisfying suitable technical assumptions,
this is the induced term of type `HasShift D A` deduced from `[HasShift C A]`. -/
noncomputable def induced : HasShift D A :=
  hasShiftMk D A
    { F := s
      zero := Induced.zero F s i hF
      add := Induced.add F s i hF
      zero_add_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF 0 n).hom =
          eqToHom (by rw [zero_add]; rfl) ≫ whiskerRight (Induced.zero F s i hF).inv (s n) by
          intro X
          simpa using NatTrans.congr_app this X
        apply ((whiskeringLeft C D D).obj F).map_injective
        ext X
        have eq := dcongr_arg (fun a => (i a).hom.app X) (zero_add n)
        dsimp
        simp only [Induced.add_hom_app_obj, eq, shiftFunctorAdd_zero_add_hom_app,
          Functor.map_comp, eqToHom_map, Category.assoc, eqToHom_trans_assoc,
          eqToHom_refl, Category.id_comp, eqToHom_app, Induced.zero_inv_app_obj]
        erw [← NatTrans.naturality_assoc, Iso.hom_inv_id_app_assoc]
        rfl
      add_zero_hom_app := fun n => by
        have := hF.2
        suffices (Induced.add F s i hF n 0).hom =
            eqToHom (by rw [add_zero]; rfl) ≫ whiskerLeft (s n) (Induced.zero F s i hF).inv by
          intro X
          simpa using NatTrans.congr_app this X
        apply ((whiskeringLeft C D D).obj F).map_injective
        ext X
        dsimp
        erw [Induced.add_hom_app_obj, dcongr_arg (fun a => (i a).hom.app X) (add_zero n),
          ← cancel_mono ((s 0).map ((i n).hom.app X)), Category.assoc,
          Category.assoc, Category.assoc, Category.assoc, Category.assoc,
          Category.assoc, ← (s 0).map_comp, Iso.inv_hom_id_app, Functor.map_id, Category.comp_id,
          ← NatTrans.naturality, Induced.zero_inv_app_obj,
          shiftFunctorAdd_add_zero_hom_app]
        

Proof state:
case a.w.h
C : Type ?u.46399
D : Type ?u.46402
inst✝³ : Category.{?u.46406, ?u.46399} C
inst✝² : Category.{?u.46410, ?u.46402} D
F : C ⥤ D
A : Type ?u.46441
inst✝¹ : AddMonoid A
inst✝ : HasShift C A
s : A → D ⥤ D
i : (a : A) → F ⋙ s a ≅ shiftFunctor C a ⋙ F
hF : Nonempty (Full ((whiskeringLeft C D D).obj F)) ∧ Faithful ((whiskeringLeft C D D).obj F)
n : A
this : Faithful ((whiskeringLeft C D D).obj F)
X : C
⊢ eqToHom (_ : (F ⋙ s (n + 0)).obj X = (F ⋙ s n).obj X) ≫
      (i n).hom.app X ≫
        eqToHom (_ : (shiftFunctor C n ⋙ F).obj X = (shiftFunctor C (n + 0) ⋙ F).obj X) ≫
          F.map
              (eqToHom (_ : (shiftFunctor C (n + 0)).obj X = (𝟭 C).obj ((shiftFunctor C n).obj X)) ≫
                (shiftFunctorZero C A).inv.app ((shiftFunctor C n).obj X)) ≫
            (i 0).inv.app ((shiftFunctor C n).obj X) =
    (eqToHom (_ : s (n + 0) = s n ⋙ 𝟭 D)).app (F.obj X) ≫
      (𝟭 D).map ((i n).hom.app X) ≫
        F.map ((shiftFunctorZero C A).inv.app ((shiftFunctor C n).obj X)) ≫ (i 0).inv.app ((shiftFunctor C n).obj X)

Next tactic:
simp [eqToHom_map, eqToHom_app]
@[simp]
lemma shiftFunctor_of_induced (a : A) :
    letI := HasShift.induced F A s i hF
    shiftFunctor D a = s a := by
  

Proof state:
C : Type u_4
D : Type u_1
inst✝³ : Category.{u_5, u_4} C
inst✝² : Category.{u_2, u_1} D
F : C ⥤ D
A : Type u_3
inst✝¹ : AddMonoid A
inst✝ : HasShift C A
s : A → D ⥤ D
i : (a : A) → F ⋙ s a ≅ shiftFunctor C a ⋙ F
hF : Nonempty (Full ((whiskeringLeft C D D).obj F)) ∧ Faithful ((whiskeringLeft C D D).obj F)
a : A
⊢ shiftFunctor D a = s a

Next tactic:
rfl
@[simp]
lemma shiftFunctorZero_hom_app_obj_of_induced (X : C) :
    letI := HasShift.induced F A s i hF
    (shiftFunctorZero D A).hom.app (F.obj X) =
      (i 0).hom.app X ≫ F.map ((shiftFunctorZero C A).hom.app X) := by
  

Proof state:
C : Type u_4
D : Type u_2
inst✝³ : Category.{u_5, u_4} C
inst✝² : Category.{u_1, u_2} D
F : C ⥤ D
A : Type u_3
inst✝¹ : AddMonoid A
inst✝ : HasShift C A
s : A → D ⥤ D
i : (a : A) → F ⋙ s a ≅ shiftFunctor C a ⋙ F
hF : Nonempty (Full ((whiskeringLeft C D D).obj F)) ∧ Faithful ((whiskeringLeft C D D).obj F)
X : C
⊢ (shiftFunctorZero D A).hom.app (F.obj X) = (i 0).hom.app X ≫ F.map ((shiftFunctorZero C A).hom.app X)

Next tactic:
letI := HasShift.induced F A s i
@[simp]
lemma shiftFunctorZero_hom_app_obj_of_induced (X : C) :
    letI := HasShift.induced F A s i hF
    (shiftFunctorZero D A).hom.app (F.obj X) =
      (i 0).hom.app X ≫ F.map ((shiftFunctorZero C A).hom.app X) := by
  letI := HasShift.induced F A s i
  

Proof state:
C : Type u_4
D : Type u_2
inst✝³ : Category.{u_5, u_4} C
inst✝² : Category.{u_1, u_2} D
F : C ⥤ D
A : Type u_3
inst✝¹ : AddMonoid A
inst✝ : HasShift C A
s : A → D ⥤ D
i : (a : A) → F ⋙ s a ≅ shiftFunctor C a ⋙ F
hF : Nonempty (Full ((whiskeringLeft C D D).obj F)) ∧ Faithful ((whiskeringLeft C D D).obj F)
X : C
this : Nonempty (Full ((whiskeringLeft C D D).obj F)) ∧ Faithful ((whiskeringLeft C D D).obj F) → HasShift D A :=
  HasShift.induced F A s i
⊢ (shiftFunctorZero D A).hom.app (F.obj X) = (i 0).hom.app X ≫ F.map ((shiftFunctorZero C A).hom.app X)

Next tactic:
simp only [ShiftMkCore.shiftFunctorZero_eq, HasShift.Induced.zero_hom_app_obj]