Documentation

Mathlib.Logic.Function.Basic

Miscellaneous function constructions and lemmas #

@[reducible]
def Function.eval {α : Sort u_1} {β : α → Sort u_4} (x : α) (f : (x : α) → β x) :
β x

Evaluate a function at an argument. Useful if you want to talk about the partially applied Function.eval x : (∀ x, β x) → β x.

Equations
Instances For
    theorem Function.eval_apply {α : Sort u_1} {β : α → Sort u_4} (x : α) (f : (x : α) → β x) :
    eval x f = f x
    theorem Function.const_def {α : Sort u_1} {β : Sort u_2} {y : β} :
    (fun (x : α) => y) = const α y
    theorem Function.const_injective {α : Sort u_1} {β : Sort u_2} [Nonempty α] :
    @[simp]
    theorem Function.const_inj {α : Sort u_1} {β : Sort u_2} [Nonempty α] {y₁ y₂ : β} :
    const α y₁ = const α y₂ ↔ y₁ = y₂
    theorem Function.onFun_apply {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} (f : β → β → γ) (g : α → β) (a b : α) :
    onFun f g a b = f (g a) (g b)
    theorem Function.onFun_onFun_eq {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {δ : Sort u_4} (f : α → α → γ) (g : β → α) (h : δ → β) :
    onFun (onFun f g) h = onFun f (g ∘ h)
    theorem Function.onFun_comp_eq {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {δ : Sort u_4} (f : α → α → γ) (g : β → α) (h : δ → β) :
    onFun f (g ∘ h) = onFun (onFun f g) h
    instance Function.instReflOnFun {α : Sort u_1} {β : Sort u_2} (r : β → β → Prop) (f : α → β) [Std.Refl r] :
    instance Function.instIrreflOnFun {α : Sort u_1} {β : Sort u_2} (r : β → β → Prop) (f : α → β) [Std.Irrefl r] :
    instance Function.instSymmOnFun {α : Sort u_1} {β : Sort u_2} (r : β → β → Prop) (f : α → β) [Std.Symm r] :
    theorem Function.Injective.antisymm_onFun {α : Sort u_1} {β : Sort u_2} (r : β → β → Prop) {f : α → β} (hinj : Injective f) [Std.Antisymm r] :
    instance Function.instAsymmOnFun {α : Sort u_1} {β : Sort u_2} (r : β → β → Prop) (f : α → β) [Std.Asymm r] :
    instance Function.instIsTransOnFun {α : Sort u_1} {β : Sort u_2} (r : β → β → Prop) (f : α → β) [IsTrans β r] :
    IsTrans α (onFun r f)
    instance Function.instTotalOnFun {α : Sort u_1} {β : Sort u_2} (r : β → β → Prop) (f : α → β) [Std.Total r] :
    theorem Function.Injective.trichotomous_onFun {α : Sort u_1} {β : Sort u_2} (r : β → β → Prop) {f : α → β} (hinj : Injective f) [Std.Trichotomous r] :
    instance Function.instIsEquivOnFun {α : Sort u_1} {β : Sort u_2} (r : β → β → Prop) (f : α → β) [IsEquiv β r] :
    IsEquiv α (onFun r f)
    instance Function.instIsPreorderOnFun {α : Sort u_1} {β : Sort u_2} (r : β → β → Prop) (f : α → β) [IsPreorder β r] :
    IsPreorder α (onFun r f)
    theorem Function.Injective.isPartialOrder_onFun {α : Sort u_1} {β : Sort u_2} (r : β → β → Prop) {f : α → β} (hinj : Injective f) [IsPartialOrder β r] :
    theorem Function.Injective.isLinearOrder_onFun {α : Sort u_1} {β : Sort u_2} (r : β → β → Prop) {f : α → β} (hinj : Injective f) [IsLinearOrder β r] :
    instance Function.instIsStrictOrderOnFun {α : Sort u_1} {β : Sort u_2} (r : β → β → Prop) (f : α → β) [IsStrictOrder β r] :
    instance Function.instIsStrictWeakOrderOnFun {α : Sort u_1} {β : Sort u_2} (r : β → β → Prop) (f : α → β) [IsStrictWeakOrder β r] :
    theorem Function.Injective.isStrictTotalOrder_onFun {α : Sort u_1} {β : Sort u_2} (r : β → β → Prop) {f : α → β} (hinj : Injective f) [IsStrictTotalOrder β r] :
    theorem Function.hfunext {α α' : Sort u} {β : α → Sort v} {β' : α' → Sort v} {f : (a : α) → β a} {f' : (a : α') → β' a} (hα : α = α') (h : ∀ (a : α) (a' : α'), a ≍ a' → f a ≍ f' a') :
    f ≍ f'
    theorem Function.ne_iff {α : Sort u_1} {β : α → Sort u_4} {f₁ f₂ : (a : α) → β a} :
    f₁ ≠ f₂ ↔ ∃ (a : α), f₁ a ≠ f₂ a
    theorem Function.funext_iff_of_subsingleton {α : Sort u_1} {β : Sort u_2} {f : α → β} [Subsingleton α] {g : α → β} (x y : α) :
    f x = g y ↔ f = g
    theorem Function.swap_lt {α : Type u_4} [LT α] :
    (swap fun (x1 x2 : α) => x1 < x2) = fun (x1 x2 : α) => x1 > x2
    theorem Function.swap_le {α : Type u_4} [LE α] :
    (swap fun (x1 x2 : α) => x1 ≤ x2) = fun (x1 x2 : α) => x1 ≥ x2
    theorem Function.swap_gt {α : Type u_4} [LT α] :
    (swap fun (x1 x2 : α) => x1 > x2) = fun (x1 x2 : α) => x1 < x2
    theorem Function.swap_ge {α : Type u_4} [LE α] :
    (swap fun (x1 x2 : α) => x1 ≥ x2) = fun (x1 x2 : α) => x1 ≤ x2
    instance Function.instReflSwapProp {α : Sort u_1} (r : α → α → Prop) [Std.Refl r] :
    instance Function.instIrreflSwapProp {α : Sort u_1} (r : α → α → Prop) [Std.Irrefl r] :
    instance Function.instSymmSwapProp {α : Sort u_1} (r : α → α → Prop) [Std.Symm r] :
    instance Function.instAntisymmSwapProp {α : Sort u_1} (r : α → α → Prop) [Std.Antisymm r] :
    instance Function.instAsymmSwapProp {α : Sort u_1} (r : α → α → Prop) [Std.Asymm r] :
    instance Function.instIsTransSwapProp {α : Sort u_1} (r : α → α → Prop) [IsTrans α r] :
    IsTrans α (swap r)
    instance Function.instTotalSwapProp {α : Sort u_1} (r : α → α → Prop) [Std.Total r] :
    instance Function.instIsEquivSwapProp {α : Sort u_1} (r : α → α → Prop) [IsEquiv α r] :
    IsEquiv α (swap r)
    instance Function.instIsPreorderSwapProp {α : Sort u_1} (r : α → α → Prop) [IsPreorder α r] :
    instance Function.instIsPartialOrderSwapProp {α : Sort u_1} (r : α → α → Prop) [IsPartialOrder α r] :
    instance Function.instIsLinearOrderSwapProp {α : Sort u_1} (r : α → α → Prop) [IsLinearOrder α r] :
    instance Function.instIsStrictOrderSwapProp {α : Sort u_1} (r : α → α → Prop) [IsStrictOrder α r] :
    instance Function.instIsStrictWeakOrderSwapProp {α : Sort u_1} (r : α → α → Prop) [IsStrictWeakOrder α r] :
    theorem Function.Bijective.injective {α : Sort u_1} {β : Sort u_2} {f : α → β} (hf : Bijective f) :
    theorem Function.Bijective.surjective {α : Sort u_1} {β : Sort u_2} {f : α → β} (hf : Bijective f) :
    theorem Function.not_injective_iff {α : Sort u_1} {β : Sort u_2} {f : α → β} :
    ¬Injective f ↔ ∃ (a : α), ∃ (b : α), f a = f b ∧ a ≠ b
    @[simp]
    theorem Function.not_injective_const {α : Type u_4} {β : Type u_5} [Nontrivial α] {b : β} :
    ¬Injective fun (x : α) => b
    def Function.Injective.decidableEq {α : Sort u_1} {β : Sort u_2} {f : α → β} [DecidableEq β] (I : Injective f) :

    If the co-domain β of an injective function f : α → β has decidable equality, then the domain α also has decidable equality.

    Equations
    Instances For
      theorem Function.Injective.of_comp {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} {g : γ → α} (I : Injective (f ∘ g)) :
      @[simp]
      theorem Function.Injective.of_comp_iff {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} (hf : Injective f) (g : γ → α) :
      theorem Function.Injective.of_comp_right {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} {g : γ → α} (I : Injective (f ∘ g)) (hg : Surjective g) :
      theorem Function.Surjective.bijective₂_of_injective {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} {g : γ → α} (hf : Surjective f) (hg : Surjective g) (I : Injective (f ∘ g)) :
      @[simp]
      theorem Function.Injective.of_comp_iff' {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} (f : α → β) {g : γ → α} (hg : Bijective g) :
      theorem Function.Injective.piMap {ι : Sort u_4} {α : ι → Sort u_5} {β : ι → Sort u_6} {f : (i : ι) → α i → β i} (hf : ∀ (i : ι), Injective (f i)) :
      theorem Function.Injective.comp_left {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {g : β → γ} (hg : Injective g) :
      Injective fun (x : α → β) => g ∘ x

      Composition by an injective function on the left is itself injective.

      theorem Function.injective_comp_left_iff {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} [Nonempty α] {g : β → γ} :
      (Injective fun (x : α → β) => g ∘ x) ↔ Injective g
      theorem Function.injective_of_subsingleton {α : Sort u_1} {β : Sort u_2} [Subsingleton α] (f : α → β) :
      theorem Function.bijective_of_subsingleton {α : Sort u_1} [Subsingleton α] (f : α → α) :
      theorem Function.Injective.dite {α : Sort u_1} {β : Sort u_2} (p : α → Prop) [DecidablePred p] {f : { a : α // p a } → β} {f' : { a : α // ¬p a } → β} (hf : Injective f) (hf' : Injective f') (im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩) :
      Injective fun (x : α) => if h : p x then f ⟨x, h⟩ else f' ⟨x, h⟩
      theorem Function.Surjective.of_comp {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} {g : γ → α} (S : Surjective (f ∘ g)) :
      @[simp]
      theorem Function.Surjective.of_comp_iff {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} (f : α → β) {g : γ → α} (hg : Surjective g) :
      theorem Function.Surjective.of_comp_left {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} {g : γ → α} (S : Surjective (f ∘ g)) (hf : Injective f) :
      theorem Function.Injective.bijective₂_of_surjective {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} {g : γ → α} (hf : Injective f) (hg : Injective g) (S : Surjective (f ∘ g)) :
      @[simp]
      theorem Function.Surjective.of_comp_iff' {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} (hf : Bijective f) (g : γ → α) :
      @[instance_reducible]
      instance Function.decidableEqPFun (p : Prop) [Decidable p] (α : p → Type u_4) [(hp : p) → DecidableEq (α hp)] :
      DecidableEq ((hp : p) → α hp)
      Equations
      theorem Function.Surjective.forall {α : Sort u_1} {β : Sort u_2} {f : α → β} (hf : Surjective f) {p : β → Prop} :
      (∀ (y : β), p y) ↔ ∀ (x : α), p (f x)
      theorem Function.Surjective.forall₂ {α : Sort u_1} {β : Sort u_2} {f : α → β} (hf : Surjective f) {p : β → β → Prop} :
      (∀ (y₁ y₂ : β), p y₁ y₂) ↔ ∀ (x₁ x₂ : α), p (f x₁) (f x₂)
      theorem Function.Surjective.forall₃ {α : Sort u_1} {β : Sort u_2} {f : α → β} (hf : Surjective f) {p : β → β → β → Prop} :
      (∀ (y₁ y₂ y₃ : β), p y₁ y₂ y₃) ↔ ∀ (x₁ x₂ x₃ : α), p (f x₁) (f x₂) (f x₃)
      theorem Function.Surjective.exists {α : Sort u_1} {β : Sort u_2} {f : α → β} (hf : Surjective f) {p : β → Prop} :
      (∃ (y : β), p y) ↔ ∃ (x : α), p (f x)
      theorem Function.Surjective.exists₂ {α : Sort u_1} {β : Sort u_2} {f : α → β} (hf : Surjective f) {p : β → β → Prop} :
      (∃ (y₁ : β), ∃ (y₂ : β), p y₁ y₂) ↔ ∃ (x₁ : α), ∃ (x₂ : α), p (f x₁) (f x₂)
      theorem Function.Surjective.exists₃ {α : Sort u_1} {β : Sort u_2} {f : α → β} (hf : Surjective f) {p : β → β → β → Prop} :
      (∃ (y₁ : β), ∃ (y₂ : β), ∃ (y₃ : β), p y₁ y₂ y₃) ↔ ∃ (x₁ : α), ∃ (x₂ : α), ∃ (x₃ : α), p (f x₁) (f x₂) (f x₃)
      theorem Function.Surjective.injective_comp_right {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} (hf : Surjective f) :
      Injective fun (g : β → γ) => g ∘ f
      theorem Function.injective_comp_right_iff_surjective {α : Sort u_1} {β : Sort u_2} {f : α → β} {γ : Type u_4} [Nontrivial γ] :
      (Injective fun (g : β → γ) => g ∘ f) ↔ Surjective f
      theorem Function.Surjective.right_cancellable {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} (hf : Surjective f) {g₁ g₂ : β → γ} :
      g₁ ∘ f = g₂ ∘ f ↔ g₁ = g₂
      theorem Function.surjective_of_right_cancellable_Prop {α : Sort u_1} {β : Sort u_2} {f : α → β} (h : ∀ (g₁ g₂ : β → Prop), g₁ ∘ f = g₂ ∘ f → g₁ = g₂) :
      theorem Function.bijective_iff_existsUnique {α : Sort u_1} {β : Sort u_2} (f : α → β) :
      Bijective f ↔ ∀ (b : β), ∃! a : α, f a = b
      theorem Function.Bijective.existsUnique {α : Sort u_1} {β : Sort u_2} {f : α → β} (hf : Bijective f) (b : β) :
      ∃! a : α, f a = b

      Shorthand for using projection notation with Function.bijective_iff_existsUnique.

      theorem Function.Bijective.existsUnique_iff {α : Sort u_1} {β : Sort u_2} {f : α → β} (hf : Bijective f) {p : β → Prop} :
      (∃! y : β, p y) ↔ ∃! x : α, p (f x)
      theorem Function.Bijective.of_comp_iff {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} (f : α → β) {g : γ → α} (hg : Bijective g) :
      theorem Function.Bijective.of_comp_iff' {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} (hf : Bijective f) (g : γ → α) :
      theorem Function.Bijective.of_comp_left {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} {g : γ → α} (hfg : Bijective (f ∘ g)) (hf : Injective f) :
      theorem Function.exists_fixed_point_of_surjective {α : Type u_4} {β : Type u_5} (f : α → α → β) (hf : Surjective f) (g : β → β) :
      ∃ (x : β), g x = x

      If f : α → α → β is surjective, then every endofunction on β has a fixed point. This is an instance of Lawvere's fixed-point theorem applied to the category of types and functions. It is the diagonal argument underlying cantor_surjective and cantor_injective.

      theorem Function.cantor_surjective {α : Type u_4} (f : α → Set α) :

      Cantor's diagonal argument implies that there are no surjective functions from α to Set α.

      theorem Function.cantor_injective {α : Type u_4} (f : Set α → α) :

      Cantor's diagonal argument implies that there are no injective functions from Set α to α.

      theorem Function.not_surjective_Type {α : Type u} (f : α → Type (max u v)) :

      There is no surjection from α : Type u into Type (max u v). This theorem demonstrates why Type : Type would be inconsistent in Lean.

      def Function.IsPartialInv {α : Type u_4} {β : Sort u_5} (f : α → β) (g : β → Option α) :

      g is a partial inverse to f (an injective but not necessarily surjective function) if g y = some x implies f x = y, and g y = none implies that y is not in the range of f.

      Equations
      Instances For
        theorem Function.IsPartialInv.eq {α : Type u_4} {β : Sort u_5} {f : α → β} {g : β → Option α} (H : IsPartialInv f g) (x : α) :
        g (f x) = some x
        theorem Function.IsPartialInv.get_eq {α : Type u_4} {β : Sort u_5} {f : α → β} {g : β → Option α} (H : IsPartialInv f g) (x : β) (h : (g x).isSome = true) :
        f ((g x).get h) = x
        theorem Function.IsPartialInv.surjective_getD {α : Type u_4} {β : Sort u_5} {f : α → β} {g : β → Option α} (H : IsPartialInv f g) (x : α) :
        Surjective fun (x_1 : β) => (g x_1).getD x
        @[deprecated Function.IsPartialInv.eq (since := "2026-03-11")]
        theorem Function.isPartialInv_left {α : Type u_4} {β : Sort u_5} {f : α → β} {g : β → Option α} (H : IsPartialInv f g) (x : α) :
        g (f x) = some x

        Alias of Function.IsPartialInv.eq.

        theorem Function.IsPartialInv.injective {α : Type u_4} {β : Sort u_5} {f : α → β} {g : β → Option α} (H : IsPartialInv f g) :
        @[deprecated Function.IsPartialInv.injective (since := "2026-03-11")]
        theorem Function.injective_of_isPartialInv {α : Type u_4} {β : Sort u_5} {f : α → β} {g : β → Option α} (H : IsPartialInv f g) :

        Alias of Function.IsPartialInv.injective.

        theorem Function.injective_of_isPartialInv_right {α : Type u_4} {β : Sort u_5} {f : α → β} {g : β → Option α} (H : IsPartialInv f g) (x y : β) (b : α) (h₁ : b ∈ g x) (h₂ : b ∈ g y) :
        x = y
        theorem Function.IsPartialInv.comp {α : Type u_4} {β : Type u_5} {γ : Sort u_6} {f : α → β} {g : β → Option α} {h : β → γ} {i : γ → Option β} (hf : IsPartialInv f g) (hh : IsPartialInv h i) :
        IsPartialInv (h ∘ f) fun (x : γ) => (i x).bind g
        theorem Function.LeftInverse.eq {α : Sort u_1} {β : Sort u_2} {g : β → α} {f : α → β} (h : LeftInverse g f) (x : α) :
        g (f x) = x
        theorem Function.RightInverse.eq {α : Sort u_1} {β : Sort u_2} {g : β → α} {f : α → β} (h : RightInverse g f) (x : β) :
        f (g x) = x
        theorem Function.LeftInverse.comp_eq_id {α : Sort u_1} {β : Sort u_2} {f : α → β} {g : β → α} (h : LeftInverse f g) :
        f ∘ g = id
        theorem Function.leftInverse_iff_comp {α : Sort u_1} {β : Sort u_2} {f : α → β} {g : β → α} :
        theorem Function.RightInverse.comp_eq_id {α : Sort u_1} {β : Sort u_2} {f : α → β} {g : β → α} (h : RightInverse f g) :
        g ∘ f = id
        theorem Function.rightInverse_iff_comp {α : Sort u_1} {β : Sort u_2} {f : α → β} {g : β → α} :
        theorem Function.LeftInverse.comp {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} {g : β → α} {h : β → γ} {i : γ → β} (hf : LeftInverse f g) (hh : LeftInverse h i) :
        LeftInverse (h ∘ f) (g ∘ i)
        theorem Function.RightInverse.comp {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} {g : β → α} {h : β → γ} {i : γ → β} (hf : RightInverse f g) (hh : RightInverse h i) :
        RightInverse (h ∘ f) (g ∘ i)
        theorem Function.LeftInverse.rightInverse {α : Sort u_1} {β : Sort u_2} {f : α → β} {g : β → α} (h : LeftInverse g f) :
        theorem Function.RightInverse.leftInverse {α : Sort u_1} {β : Sort u_2} {f : α → β} {g : β → α} (h : RightInverse g f) :
        theorem Function.LeftInverse.surjective {α : Sort u_1} {β : Sort u_2} {f : α → β} {g : β → α} (h : LeftInverse f g) :
        theorem Function.RightInverse.injective {α : Sort u_1} {β : Sort u_2} {f : α → β} {g : β → α} (h : RightInverse f g) :
        theorem Function.LeftInverse.rightInverse_of_injective {α : Sort u_1} {β : Sort u_2} {f : α → β} {g : β → α} (h : LeftInverse f g) (hf : Injective f) :
        theorem Function.LeftInverse.rightInverse_of_surjective {α : Sort u_1} {β : Sort u_2} {f : α → β} {g : β → α} (h : LeftInverse f g) (hg : Surjective g) :
        theorem Function.RightInverse.leftInverse_of_surjective {α : Sort u_1} {β : Sort u_2} {f : α → β} {g : β → α} :
        theorem Function.RightInverse.leftInverse_of_injective {α : Sort u_1} {β : Sort u_2} {f : α → β} {g : β → α} :
        theorem Function.LeftInverse.eq_rightInverse {α : Sort u_1} {β : Sort u_2} {f : α → β} {g₁ g₂ : β → α} (h₁ : LeftInverse g₁ f) (h₂ : RightInverse g₂ f) :
        g₁ = g₂
        noncomputable def Function.partialInv {α : Type u_4} {β : Sort u_5} (f : α → β) (b : β) :

        We can use choice to construct explicitly a partial inverse for a given injective function f.

        Equations
        Instances For
          theorem Function.Injective.isPartialInv {α : Type u_4} {β : Sort u_5} {f : α → β} (I : Injective f) :
          @[deprecated Function.Injective.isPartialInv (since := "2026-03-11")]
          theorem Function.partialInv_of_injective {α : Type u_4} {β : Sort u_5} {f : α → β} (I : Injective f) :

          Alias of Function.Injective.isPartialInv.

          theorem Function.partialInv_left {α : Type u_4} {β : Sort u_5} {f : α → β} (I : Injective f) (x : α) :
          partialInv f (f x) = some x
          noncomputable def Function.invFun {α : Sort u} {β : Sort u_3} [Nonempty α] (f : α → β) :
          β → α

          The inverse of a function (which is a left inverse if f is injective and a right inverse if f is surjective).

          Equations
          Instances For
            theorem Function.invFun_eq {α : Sort u_1} {β : Sort u_2} [Nonempty α] {f : α → β} {b : β} (h : ∃ (a : α), f a = b) :
            f (invFun f b) = b
            theorem Function.apply_invFun_apply {α : Type u_3} {β : Type u_4} {f : α → β} {a : α} :
            f (invFun f (f a)) = f a
            theorem Function.invFun_neg {α : Sort u_1} {β : Sort u_2} [Nonempty α] {f : α → β} {b : β} (h : ¬∃ (a : α), f a = b) :
            theorem Function.invFun_eq_of_injective_of_rightInverse {α : Sort u_1} {β : Sort u_2} [Nonempty α] {f : α → β} {g : β → α} (hf : Injective f) (hg : RightInverse g f) :
            invFun f = g
            theorem Function.rightInverse_invFun {α : Sort u_1} {β : Sort u_2} [Nonempty α] {f : α → β} (hf : Surjective f) :
            theorem Function.leftInverse_invFun {α : Sort u_1} {β : Sort u_2} [Nonempty α] {f : α → β} (hf : Injective f) :
            theorem Function.invFun_surjective {α : Sort u_1} {β : Sort u_2} [Nonempty α] {f : α → β} (hf : Injective f) :
            theorem Function.invFun_comp {α : Sort u_1} {β : Sort u_2} [Nonempty α] {f : α → β} (hf : Injective f) :
            theorem Function.Injective.hasLeftInverse {α : Sort u_1} {β : Sort u_2} [Nonempty α] {f : α → β} (hf : Injective f) :
            theorem Function.injective_iff_hasLeftInverse {α : Sort u_1} {β : Sort u_2} [Nonempty α] {f : α → β} :
            noncomputable def Function.surjInv {α : Sort u} {β : Sort v} {f : α → β} (h : Surjective f) (b : β) :
            α

            The inverse of a surjective function. (Unlike invFun, this does not require α to be inhabited.)

            Equations
            Instances For
              theorem Function.surjInv_eq {α : Sort u} {β : Sort v} {f : α → β} (h : Surjective f) (b : β) :
              f (surjInv h b) = b
              @[simp]
              theorem Function.comp_surjInv {α : Sort u} {β : Sort v} {f : α → β} (hf : Surjective f) :
              theorem Function.rightInverse_surjInv {α : Sort u} {β : Sort v} {f : α → β} (hf : Surjective f) :
              theorem Function.leftInverse_surjInv {α : Sort u} {β : Sort v} {f : α → β} (hf : Bijective f) :
              theorem Function.Surjective.hasRightInverse {α : Sort u} {β : Sort v} {f : α → β} (hf : Surjective f) :
              theorem Function.bijective_iff_has_inverse {α : Sort u} {β : Sort v} {f : α → β} :
              theorem Function.injective_surjInv {α : Sort u} {β : Sort v} {f : α → β} (h : Surjective f) :
              theorem Function.surjective_to_subsingleton {α : Sort u} {β : Sort v} [na : Nonempty α] [Subsingleton β] (f : α → β) :
              theorem Function.Surjective.piMap {ι : Sort u_1} {α : ι → Sort u_2} {β : ι → Sort u_3} {f : (i : ι) → α i → β i} (hf : ∀ (i : ι), Surjective (f i)) :
              theorem Function.Surjective.comp_left {α : Sort u} {β : Sort v} {γ : Sort w} {g : β → γ} (hg : Surjective g) :
              Surjective fun (x : α → β) => g ∘ x

              Composition by a surjective function on the left is itself surjective.

              theorem Function.surjective_comp_left_iff {α : Sort u} {β : Sort v} {γ : Sort w} [Nonempty α] {g : β → γ} :
              (Surjective fun (x : α → β) => g ∘ x) ↔ Surjective g
              theorem Function.Bijective.piMap {ι : Sort u_1} {α : ι → Sort u_2} {β : ι → Sort u_3} {f : (i : ι) → α i → β i} (hf : ∀ (i : ι), Bijective (f i)) :
              theorem Function.Bijective.comp_left {α : Sort u} {β : Sort v} {γ : Sort w} {g : β → γ} (hg : Bijective g) :
              Bijective fun (x : α → β) => g ∘ x

              Composition by a bijective function on the left is itself bijective.

              def Function.update {α : Sort u} {β : α → Sort v} [DecidableEq α] (f : (a : α) → β a) (a' : α) (v : β a') (a : α) :
              β a

              Replacing the value of a function at a given point by a given value.

              Equations
              Instances For
                @[simp]
                theorem Function.update_self {α : Sort u} {β : α → Sort v} [DecidableEq α] (a : α) (v : β a) (f : (a : α) → β a) :
                update f a v a = v
                @[simp]
                theorem Function.update_of_ne {α : Sort u} {β : α → Sort v} [DecidableEq α] {a a' : α} (h : a ≠ a') (v : β a') (f : (a : α) → β a) :
                update f a' v a = f a
                theorem Function.update_congr {α : Sort u} [DecidableEq α] {β : Sort u_1} {f₁ f₂ : α → β} (hf : f₁ = f₂) {a'₁ a'₂ : α} (ha' : a'₁ = a'₂) {v₁ v₂ : β} (hv : v₁ = v₂) {a₁ a₂ : α} (ha : a₁ = a₂) :
                update f₁ a'₁ v₁ a₁ = update f₂ a'₂ v₂ a₂

                A congruence lemma for Function.update, specialized for the non-dependent case. Without this, simp can't rewrite in the fourth argument a because the result type depends on a. See also https://github.com/leanprover/lean4/issues/12478.

                theorem Function.update_apply {α : Sort u} [DecidableEq α] {β : Sort u_1} (f : α → β) (a' : α) (b : β) (a : α) :
                update f a' b a = if a = a' then b else f a

                On non-dependent functions, Function.update can be expressed as an ite

                theorem Function.update_eq_const_of_subsingleton {α : Sort u} {α' : Sort w} [DecidableEq α] [Subsingleton α] (a : α) (v : α') (f : α → α') :
                update f a v = const α v
                theorem Function.surjective_eval {α : Sort u} {β : α → Sort v} [h : ∀ (a : α), Nonempty (β a)] (a : α) :
                theorem Function.update_injective {α : Sort u} {β : α → Sort v} [DecidableEq α] (f : (a : α) → β a) (a' : α) :
                theorem Function.forall_update_iff {α : Sort u} {β : α → Sort v} [DecidableEq α] (f : (a : α) → β a) {a : α} {b : β a} (p : (a : α) → β a → Prop) :
                (∀ (x : α), p x (update f a b x)) ↔ p a b ∧ ∀ (x : α), x ≠ a → p x (f x)
                theorem Function.exists_update_iff {α : Sort u} {β : α → Sort v} [DecidableEq α] (f : (a : α) → β a) {a : α} {b : β a} (p : (a : α) → β a → Prop) :
                (∃ (x : α), p x (update f a b x)) ↔ p a b ∨ ∃ (x : α), x ≠ a ∧ p x (f x)
                theorem Function.update_eq_iff {α : Sort u} {β : α → Sort v} [DecidableEq α] {a : α} {b : β a} {f g : (a : α) → β a} :
                update f a b = g ↔ b = g a ∧ ∀ (x : α), x ≠ a → f x = g x
                theorem Function.eq_update_iff {α : Sort u} {β : α → Sort v} [DecidableEq α] {a : α} {b : β a} {f g : (a : α) → β a} :
                g = update f a b ↔ g a = b ∧ ∀ (x : α), x ≠ a → g x = f x
                @[simp]
                theorem Function.update_eq_self_iff {α : Sort u} {β : α → Sort v} [DecidableEq α] {f : (a : α) → β a} {a : α} {b : β a} :
                update f a b = f ↔ b = f a
                @[simp]
                theorem Function.eq_update_self_iff {α : Sort u} {β : α → Sort v} [DecidableEq α] {f : (a : α) → β a} {a : α} {b : β a} :
                f = update f a b ↔ f a = b
                theorem Function.ne_update_self_iff {α : Sort u} {β : α → Sort v} [DecidableEq α] {f : (a : α) → β a} {a : α} {b : β a} :
                f ≠ update f a b ↔ f a ≠ b
                theorem Function.update_ne_self_iff {α : Sort u} {β : α → Sort v} [DecidableEq α] {f : (a : α) → β a} {a : α} {b : β a} :
                update f a b ≠ f ↔ b ≠ f a
                @[simp]
                theorem Function.update_eq_self {α : Sort u} {β : α → Sort v} [DecidableEq α] (a : α) (f : (a : α) → β a) :
                update f a (f a) = f
                theorem Function.update_comp_eq_of_forall_ne' {α : Sort u} {β : α → Sort v} [DecidableEq α] {α' : Sort u_1} (g : (a : α) → β a) {f : α' → α} {i : α} (a : β i) (h : ∀ (x : α'), f x ≠ i) :
                (fun (j : α') => update g i a (f j)) = fun (j : α') => g (f j)
                theorem Function.update_comp_eq_of_forall_ne {α' : Sort w} [DecidableEq α'] {α : Sort u_1} {β : Sort u_2} (g : α' → β) {f : α → α'} {i : α'} (a : β) (h : ∀ (x : α), f x ≠ i) :
                update g i a ∘ f = g ∘ f

                Non-dependent version of Function.update_comp_eq_of_forall_ne'

                theorem Function.update_comp_eq_of_injective' {α : Sort u} {β : α → Sort v} {α' : Sort w} [DecidableEq α] [DecidableEq α'] (g : (a : α) → β a) {f : α' → α} (hf : Injective f) (i : α') (a : β (f i)) :
                (fun (j : α') => update g (f i) a (f j)) = update (fun (i : α') => g (f i)) i a
                theorem Function.update_apply_of_injective {α : Sort u} {β : α → Sort v} {α' : Sort w} [DecidableEq α] [DecidableEq α'] (g : (a : α) → β a) {f : α' → α} (hf : Injective f) (i : α') (a : β (f i)) (j : α') :
                update g (f i) a (f j) = update (fun (i : α') => g (f i)) i a j
                theorem Function.update_comp_eq_of_injective {α : Sort u} {α' : Sort w} [DecidableEq α] [DecidableEq α'] {β : Sort u_1} (g : α' → β) {f : α → α'} (hf : Injective f) (i : α) (a : β) :
                update g (f i) a ∘ f = update (g ∘ f) i a

                Non-dependent version of Function.update_comp_eq_of_injective'

                theorem Function.rec_update {ι : Sort u_1} {κ : Sort u_2} {α : κ → Sort u_3} [DecidableEq ι] [DecidableEq κ] {ctor : ι → κ} :
                Injective ctor → ∀ (recursor : ((i : ι) → α (ctor i)) → (i : κ) → α i) (h : ∀ (f : (i : ι) → α (ctor i)) (i : ι), recursor f (ctor i) = f i) (h2 : ∀ (f₁ f₂ : (i : ι) → α (ctor i)) (k : κ), (∀ (i : ι), ctor i ≠ k) → recursor f₁ k = recursor f₂ k) (f : (i : ι) → α (ctor i)) (i : ι) (x : α (ctor i)), recursor (update f i x) = update (recursor f) (ctor i) x

                Recursors can be pushed inside Function.update.

                The ctor argument should be a one-argument constructor like Sum.inl, and recursor should be an inductive recursor partially applied in all but that constructor, such as (Sum.rec · g).

                In future, we should build some automation to generate applications like Option.rec_update for all inductive types.

                @[simp]
                theorem Option.rec_update {α : Type u_1} {β : Option α → Sort u_2} [DecidableEq α] (f : β none) (g : (a : α) → β (some a)) (a : α) (x : β (some a)) :
                (fun (t : Option α) => rec f (Function.update g a x) t) = Function.update (fun (t : Option α) => rec f g t) (some a) x
                theorem Function.apply_update {ι : Sort u_1} [DecidableEq ι] {α : ι → Sort u_2} {β : ι → Sort u_3} (f : (i : ι) → α i → β i) (g : (i : ι) → α i) (i : ι) (v : α i) (j : ι) :
                f j (update g i v j) = update (fun (k : ι) => f k (g k)) i (f i v) j
                theorem Function.apply_update₂ {ι : Sort u_1} [DecidableEq ι] {α : ι → Sort u_2} {β : ι → Sort u_3} {γ : ι → Sort u_4} (f : (i : ι) → α i → β i → γ i) (g : (i : ι) → α i) (h : (i : ι) → β i) (i : ι) (v : α i) (w : β i) (j : ι) :
                f j (update g i v j) (update h i w j) = update (fun (k : ι) => f k (g k) (h k)) i (f i v w) j
                theorem Function.pred_update {α : Sort u} {β : α → Sort v} [DecidableEq α] (P : ⦃a : α⦄ → β a → Prop) (f : (a : α) → β a) (a' : α) (v : β a') (a : α) :
                P (update f a' v a) ↔ a = a' ∧ P v ∨ a ≠ a' ∧ P (f a)
                theorem Function.comp_update {α : Sort u} [DecidableEq α] {α' : Sort u_1} {β : Sort u_2} (f : α' → β) (g : α → α') (i : α) (v : α') :
                f ∘ update g i v = update (f ∘ g) i (f v)
                theorem Function.update_comm {α : Sort u_2} [DecidableEq α] {β : α → Sort u_1} {a b : α} (h : a ≠ b) (v : β a) (w : β b) (f : (a : α) → β a) :
                update (update f a v) b w = update (update f b w) a v
                @[simp]
                theorem Function.update_idem {α : Sort u_2} [DecidableEq α] {β : α → Sort u_1} {a : α} (v w : β a) (f : (a : α) → β a) :
                update (update f a v) a w = update f a w
                @[simp]
                theorem Pi.map_update {ι : Sort u_1} [DecidableEq ι] {α : ι → Sort u_2} {β : ι → Sort u_3} {f : (i : ι) → α i → β i} (g : (i : ι) → α i) (i : ι) (a : α i) :
                Pi.map f (Function.update g i a) = Function.update (Pi.map f g) i (f i a)
                @[simp]
                theorem Pi.map_injective {ι : Sort u_1} {α : ι → Sort u_2} {β : ι → Sort u_3} [∀ (i : ι), Nonempty (α i)] {f : (i : ι) → α i → β i} :
                noncomputable def Function.extend {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} (f : α → β) (g : α → γ) (j : β → γ) :
                β → γ

                Extension of a function g : α → γ along a function f : α → β.

                For every a : α, f a is sent to g a. f might not be surjective, so we use an auxiliary function j : β → γ by sending b : β not in the range of f to j b. If you do not care about the behavior outside the range, j can be used as a junk value by setting it to be 0 or Classical.arbitrary (assuming γ is nonempty).

                This definition is mathematically meaningful only when f a₁ = f a₂ → g a₁ = g a₂ (spelled g.FactorsThrough f). In particular this holds if f is injective.

                A typical use case is extending a function from a subtype to the entire type. If you wish to extend g : {b : β // p b} → γ to a function β → γ, you should use Function.extend Subtype.val g j.

                Equations
                Instances For
                  def Function.FactorsThrough {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} (g : α → γ) (f : α → β) :

                  g factors through f : f a = f b → g a = g b

                  Equations
                  Instances For
                    theorem Function.extend_def {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} (f : α → β) (g : α → γ) (e' : β → γ) (b : β) [Decidable (∃ (a : α), f a = b)] :
                    extend f g e' b = if h : ∃ (a : α), f a = b then g (Classical.choose h) else e' b
                    theorem Function.Injective.factorsThrough {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} (hf : Injective f) (g : α → γ) :
                    theorem Function.FactorsThrough.extend_apply {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} {g : α → γ} (hf : FactorsThrough g f) (e' : β → γ) (a : α) :
                    extend f g e' (f a) = g a
                    @[simp]
                    theorem Function.Injective.extend_apply {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} (hf : Injective f) (g : α → γ) (e' : β → γ) (a : α) :
                    extend f g e' (f a) = g a
                    @[simp]
                    theorem Function.extend_apply' {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} (g : α → γ) (e' : β → γ) (b : β) (hb : ¬∃ (a : α), f a = b) :
                    extend f g e' b = e' b
                    @[simp]
                    theorem Function.extend_id {α : Sort u_1} {γ : Sort u_3} (g e' : α → γ) :
                    extend id g e' = g
                    theorem Function.Injective.extend_comp {γ : Sort u_3} {α₁ : Sort u_4} {α₂ : Sort u_5} {α₃ : Sort u_6} {f₁₂ : α₁ → α₂} (h₁₂ : Injective f₁₂) {f₂₃ : α₂ → α₃} (h₂₃ : Injective f₂₃) (g : α₁ → γ) (e' : α₃ → γ) :
                    extend (f₂₃ ∘ f₁₂) g e' = extend f₂₃ (extend f₁₂ g (e' ∘ f₂₃)) e'
                    theorem Function.factorsThrough_iff {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} (g : α → γ) [Nonempty γ] :
                    FactorsThrough g f ↔ ∃ (e : β → γ), g = e ∘ f
                    theorem Function.apply_extend {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {δ : Sort u_4} {g : α → γ} (F : γ → δ) (f : α → β) (e' : β → γ) (b : β) :
                    F (extend f g e' b) = extend f (F ∘ g) (F ∘ e') b
                    theorem Function.extend_injective {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} (hf : Injective f) (e' : β → γ) :
                    Injective fun (g : α → γ) => extend f g e'
                    theorem Function.FactorsThrough.extend_comp {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} {g : α → γ} (e' : β → γ) (hf : FactorsThrough g f) :
                    extend f g e' ∘ f = g
                    @[simp]
                    theorem Function.extend_const {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} (f : α → β) (c : γ) :
                    (extend f (fun (x : α) => c) fun (x : β) => c) = fun (x : β) => c
                    @[simp]
                    theorem Function.extend_comp {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} (hf : Injective f) (g : α → γ) (e' : β → γ) :
                    extend f g e' ∘ f = g
                    theorem Function.Injective.surjective_comp_right' {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} (hf : Injective f) (g₀ : β → γ) :
                    Surjective fun (g : β → γ) => g ∘ f
                    theorem Function.Injective.surjective_comp_right {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} [Nonempty γ] (hf : Injective f) :
                    Surjective fun (g : β → γ) => g ∘ f
                    theorem Function.surjective_comp_right_iff_injective {α : Sort u_1} {β : Sort u_2} {f : α → β} {γ : Type u_4} [Nontrivial γ] :
                    (Surjective fun (g : β → γ) => g ∘ f) ↔ Injective f
                    theorem Function.Bijective.comp_right {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β} (hf : Bijective f) :
                    Bijective fun (g : β → γ) => g ∘ f
                    theorem Function.FactorsThrough.rfl {α : Sort u_1} {β : Sort u_2} {f : α → β} :
                    theorem Function.FactorsThrough.comp_left {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {δ : Sort u_4} {f : α → β} {g : α → γ} (h : FactorsThrough g f) (g' : γ → δ) :
                    theorem Function.FactorsThrough.comp_right {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {δ : Sort u_4} {f : α → β} {g : α → γ} (h : FactorsThrough g f) (g' : δ → α) :
                    FactorsThrough (g ∘ g') (f ∘ g')
                    theorem Function.uncurry_def {α : Type u_1} {β : Type u_2} {γ : Sort u_3} (f : α → β → γ) :
                    uncurry f = fun (p : α × β) => f p.fst p.snd
                    theorem Function.uncurry_injective {α : Type u_1} {β : Type u_2} {γ : Sort u_3} :
                    theorem Function.curry_injective {α : Type u_1} {β : Type u_2} {γ : Sort u_3} :
                    theorem Function.uncurry_flip {α : Type u_1} {β : Type u_2} {γ : Sort u_3} (f : α → β → γ) :
                    theorem Function.flip_curry {α : Type u_1} {β : Type u_2} {γ : Sort u_3} (f : α × β → γ) :
                    theorem Function.curry_update {α : Type u_1} {α' : Type u_2} {β : Type u_3} [DecidableEq α] [DecidableEq α'] (f : α × α' → β) (aa' : α × α') (b : β) :
                    curry (update f aa' b) = update (curry f) aa'.fst (update (curry f aa'.fst) aa'.snd b)
                    theorem Function.uncurry_update_update {α : Type u_1} {α' : Type u_2} {β : Type u_3} [DecidableEq α] [DecidableEq α'] (f : α → α' → β) (a : α) (a' : α') (b : β) :
                    uncurry (update f a (update (f a) a' b)) = update (uncurry f) (a, a') b
                    class Function.HasUncurry (α : Type u_5) (β : outParam (Type u_6)) (γ : outParam (Type u_7)) :
                    Type (max (max u_5 u_6) u_7)

                    Records a way to turn an element of α into a function from β to γ. The most generic use is to recursively uncurry. For instance f : α → β → γ → δ will be turned into ↿f : α × β × γ → δ. One can also add instances for bundled maps.

                    • uncurry : α → β → γ

                      Uncurrying operator. The most generic use is to recursively uncurry. For instance f : α → β → γ → δ will be turned into ↿f : α × β × γ → δ. One can also add instances for bundled maps.

                    Instances

                      Uncurrying operator. The most generic use is to recursively uncurry. For instance f : α → β → γ → δ will be turned into ↿f : α × β × γ → δ. One can also add instances for bundled maps.

                      Equations
                      Instances For
                        @[instance_reducible]
                        instance Function.hasUncurryBase {α : Type u_1} {β : Type u_2} :
                        HasUncurry (α → β) α β
                        Equations
                        @[instance_reducible]
                        instance Function.hasUncurryInduction {α : Type u_1} {β : Type u_2} {γ : Type u_3} {δ : Type u_4} [HasUncurry β γ δ] :
                        HasUncurry (α → β) (α × γ) δ
                        Equations
                        def Function.Involutive {α : Sort u_1} (f : α → α) :

                        A function is involutive, if f ∘ f = id.

                        Equations
                        Instances For
                          @[simp]
                          theorem Function.Involutive.comp_self {α : Sort u} {f : α → α} (h : Involutive f) :
                          f ∘ f = id
                          theorem Function.Involutive.leftInverse {α : Sort u} {f : α → α} (h : Involutive f) :
                          theorem Function.Involutive.leftInverse_iff {α : Sort u} {f : α → α} (h : Involutive f) {g : α → α} :
                          LeftInverse g f ↔ g = f
                          theorem Function.Involutive.rightInverse {α : Sort u} {f : α → α} (h : Involutive f) :
                          theorem Function.Involutive.injective {α : Sort u} {f : α → α} (h : Involutive f) :
                          theorem Function.Involutive.surjective {α : Sort u} {f : α → α} (h : Involutive f) :
                          theorem Function.Involutive.bijective {α : Sort u} {f : α → α} (h : Involutive f) :
                          theorem Function.Involutive.ite_not {α : Sort u} {f : α → α} (h : Involutive f) (P : Prop) [Decidable P] (x : α) :
                          f (if P then x else f x) = if ¬P then x else f x

                          Involuting an ite of an involuted value x : α negates the Prop condition in the ite.

                          theorem Function.Involutive.eq_iff {α : Sort u} {f : α → α} (h : Involutive f) {x y : α} :
                          f x = y ↔ x = f y

                          An involution commutes across an equality. Compare to Function.Injective.eq_iff.

                          @[simp]
                          theorem Function.symm_apply_eq_iff {α : Sort u_1} {f : α → α} :
                          (Std.Symm fun (x1 x2 : α) => f x1 = x2) ↔ Involutive f
                          @[deprecated Function.symm_apply_eq_iff (since := "2026-06-10")]
                          theorem Function.symmetric_apply_eq_iff {α : Sort u_1} {f : α → α} :
                          (Std.Symm fun (x1 x2 : α) => f x1 = x2) ↔ Involutive f

                          Alias of Function.symm_apply_eq_iff.

                          def Function.Injective2 {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} (f : α → β → γ) :

                          The property of a binary function f : α → β → γ being injective. Mathematically this should be thought of as the corresponding function α × β → γ being injective.

                          Equations
                          Instances For
                            theorem Function.Injective2.left {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β → γ} (hf : Injective2 f) (b : β) :
                            Injective fun (a : α) => f a b

                            A binary injective function is injective when only the left argument varies.

                            theorem Function.Injective2.right {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β → γ} (hf : Injective2 f) (a : α) :
                            Injective (f a)

                            A binary injective function is injective when only the right argument varies.

                            theorem Function.Injective2.uncurry {α : Type u_4} {β : Type u_5} {γ : Type u_6} {f : α → β → γ} (hf : Injective2 f) :
                            theorem Function.Injective2.left' {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β → γ} (hf : Injective2 f) [Nonempty β] :

                            As a map from the left argument to a unary function, f is injective.

                            theorem Function.Injective2.right' {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β → γ} (hf : Injective2 f) [Nonempty α] :
                            Injective fun (b : β) (a : α) => f a b

                            As a map from the right argument to a unary function, f is injective.

                            theorem Function.Injective2.eq_iff {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {f : α → β → γ} (hf : Injective2 f) {a₁ a₂ : α} {b₁ b₂ : β} :
                            f a₁ b₁ = f a₂ b₂ ↔ a₁ = a₂ ∧ b₁ = b₂
                            noncomputable def Function.sometimes {α : Sort u_1} {β : Sort u_2} [Nonempty β] (f : α → β) :
                            β

                            sometimes f evaluates to some value of f, if it exists. This function is especially interesting in the case where α is a proposition, in which case f is necessarily a constant function, so that sometimes f = f a for all a.

                            Equations
                            Instances For
                              theorem Function.sometimes_eq {p : Prop} {α : Sort u_1} [Nonempty α] (f : p → α) (a : p) :
                              sometimes f = f a
                              theorem Function.sometimes_spec {p : Prop} {α : Sort u_1} [Nonempty α] (P : α → Prop) (f : p → α) (a : p) (h : P (f a)) :
                              P (sometimes f)
                              theorem forall_existsUnique_iff {α : Sort u_1} {β : Sort u_2} {r : α → β → Prop} :
                              (∀ (a : α), ∃! b : β, r a b) ↔ ∃ (f : α → β), ∀ {a : α} {b : β}, r a b ↔ f a = b

                              A relation r : α → β → Prop is "function-like" (for each a there exists a unique b such that r a b) if and only if it is (f · = ·) for some function f.

                              theorem forall_existsUnique_iff' {α : Sort u_1} {β : Sort u_2} {r : α → β → Prop} :
                              (∀ (a : α), ∃! b : β, r a b) ↔ ∃ (f : α → β), r = fun (x1 : α) (x2 : β) => f x1 = x2

                              A relation r : α → β → Prop is "function-like" (for each a there exists a unique b such that r a b) if and only if it is (f · = ·) for some function f.

                              theorem Std.Symm.forall_existsUnique_iff' {α : Sort u_1} {r : α → α → Prop} [Symm r] :
                              (∀ (a : α), ∃! b : α, r a b) ↔ ∃ (f : α → α), Function.Involutive f ∧ r = fun (x1 x2 : α) => f x1 = x2

                              A symmetric relation r : α → α → Prop is "function-like" (for each a there exists a unique b such that r a b) if and only if it is (f · = ·) for some involutive function f.

                              @[deprecated Std.Symm.forall_existsUnique_iff' (since := "2026-06-10")]
                              theorem Symmetric.forall_existsUnique_iff' {α : Sort u_1} {r : α → α → Prop} [Std.Symm r] :
                              (∀ (a : α), ∃! b : α, r a b) ↔ ∃ (f : α → α), Function.Involutive f ∧ r = fun (x1 x2 : α) => f x1 = x2

                              Alias of Std.Symm.forall_existsUnique_iff'.


                              A symmetric relation r : α → α → Prop is "function-like" (for each a there exists a unique b such that r a b) if and only if it is (f · = ·) for some involutive function f.

                              theorem Std.Symm.forall_existsUnique_iff {α : Sort u_1} {r : α → α → Prop} [Symm r] :
                              (∀ (a : α), ∃! b : α, r a b) ↔ ∃ (f : α → α), Function.Involutive f ∧ ∀ {a b : α}, r a b ↔ f a = b

                              A symmetric relation r : α → α → Prop is "function-like" (for each a there exists a unique b such that r a b) if and only if it is (f · = ·) for some involutive function f.

                              @[deprecated Std.Symm.forall_existsUnique_iff (since := "2026-06-10")]
                              theorem Symmetric.forall_existsUnique_iff {α : Sort u_1} {r : α → α → Prop} [Std.Symm r] :
                              (∀ (a : α), ∃! b : α, r a b) ↔ ∃ (f : α → α), Function.Involutive f ∧ ∀ {a b : α}, r a b ↔ f a = b

                              Alias of Std.Symm.forall_existsUnique_iff.


                              A symmetric relation r : α → α → Prop is "function-like" (for each a there exists a unique b such that r a b) if and only if it is (f · = ·) for some involutive function f.

                              def Set.piecewise {α : Type u} {β : α → Sort v} (s : Set α) (f g : (i : α) → β i) [(j : α) → Decidable (j ∈ s)] (i : α) :
                              β i

                              s.piecewise f g is the function equal to f on the set s, and to g on its complement.

                              Equations
                              Instances For

                                Bijectivity of Eq.rec, Eq.mp, Eq.mpr, and cast #

                                theorem eq_rec_on_bijective {α : Sort u_1} {C : α → Sort u_3} {a a' : α} (h : a = a') :
                                Function.Bijective fun (x : C a) => h ▸ x
                                theorem eq_mp_bijective {α β : Sort u_3} (h : α = β) :
                                theorem eq_mpr_bijective {α β : Sort u_3} (h : α = β) :
                                theorem cast_bijective {α β : Sort u_3} (h : α = β) :

                                Note these lemmas apply to Type* not Sort*, as the latter interferes with simp, and is trivial anyway.

                                @[simp]
                                theorem eq_rec_inj {α : Sort u_1} {a a' : α} (h : a = a') {C : α → Type u_3} (x y : C a) :
                                h ▸ x = h ▸ y ↔ x = y
                                @[simp]
                                theorem cast_inj {α β : Type u} (h : α = β) {x y : α} :
                                cast h x = cast h y ↔ x = y
                                theorem Function.LeftInverse.eq_rec_eq {α : Sort u_1} {β : Sort u_2} {γ : β → Sort v} {f : α → β} {g : β → α} (h : LeftInverse g f) (C : (a : α) → γ (f a)) (a : α) :
                                ⋯ ▸ C (g (f a)) = C a
                                theorem Function.LeftInverse.eq_rec_on_eq {α : Sort u_1} {β : Sort u_2} {γ : β → Sort v} {f : α → β} {g : β → α} (h : LeftInverse g f) (C : (a : α) → γ (f a)) (a : α) :
                                Eq.recOn ⋯ (C (g (f a))) = C a
                                theorem Function.LeftInverse.cast_eq {α : Sort u_1} {β : Sort u_2} {γ : β → Sort v} {f : α → β} {g : β → α} (h : LeftInverse g f) (C : (a : α) → γ (f a)) (a : α) :
                                cast ⋯ (C (g (f a))) = C a
                                def Set.SeparatesPoints {α : Type u_3} {β : Type u_4} (A : Set (α → β)) :

                                A set of functions "separates points" if for each pair of distinct points there is a function taking different values on them.

                                Equations
                                Instances For
                                  theorem Set.separatesPoints_mono {α : Type u_3} {β : Type u_4} {A B : Set (α → β)} (hAB : A ⊆ B) (hA : A.SeparatesPoints) :
                                  theorem InvImage.equivalence {α : Sort u} {β : Sort v} (r : β → β → Prop) (f : α → β) (h : Equivalence r) :
                                  @[instance_reducible]
                                  instance instDecidableUncurryOfFstSnd_mathlib {α : Type u_3} {β : Type u_4} {r : α → β → Prop} {x : α × β} [Decidable (r x.fst x.snd)] :
                                  Equations
                                  @[instance_reducible]
                                  instance instDecidableCurryOfMk_mathlib {α : Type u_3} {β : Type u_4} {r : α × β → Prop} {a : α} {b : β} [Decidable (r (a, b))] :
                                  Equations
                                  @[simp]
                                  theorem Pi.map_id {ι : Type u_3} {α : ι → Type u_4} :
                                  (Pi.map fun (i : ι) => id) = id
                                  @[simp]
                                  theorem Pi.map_id' {ι : Type u_3} {α : ι → Type u_4} :
                                  (Pi.map fun (i : ι) (a : α i) => a) = fun (x : (i : ι) → α i) => x
                                  theorem Pi.map_comp_map {ι : Type u_3} {α : ι → Type u_4} {β : ι → Type u_5} {γ : ι → Type u_6} (f : (i : ι) → α i → β i) (g : (i : ι) → β i → γ i) :
                                  Pi.map g ∘ Pi.map f = Pi.map fun (i : ι) => g i ∘ f i