Built with doc-gen4, running Lean4. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓to navigate, Ctrl+🖱️to focus. On Mac, use Cmdinstead of Ctrl.
/-
Copyright (c) 2021 Anne Baanen. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Anne Baanen

! This file was ported from Lean 3 source module data.fun_like.basic
! leanprover-community/mathlib commit a148d797a1094ab554ad4183a4ad6f130358ef64
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Logic.Function.Basic
import Mathlib.Tactic.NormCast

/-!
# Typeclass for a type `F` with an injective map to `A → B`

This typeclass is primarily for use by homomorphisms like `MonoidHom` and `LinearMap`.

## Basic usage of `FunLike`

A typical type of morphisms should be declared as:
```
structure MyHom (A B : Type _) [MyClass A] [MyClass B] :=
(toFun : A → B)
(map_op' : ∀ {x y : A}, toFun (MyClass.op x y) = MyClass.op (toFun x) (toFun y))

namespace MyHom

variables (A B : Type _) [MyClass A] [MyClass B]

-- This instance is optional if you follow the "morphism class" design below:
instance : FunLike (MyHom A B) A (λ _, B) :=
{ coe := MyHom.toFun, coe_injective' := λ f g h, by cases f; cases g; congr' }

/-- Helper instance for when there's too many metavariables to apply
`FunLike.coe` directly. -/
instance : CoeFun (MyHom A B) (λ _, A → B) := ⟨MyHom.toFun⟩

@[ext] theorem ext {f g : MyHom A B} (h : ∀ x, f x = g x) : f = g := FunLike.ext f g h

/-- Copy of a `MyHom` with a new `toFun` equal to the old one. Useful to fix definitional
equalities. -/
protected def copy (f : MyHom A B) (f' : A → B) (h : f' = ⇑f) : MyHom A B :=
{ toFun := f',
  map_op' := h.symm ▸ f.map_op' }

end MyHom
```

This file will then provide a `CoeFun` instance and various
extensionality and simp lemmas.

## Morphism classes extending `FunLike`

The `FunLike` design provides further benefits if you put in a bit more work.
The first step is to extend `FunLike` to create a class of those types satisfying
the axioms of your new type of morphisms.
Continuing the example above:

```
/-- `MyHomClass F A B` states that `F` is a type of `MyClass.op`-preserving morphisms.
You should extend this class when you extend `MyHom`. -/
class MyHomClass (F : Type _) (A B : outParam <| Type _) [MyClass A] [MyClass B]
  extends FunLike F A (λ _, B) :=
(map_op : ∀ (f : F) (x y : A), f (MyClass.op x y) = MyClass.op (f x) (f y))

@[simp] lemma map_op {F A B : Type _} [MyClass A] [MyClass B] [MyHomClass F A B]
  (f : F) (x y : A) : f (MyClass.op x y) = MyClass.op (f x) (f y) :=
MyHomClass.map_op

-- You can replace `MyHom.FunLike` with the below instance:
instance : MyHomClass (MyHom A B) A B :=
{ coe := MyHom.toFun,
  coe_injective' := λ f g h, by cases f; cases g; congr',
  map_op := MyHom.map_op' }

-- [Insert `CoeFun`, `ext` and `copy` here]
```

The second step is to add instances of your new `MyHomClass` for all types extending `MyHom`.
Typically, you can just declare a new class analogous to `MyHomClass`:

```
structure CoolerHom (A B : Type _) [CoolClass A] [CoolClass B]
  extends MyHom A B :=
(map_cool' : toFun CoolClass.cool = CoolClass.cool)

class CoolerHomClass (F : Type _) (A B : outParam <| Type _) [CoolClass A] [CoolClass B]
  extends MyHomClass F A B :=
(map_cool : ∀ (f : F), f CoolClass.cool = CoolClass.cool)

@[simp] lemma map_cool {F A B : Type _} [CoolClass A] [CoolClass B] [CoolerHomClass F A B]
  (f : F) : f CoolClass.cool = CoolClass.cool :=
MyHomClass.map_op

-- You can also replace `MyHom.FunLike` with the below instance:
instance : CoolerHomClass (CoolHom A B) A B :=
{ coe := CoolHom.toFun,
  coe_injective' := λ f g h, by cases f; cases g; congr',
  map_op := CoolHom.map_op',
  map_cool := CoolHom.map_cool' }

-- [Insert `CoeFun`, `ext` and `copy` here]
```

