set_option warn.classDefReducibility false /-! This is a minimization of an issue widely seen in Mathlib after https://github.com/leanprover/lean4/pull/2793. We find that we need to either specify a named argument or use `..` in certain rewrites. -/ section Mathlib.Data.FunLike.Basic class DFunLike (F : Sort _) (α : outParam (Sort _)) (β : outParam <| α → Sort _) where coe : F → ∀ a : α, β a abbrev FunLike F α β := DFunLike F α fun _ => β instance (priority := 100) hasCoeToFun {F α β} [_i : DFunLike F α β] : CoeFun F (fun _ ↦ ∀ a : α, β a) where coe := @DFunLike.coe _ _ β _ end Mathlib.Data.FunLike.Basic section Mathlib.Algebra.Group.Hom.Defs variable {M N : Type _} variable {F : Type _} class ZeroHomClass (F : Type _) (M N : outParam (Type _)) [Zero M] [Zero N] [FunLike F M N] : Prop where map_zero : ∀ f : F, f 0 = 0 variable [Zero M] [Zero N] [FunLike F M N] theorem map_zero [ZeroHomClass F M N] (f : F) : f 0 = 0 := ZeroHomClass.map_zero f end Mathlib.Algebra.Group.Hom.Defs section Mathlib.GroupTheory.GroupAction.Defs variable {M A : Type _} class SMulZeroClass (M A : Type _) [Zero A] extends SMul M A where smul_zero : ∀ a : M, a • (0 : A) = 0 @[simp] theorem smul_zero [Zero A] [SMulZeroClass M A] (a : M) : a • (0 : A) = 0 := SMulZeroClass.smul_zero _ end Mathlib.GroupTheory.GroupAction.Defs section Mathlib.Algebra.SMulWithZero variable (R M) class SMulWithZero [Zero R] [Zero M] extends SMulZeroClass R M where @[simp] theorem zero_smul {M} [Zero R] [Zero M] [SMulWithZero R M] (m : M) : (0 : R) • m = 0 := sorry end Mathlib.Algebra.SMulWithZero section Mathlib.GroupTheory.GroupAction.Hom class MulActionSemiHomClass (F : Type _) {M N : outParam (Type _)} (φ : outParam (M → N)) (X Y : outParam (Type _)) [SMul M X] [SMul N Y] [FunLike F X Y] : Prop where map_smulₛₗ : ∀ (f : F) (c : M) (x : X), f (c • x) = (φ c) • (f x) export MulActionSemiHomClass (map_smulₛₗ) end Mathlib.GroupTheory.GroupAction.Hom section Mathlib.Algebra.Module.LinearMap.Defs variable {R S S₃ T M M₃ : Type _} class LinearMapClass (F : Type _) (R : outParam (Type _)) (M M₂ : outParam (Type _)) [Add M] [Add M₂] [SMul R M] [SMul R M₂] [FunLike F M M₂] : Prop extends MulActionSemiHomClass F (id : R → R) M M₂ variable (F : Type _) variable [Zero R] variable [Zero M] [Add M] [Zero M₃] [Add M₃] variable [SMulWithZero R M] [SMulWithZero R M₃] def inst1 [FunLike F M M₃] [LinearMapClass F R M M₃] : ZeroHomClass F M M₃ := { map_zero := fun f ↦ show f 0 = 0 by rw [← zero_smul R (0 : M), @map_smulₛₗ] simp only [id_eq, zero_smul] } def inst2 [FunLike F M M₃] [LinearMapClass F R M M₃] : ZeroHomClass F M M₃ := { map_zero := fun f ↦ show f 0 = 0 by rw [← zero_smul R (0 : M), map_smulₛₗ (N := R)] simp only [id_eq, zero_smul] } def inst3 [FunLike F M M₃] [LinearMapClass F R M M₃] : ZeroHomClass F M M₃ := { map_zero := fun f ↦ show f 0 = 0 by rw [← zero_smul R (0 : M), map_smulₛₗ ] simp only [id_eq, zero_smul] } def inst4 [FunLike F M M₃] [LinearMapClass F R M M₃] : ZeroHomClass F M M₃ := { map_zero := fun f ↦ show f 0 = 0 by rw [← zero_smul R (0 : M), map_smulₛₗ ..] simp only [id_eq, zero_smul] } end Mathlib.Algebra.Module.LinearMap.Defs