Then any declaration taking a specific type of morphisms as parameter can instead take the
class you just defined:
```
-- Compare with: lemma do_something (f : MyHom A B) : sorry := sorry
lemma do_something {F : Type _} [MyHomClass F A B] (f : F) : sorry := sorry
```

This means anything set up for `MyHom`s will automatically work for `CoolerHomClass`es,
and defining `CoolerHomClass` only takes a constant amount of effort,
instead of linearly increasing the work per `MyHom`-related declaration.

-/

-- This instance should have low priority, to ensure we follow the chain
-- `FunLike → CoeFun`
-- Porting note: this is an elaboration detail from Lean 3, we are going to disable it
-- until it is clearer what the Lean 4 elaborator needs.
-- attribute [instance, priority 10] coe_fn_trans

/-- The class `FunLike F α β` expresses that terms of type `F` have an
injective coercion to functions from `α` to `β`.

This typeclass is used in the definition of the homomorphism typeclasses,
such as `ZeroHomClass`, `MulHomClass`, `MonoidHomClass`, ....
-/
@[notation_class * toFun Simps.findCoercionArgs]
class 
FunLike: Sort u_1 → (α : outParam (Sort u_2)) → outParam (αSort u_3)Sort (max(max(max1u_1)u_2)u_3)
FunLike
(
F: Sort ?u.2
F
:
Sort _: Type ?u.2
Sort
Sort _: Type ?u.2
_
) (
α: outParam (Sort ?u.6)
α
:
outParam: Sort ?u.5 → Sort ?u.5
outParam
(
Sort _: Type ?u.6
Sort
Sort _: Type ?u.6
_
)) (
β: outParam (αSort ?u.12)
β
:
outParam: Sort ?u.9 → Sort ?u.9
outParam
<|
α: outParam (Sort ?u.6)
α
Sort _: Type ?u.12
Sort
Sort _: Type ?u.12
_
) where /-- The coercion from `F` to a function. -/
coe: {F : Sort u_1} → {α : outParam (Sort u_2)} → {β : outParam (αSort u_3)} → [self : FunLike F α β] → F(a : α) → β a
coe
:
F: Sort ?u.2
F
→ ∀
a: α
a
:
α: outParam (Sort ?u.6)
α
,
β: outParam (αSort ?u.12)
β
a: α
a
/-- The coercion to functions must be injective. -/
coe_injective': ∀ {F : Sort u_1} {α : outParam (Sort u_2)} {β : outParam (αSort u_3)} [self : FunLike F α β], Function.Injective FunLike.coe
coe_injective'
:
Function.Injective: {α : Sort ?u.27} → {β : Sort ?u.26} → (αβ) → Prop
Function.Injective
coe: F(a : α) → β a
coe
#align fun_like
FunLike: Sort u_1 → (α : outParam (Sort u_2)) → outParam (αSort u_3)Sort (max(max(max1u_1)u_2)u_3)
FunLike
-- https://github.com/leanprover/lean4/issues/2096 compile_def%
FunLike.coe: {F : Sort u_1} → {α : outParam (Sort u_2)} → {β : outParam (αSort u_3)} → [self : FunLike F α β] → F(a : α) → β a
FunLike.coe
section Dependent /-! ### `FunLike F α β` where `β` depends on `a : α` -/ variable (
F: Sort ?u.127
F
α: Sort ?u.975
α
:
Sort _: Type ?u.2035
Sort
Sort _: Type ?u.2035
_
) (
β: αSort ?u.172
β
:
α: Sort ?u.141
α
Sort _: Type ?u.135
Sort
Sort _: Type ?u.135
_
) namespace FunLike variable {
F: ?m.149
F
α: ?m.152
α
β: ?m.155
β
} [
i: FunLike F α β
i
:
FunLike: Sort ?u.1154 → (α : outParam (Sort ?u.1153)) → outParam (αSort ?u.1152)Sort (max(max(max1?u.1154)?u.1153)?u.1152)
FunLike
F: ?m.149
F
α: Sort ?u.1832
α
β: ?m.155
β
] instance (priority := 100)
hasCoeToFun: {F : Sort u_1} → {α : Sort u_2} → {β : αSort u_3} → [i : FunLike F α β] → CoeFun F fun x => (a : α) → β a
hasCoeToFun
:
CoeFun: (α : Sort ?u.184) → outParam (αSort ?u.183)Sort (max(max1?u.184)?u.183)
CoeFun
F: Sort ?u.164
F
fun
_: ?m.186
_
↦ ∀
a: α
a
:
α: Sort ?u.167
α
,
β: αSort ?u.172
β
a: α
a
where coe :=
FunLike.coe: {F : Sort ?u.211} → {α : outParam (Sort ?u.210)} → {β : outParam (αSort ?u.209)} → [self : FunLike F α β] → F(a : α) → β a
FunLike.coe
#eval
Lean.Elab.Command.liftTermElabM: {α : Type} → Lean.Elab.TermElabM αLean.Elab.Command.CommandElabM α
Lean.Elab.Command.liftTermElabM
do
Std.Tactic.Coe.registerCoercion: Lean.NameoptParam (Option Std.Tactic.Coe.CoeFnInfo) noneLean.MetaM Unit
Std.Tactic.Coe.registerCoercion
``
FunLike.coe: {F : Sort u_1} → {α : outParam (Sort u_2)} → {β : outParam (αSort u_3)} → [self : FunLike F α β] → F(a : α) → β a
FunLike.coe
(
some: {α : Type ?u.395} → αOption α
some
{ numArgs :=
5: ?m.399
5
, coercee :=
4: ?m.409
4
, type := .coeFun }) -- @[simp] -- porting note: this loops in lean 4 theorem
coe_eq_coe_fn: coe = fun f => f
coe_eq_coe_fn
: (
FunLike.coe: {F : Sort ?u.994} → {α : outParam (Sort ?u.993)} → {β : outParam (αSort ?u.992)} → [self : FunLike F α β] → F(a : α) → β a
FunLike.coe
(F :=
F: Sort ?u.972
F
)) = (fun
f: ?m.1021
f
=> ↑
f: ?m.1021
f
) :=
rfl: ∀ {α : Sort ?u.1122} {a : α}, a = a
rfl
#align fun_like.coe_eq_coe_fn
FunLike.coe_eq_coe_fn: ∀ {F : Sort u_1} {α : Sort u_2} {β : αSort u_3} [i : FunLike F α β], coe = fun f => f
FunLike.coe_eq_coe_fn
theorem
coe_injective: Function.Injective fun f => f
coe_injective
:
Function.Injective: {α : Sort ?u.1161} → {β : Sort ?u.1160} → (αβ) → Prop
Function.Injective
(fun
f: F
f
:
F: Sort ?u.1141
F
↦ (
f: F
f
: ∀
a: α
a
:
α: Sort ?u.1144
α
,
β: αSort ?u.1149
β
a: α
a
)) :=
FunLike.coe_injective': ∀ {F : Sort ?u.1229} {α : outParam (Sort ?u.1228)} {β : outParam (αSort ?u.1227)} [self : FunLike F α β], Function.Injective coe
FunLike.coe_injective'
#align fun_like.coe_injective
FunLike.coe_injective: ∀ {F : Sort u_1} {α : Sort u_2} {β : αSort u_3} [i : FunLike F α β], Function.Injective fun f => f
FunLike.coe_injective
@[simp] theorem
coe_fn_eq: ∀ {F : Sort u_3} {α : Sort u_1} {β : αSort u_2} [i : FunLike F α β] {f g : F}, f = g f = g
coe_fn_eq
{
f: F
f
g: F
g
:
F: Sort ?u.1282
F
} : (
f: F
f
: ∀
a: α
a
:
α: Sort ?u.1285
α
,
β: αSort ?u.1290
β
a: α
a
) = (
g: F
g
: ∀
a: α
a
:
α: Sort ?u.1285
α
,
β: αSort ?u.1290
β
a: α
a
) ↔
f: F
f
=
g: F
g
:= ⟨fun
h: ?m.1426
h
FunLike.coe_injective': ∀ {F : Sort ?u.1430} {α : outParam (Sort ?u.1429)} {β : outParam (αSort ?u.1428)} [self : FunLike F α β], Function.Injective coe
FunLike.coe_injective'
h: ?m.1426
h
, fun
h: ?m.1486
h

Goals accomplished! 🐙
F: Sort u_3

α: Sort u_1

β: αSort u_2

i: FunLike F α β

f, g: F

h: f = g


f = g
F: Sort u_3

α: Sort u_1

β: αSort u_2

i: FunLike F α β

f: F


refl
f = f
F: Sort u_3

α: Sort u_1

β: αSort u_2

i: FunLike F α β

f: F


refl
f = f
F: Sort u_3

α: Sort u_1

β: αSort u_2

i: FunLike F α β

f, g: F

h: f = g


f = g

Goals accomplished! 🐙
#align fun_like.coe_fn_eq
FunLike.coe_fn_eq: ∀ {F : Sort u_3} {α : Sort u_1} {β : αSort u_2} [i : FunLike F α β] {f g : F}, f = g f = g
FunLike.coe_fn_eq
theorem
ext': ∀ {f g : F}, f = gf = g
ext'
{
f: F
f
g: F
g
:
F: Sort ?u.1625
F
} (
h: f = g
h
: (
f: F
f
: ∀
a: α
a
:
α: Sort ?u.1628
α
,
β: αSort ?u.1633
β
a: α
a
) = (
g: F
g
: ∀
a: α
a
:
α: Sort ?u.1628
α
,
β: αSort ?u.1633
β
a: α
a
)) :
f: F
f
=
g: F
g
:=
FunLike.coe_injective': ∀ {F : Sort ?u.1765} {α : outParam (Sort ?u.1764)} {β : outParam (αSort ?u.1763)} [self : FunLike F α β], Function.Injective coe
FunLike.coe_injective'
h: f = g
h
#align fun_like.ext'
FunLike.ext': ∀ {F : Sort u_3} {α : Sort u_1} {β : αSort u_2} [i : FunLike F α β] {f g : F}, f = gf = g
FunLike.ext'
theorem
ext'_iff: ∀ {f g : F}, f = g f = g
ext'_iff
{
f: F
f
g: F
g
:
F: Sort ?u.1829
F
} :
f: F
f
=
g: F
g
↔ (
f: F
f
: ∀
a: α
a
:
α: Sort ?u.1832
α
,
β: αSort ?u.1837
β
a: α
a
) = (
g: F
g
: ∀
a: α
a
:
α: Sort ?u.1832
α
,
β: αSort ?u.1837
β
a: α
a
) :=
coe_fn_eq: ∀ {F : Sort ?u.1966} {α : Sort ?u.1964} {β : αSort ?u.1965} [i : FunLike F α β] {f g : F}, f = g f = g
coe_fn_eq
.
symm: ∀ {a b : Prop}, (a b) → (b a)
symm
#align fun_like.ext'_iff
FunLike.ext'_iff: ∀ {F : Sort u_1} {α : Sort u_2} {β : αSort u_3} [i : FunLike F α β] {f g : F}, f = g f = g
FunLike.ext'_iff
theorem
ext: ∀ {F : Sort u_2} {α : Sort u_3} {β : αSort u_1} [i : FunLike F α β] (f g : F), (∀ (x : α), f x = g x) → f = g
ext
(
f: F
f
g: F
g
:
F: Sort ?u.2032
F
) (
h: ∀ (x : α), f x = g x
h
: ∀
x: α
x
:
α: Sort ?u.2035
α
,
f: F
f
x: α
x
=
g: F
g
x: α
x
) :
f: F
f
=
g: F
g
:=
FunLike.coe_injective': ∀ {F : Sort ?u.2164} {α : outParam (Sort ?u.2163)} {β : outParam (αSort ?u.2162)} [self : FunLike F α β], Function.Injective coe
FunLike.coe_injective'
(
funext: ∀ {α : Sort ?u.2183} {β : αSort ?u.2182} {f g : (x : α) → β x}, (∀ (x : α), f x = g x) → f = g
funext
h: ∀ (x : α), f x = g x
h
) #align fun_like.ext
FunLike.ext: ∀ {F : Sort u_2} {α : Sort u_3} {β : αSort u_1} [i : FunLike F α β] (f g : F), (∀ (x : α), f x = g x) → f = g
FunLike.ext
theorem
ext_iff: ∀ {f g : F}, f = g ∀ (x : α), f x = g x
ext_iff
{
f: F
f
g: F
g
:
F: Sort ?u.2247
F
} :
f: F
f
=
g: F
g
↔ ∀
x: ?m.2273
x
,
f: F
f
x: ?m.2273
x
=
g: F
g
x: ?m.2273
x
:=
coe_fn_eq: ∀ {F : Sort ?u.2378} {α : Sort ?u.2376} {β : αSort ?u.2377} [i : FunLike F α β] {f g : F}, f = g f = g
coe_fn_eq
.
symm: ∀ {a b : Prop}, (a b) → (b a)
symm
.
trans: ∀ {a b c : Prop}, (a b) → (b c) → (a c)
trans
Function.funext_iff: ∀ {α : Sort ?u.2410} {β : αSort ?u.2409} {f₁ f₂ : (x : α) → β x}, f₁ = f₂ ∀ (a : α), f₁ a = f₂ a
Function.funext_iff
#align fun_like.ext_iff
FunLike.ext_iff: ∀ {F : Sort u_1} {α : Sort u_3} {β : αSort u_2} [i : FunLike F α β] {f g : F}, f = g ∀ (x : α), f x = g x
FunLike.ext_iff
protected theorem
congr_fun: ∀ {F : Sort u_1} {α : Sort u_3} {β : αSort u_2} [i : FunLike F α β] {f g : F}, f = g∀ (x : α), f x = g x
congr_fun
{
f: F
f
g: F
g
:
F: Sort ?u.2467
F
} (
h₁: f = g
h₁
:
f: F
f
=
g: F
g
) (
x: α
x
:
α: Sort ?u.2470
α
) :
f: F
f
x: α
x
=
g: F
g
x: α
x
:=
congr_fun: ∀ {α : Sort ?u.2598} {β : αSort ?u.2597} {f g : (x : α) → β x}, f = g∀ (a : α), f a = g a
congr_fun
(
congr_arg: ∀ {α : Sort ?u.2604} {β : Sort ?u.2603} {a₁ a₂ : α} (f : αβ), a₁ = a₂f a₁ = f a₂
congr_arg
_: ?m.2605?m.2606
_
h₁: f = g
h₁
)
x: α
x
#align fun_like.congr_fun
FunLike.congr_fun: ∀ {F : Sort u_1} {α : Sort u_3} {β : αSort u_2} [i : FunLike F α β] {f g : F}, f = g∀ (x : α), f x = g x
FunLike.congr_fun
theorem
ne_iff: ∀ {f g : F}, f g a, f a g a
ne_iff
{
f: F
f
g: F
g
:
F: Sort ?u.2640
F
} :
f: F
f
g: F
g
↔ ∃
a: ?m.2668
a
,
f: F
f
a: ?m.2668
a
g: F
g
a: ?m.2668
a
:=
ext_iff: ∀ {F : Sort ?u.2771} {α : Sort ?u.2773} {β : αSort ?u.2772} [i : FunLike F α β] {f g : F}, f = g ∀ (x : α), f x = g x
ext_iff
.
not: ∀ {a b : Prop}, (a b) → (¬a ¬b)
not
.
trans: ∀ {a b c : Prop}, (a b) → (b c) → (a c)
trans
not_forall: ∀ {α : Sort ?u.2805} {p : αProp}, (¬∀ (x : α), p x) x, ¬p x
not_forall
#align fun_like.ne_iff
FunLike.ne_iff: ∀ {F : Sort u_1} {α : Sort u_2} {β : αSort u_3} [i : FunLike F α β] {f g : F}, f g a, f a g a
FunLike.ne_iff
theorem
exists_ne: ∀ {F : Sort u_1} {α : Sort u_2} {β : αSort u_3} [i : FunLike F α β] {f g : F}, f gx, f x g x
exists_ne
{
f: F
f
g: F
g
:
F: Sort ?u.2858
F
} (
h: f g
h
:
f: F
f
g: F
g
) : ∃
x: ?m.2888
x
,
f: F
f
x: ?m.2888
x
g: F
g
x: ?m.2888
x
:=
ne_iff: ∀ {F : Sort ?u.2992} {α : Sort ?u.2993} {β : αSort ?u.2994} [i : FunLike F α β] {f g : F}, f g a, f a g a
ne_iff
.
mp: ∀ {a b : Prop}, (a b) → ab
mp
h: f g
h
#align fun_like.exists_ne
FunLike.exists_ne: ∀ {F : Sort u_1} {α : Sort u_2} {β : αSort u_3} [i : FunLike F α β] {f g : F}, f gx, f x g x
FunLike.exists_ne
/-- This is not an instance to avoid slowing down every single `Subsingleton` typeclass search.-/ lemma
subsingleton_cod: ∀ {F : Sort u_2} {α : Sort u_3} {β : αSort u_1} [i : FunLike F α β] [inst : ∀ (a : α), Subsingleton (β a)], Subsingleton F
subsingleton_cod
[∀
a: ?m.3080
a
,
Subsingleton: Sort ?u.3083 → Prop
Subsingleton
(
β: αSort ?u.3068
β
a: ?m.3080
a
)] :
Subsingleton: Sort ?u.3087 → Prop
Subsingleton
F: Sort ?u.3060
F
:= ⟨fun
_: ?m.3096
_
_: ?m.3099
_
coe_injective: ∀ {F : Sort ?u.3101} {α : Sort ?u.3102} {β : αSort ?u.3103} [i : FunLike F α β], Function.Injective fun f => f
coe_injective
$
Subsingleton.elim: ∀ {α : Sort ?u.3121} [h : Subsingleton α] (a b : α), a = b
Subsingleton.elim
_: ?m.3122
_
_: ?m.3122
_
#align fun_like.subsingleton_cod
FunLike.subsingleton_cod: ∀ {F : Sort u_2} {α : Sort u_3} {β : αSort u_1} [i : FunLike F α β] [inst : ∀ (a : α), Subsingleton (β a)], Subsingleton F
FunLike.subsingleton_cod
end FunLike end Dependent section NonDependent /-! ### `FunLike F α (λ _, β)` where `β` does not depend on `a : α` -/ variable {
F: Sort ?u.3247
F
α: Sort ?u.3250
α
β: Sort ?u.3253
β
:
Sort _: Type ?u.3253
Sort
Sort _: Type ?u.3253
_
} [
i: FunLike F α fun x => β
i
:
FunLike: Sort ?u.3277 → (α : outParam (Sort ?u.3276)) → outParam (αSort ?u.3275)Sort (max(max(max1?u.3277)?u.3276)?u.3275)
FunLike
F: Sort ?u.3247
F
α: Sort ?u.3269
α
fun
_: ?m.3279
_
β: Sort ?u.3476
β
] namespace FunLike protected theorem
congr: ∀ {f g : F} {x y : α}, f = gx = yf x = g y
congr
{
f: F
f
g: F
g
:
F: Sort ?u.3266
F
} {
x: α
x
y: α
y
:
α: Sort ?u.3269
α
} (
h₁: f = g
h₁
:
f: F
f
=
g: F
g
) (
h₂: x = y
h₂
:
x: α
x
=
y: α
y
) :
f: F
f
x: α
x
=
g: F
g
y: α
y
:=
congr: ∀ {α : Sort ?u.3416} {β : Sort ?u.3415} {f₁ f₂ : αβ} {a₁ a₂ : α}, f₁ = f₂a₁ = a₂f₁ a₁ = f₂ a₂
congr
(
congr_arg: ∀ {α : Sort ?u.3430} {β : Sort ?u.3429} {a₁ a₂ : α} (f : αβ), a₁ = a₂f a₁ = f a₂
congr_arg
_: ?m.3431?m.3432
_
h₁: f = g
h₁
)
h₂: x = y
h₂
#align fun_like.congr
FunLike.congr: ∀ {F : Sort u_1} {α : Sort u_2} {β : Sort u_3} [i : FunLike F α fun x => β] {f g : F} {x y : α}, f = gx = yf x = g y
FunLike.congr
protected theorem
congr_arg: ∀ (f : F) {x y : α}, x = yf x = f y
congr_arg
(
f: F
f
:
F: Sort ?u.3470
F
) {
x: α
x
y: α
y
:
α: Sort ?u.3473
α
} (
h₂: x = y
h₂
:
x: α
x
=
y: α
y
) :
f: F
f
x: α
x
=
f: F
f
y: α
y
:=
congr_arg: ∀ {α : Sort ?u.3612} {β : Sort ?u.3611} {a₁ a₂ : α} (f : αβ), a₁ = a₂f a₁ = f a₂
congr_arg
_: ?m.3613?m.3614
_
h₂: x = y
h₂
#align fun_like.congr_arg
FunLike.congr_arg: ∀ {F : Sort u_3} {α : Sort u_1} {β : Sort u_2} [i : FunLike F α fun x => β] (f : F) {x y : α}, x = yf x = f y
FunLike.congr_arg
end FunLike end NonDependent