Module docstring
{"# Piecewise functions
This file contains basic results on piecewise defined functions. "}
{"# Piecewise functions
This file contains basic results on piecewise defined functions. "}
Set.piecewise_empty
theorem
[∀ i : α, Decidable (i ∈ (∅ : Set α))] : piecewise ∅ f g = g
@[simp]
theorem piecewise_empty [∀ i : α, Decidable (i ∈ (∅ : Set α))] : piecewise ∅ f g = g := by
ext i
simp [piecewise]
Set.piecewise_univ
theorem
[∀ i : α, Decidable (i ∈ (Set.univ : Set α))] : piecewise Set.univ f g = f
@[simp]
theorem piecewise_univ [∀ i : α, Decidable (i ∈ (Set.univ : Set α))] :
piecewise Set.univ f g = f := by
ext i
simp [piecewise]
Set.piecewise_insert_self
theorem
{j : α} [∀ i, Decidable (i ∈ insert j s)] : (insert j s).piecewise f g j = f j
theorem piecewise_insert_self {j : α} [∀ i, Decidable (i ∈ insert j s)] :
(insert j s).piecewise f g j = f j := by simp [piecewise]
Set.piecewise_insert
theorem
[DecidableEq α] (j : α) [∀ i, Decidable (i ∈ insert j s)] :
(insert j s).piecewise f g = Function.update (s.piecewise f g) j (f j)
theorem piecewise_insert [DecidableEq α] (j : α) [∀ i, Decidable (i ∈ insert j s)] :
(insert j s).piecewise f g = Function.update (s.piecewise f g) j (f j) := by
simp +unfoldPartialApp only [piecewise, mem_insert_iff]
ext i
by_cases h : i = j
· rw [h]
simp
· by_cases h' : i ∈ s <;> simp [h, h']
Set.piecewise_eq_of_mem
theorem
{i : α} (hi : i ∈ s) : s.piecewise f g i = f i
@[simp]
theorem piecewise_eq_of_mem {i : α} (hi : i ∈ s) : s.piecewise f g i = f i :=
if_pos hi
Set.piecewise_eq_of_not_mem
theorem
{i : α} (hi : i ∉ s) : s.piecewise f g i = g i
@[simp]
theorem piecewise_eq_of_not_mem {i : α} (hi : i ∉ s) : s.piecewise f g i = g i :=
if_neg hi
Set.piecewise_singleton
theorem
(x : α) [∀ y, Decidable (y ∈ ({ x } : Set α))] [DecidableEq α] (f g : α → β) :
piecewise { x } f g = Function.update g x (f x)
theorem piecewise_singleton (x : α) [∀ y, Decidable (y ∈ ({x} : Set α))] [DecidableEq α]
(f g : α → β) : piecewise {x} f g = Function.update g x (f x) := by
ext y
by_cases hy : y = x
· subst y
simp
· simp [hy]
Set.piecewise_eqOn
theorem
(f g : α → β) : EqOn (s.piecewise f g) f s
theorem piecewise_eqOn (f g : α → β) : EqOn (s.piecewise f g) f s := fun _ =>
piecewise_eq_of_mem _ _ _
Set.piecewise_eqOn_compl
theorem
(f g : α → β) : EqOn (s.piecewise f g) g sᶜ
theorem piecewise_eqOn_compl (f g : α → β) : EqOn (s.piecewise f g) g sᶜ := fun _ =>
piecewise_eq_of_not_mem _ _ _
Set.piecewise_le
theorem
{δ : α → Type*} [∀ i, Preorder (δ i)] {s : Set α} [∀ j, Decidable (j ∈ s)] {f₁ f₂ g : ∀ i, δ i}
(h₁ : ∀ i ∈ s, f₁ i ≤ g i) (h₂ : ∀ i ∉ s, f₂ i ≤ g i) : s.piecewise f₁ f₂ ≤ g
theorem piecewise_le {δ : α → Type*} [∀ i, Preorder (δ i)] {s : Set α} [∀ j, Decidable (j ∈ s)]
{f₁ f₂ g : ∀ i, δ i} (h₁ : ∀ i ∈ s, f₁ i ≤ g i) (h₂ : ∀ i ∉ s, f₂ i ≤ g i) :
s.piecewise f₁ f₂ ≤ g := fun i => if h : i ∈ s then by simp [*] else by simp [*]
Set.le_piecewise
theorem
{δ : α → Type*} [∀ i, Preorder (δ i)] {s : Set α} [∀ j, Decidable (j ∈ s)] {f₁ f₂ g : ∀ i, δ i}
(h₁ : ∀ i ∈ s, g i ≤ f₁ i) (h₂ : ∀ i ∉ s, g i ≤ f₂ i) : g ≤ s.piecewise f₁ f₂
theorem le_piecewise {δ : α → Type*} [∀ i, Preorder (δ i)] {s : Set α} [∀ j, Decidable (j ∈ s)]
{f₁ f₂ g : ∀ i, δ i} (h₁ : ∀ i ∈ s, g i ≤ f₁ i) (h₂ : ∀ i ∉ s, g i ≤ f₂ i) :
g ≤ s.piecewise f₁ f₂ :=
@piecewise_le α (fun i => (δ i)ᵒᵈ) _ s _ _ _ _ h₁ h₂
Set.piecewise_mono
theorem
{δ : α → Type*} [∀ i, Preorder (δ i)] {s : Set α} [∀ j, Decidable (j ∈ s)] {f₁ f₂ g₁ g₂ : ∀ i, δ i}
(h₁ : ∀ i ∈ s, f₁ i ≤ g₁ i) (h₂ : ∀ i ∉ s, f₂ i ≤ g₂ i) : s.piecewise f₁ f₂ ≤ s.piecewise g₁ g₂
@[gcongr]
theorem piecewise_mono {δ : α → Type*} [∀ i, Preorder (δ i)] {s : Set α}
[∀ j, Decidable (j ∈ s)] {f₁ f₂ g₁ g₂ : ∀ i, δ i} (h₁ : ∀ i ∈ s, f₁ i ≤ g₁ i)
(h₂ : ∀ i ∉ s, f₂ i ≤ g₂ i) : s.piecewise f₁ f₂ ≤ s.piecewise g₁ g₂ := by
apply piecewise_le <;> intros <;> simp [*]
Set.piecewise_insert_of_ne
theorem
{i j : α} (h : i ≠ j) [∀ i, Decidable (i ∈ insert j s)] : (insert j s).piecewise f g i = s.piecewise f g i
@[simp]
theorem piecewise_insert_of_ne {i j : α} (h : i ≠ j) [∀ i, Decidable (i ∈ insert j s)] :
(insert j s).piecewise f g i = s.piecewise f g i := by simp [piecewise, h]
Set.piecewise_compl
theorem
[∀ i, Decidable (i ∈ sᶜ)] : sᶜ.piecewise f g = s.piecewise g f
@[simp]
theorem piecewise_compl [∀ i, Decidable (i ∈ sᶜ)] : sᶜ.piecewise f g = s.piecewise g f :=
funext fun x => if hx : x ∈ s then by simp [hx] else by simp [hx]
Set.piecewise_range_comp
theorem
{ι : Sort*} (f : ι → α) [∀ j, Decidable (j ∈ range f)] (g₁ g₂ : α → β) : (range f).piecewise g₁ g₂ ∘ f = g₁ ∘ f
@[simp]
theorem piecewise_range_comp {ι : Sort*} (f : ι → α) [∀ j, Decidable (j ∈ range f)]
(g₁ g₂ : α → β) : (range f).piecewise g₁ g₂ ∘ f = g₁ ∘ f :=
(piecewise_eqOn ..).comp_eq
Set.piecewise_comp
theorem
(f g : α → γ) (h : β → α) :
letI : DecidablePred (· ∈ h ⁻¹' s) := @instDecidablePredComp _ (· ∈ s) _ h _;
(s.piecewise f g) ∘ h = (h ⁻¹' s).piecewise (f ∘ h) (g ∘ h)
lemma piecewise_comp (f g : α → γ) (h : β → α) :
letI : DecidablePred (· ∈ h ⁻¹' s) := @instDecidablePredComp _ (· ∈ s) _ h _;
(s.piecewise f g) ∘ h = (h⁻¹' s).piecewise (f ∘ h) (g ∘ h) := by
ext x
by_cases hx : h x ∈ s <;> simp [hx]
Set.MapsTo.piecewise_ite
theorem
{s s₁ s₂ : Set α} {t t₁ t₂ : Set β} {f₁ f₂ : α → β} [∀ i, Decidable (i ∈ s)] (h₁ : MapsTo f₁ (s₁ ∩ s) (t₁ ∩ t))
(h₂ : MapsTo f₂ (s₂ ∩ sᶜ) (t₂ ∩ tᶜ)) : MapsTo (s.piecewise f₁ f₂) (s.ite s₁ s₂) (t.ite t₁ t₂)
theorem MapsTo.piecewise_ite {s s₁ s₂ : Set α} {t t₁ t₂ : Set β} {f₁ f₂ : α → β}
[∀ i, Decidable (i ∈ s)] (h₁ : MapsTo f₁ (s₁ ∩ s) (t₁ ∩ t))
(h₂ : MapsTo f₂ (s₂ ∩ sᶜ) (t₂ ∩ tᶜ)) :
MapsTo (s.piecewise f₁ f₂) (s.ite s₁ s₂) (t.ite t₁ t₂) := by
refine (h₁.congr ?_).union_union (h₂.congr ?_)
exacts [(piecewise_eqOn s f₁ f₂).symm.mono inter_subset_right,
(piecewise_eqOn_compl s f₁ f₂).symm.mono inter_subset_right]
Set.eqOn_piecewise
theorem
{f f' g : α → β} {t} : EqOn (s.piecewise f f') g t ↔ EqOn f g (t ∩ s) ∧ EqOn f' g (t ∩ sᶜ)
theorem eqOn_piecewise {f f' g : α → β} {t} :
EqOnEqOn (s.piecewise f f') g t ↔ EqOn f g (t ∩ s) ∧ EqOn f' g (t ∩ sᶜ) := by
simp only [EqOn, ← forall_and]
refine forall_congr' fun a => ?_; by_cases a ∈ s <;> simp [*]
Set.EqOn.piecewise_ite'
theorem
{f f' g : α → β} {t t'} (h : EqOn f g (t ∩ s)) (h' : EqOn f' g (t' ∩ sᶜ)) : EqOn (s.piecewise f f') g (s.ite t t')
theorem EqOn.piecewise_ite' {f f' g : α → β} {t t'} (h : EqOn f g (t ∩ s))
(h' : EqOn f' g (t' ∩ sᶜ)) : EqOn (s.piecewise f f') g (s.ite t t') := by
simp [eqOn_piecewise, *]
Set.EqOn.piecewise_ite
theorem
{f f' g : α → β} {t t'} (h : EqOn f g t) (h' : EqOn f' g t') : EqOn (s.piecewise f f') g (s.ite t t')
theorem EqOn.piecewise_ite {f f' g : α → β} {t t'} (h : EqOn f g t) (h' : EqOn f' g t') :
EqOn (s.piecewise f f') g (s.ite t t') :=
(h.mono inter_subset_left).piecewise_ite' s (h'.mono inter_subset_left)
Set.piecewise_preimage
theorem
(f g : α → β) (t) : s.piecewise f g ⁻¹' t = s.ite (f ⁻¹' t) (g ⁻¹' t)
theorem piecewise_preimage (f g : α → β) (t) : s.piecewise f g ⁻¹' t = s.ite (f ⁻¹' t) (g ⁻¹' t) :=
ext fun x => by by_cases x ∈ s <;> simp [*, Set.ite]
Set.apply_piecewise
theorem
{δ' : α → Sort*} (h : ∀ i, δ i → δ' i) {x : α} :
h x (s.piecewise f g x) = s.piecewise (fun x => h x (f x)) (fun x => h x (g x)) x
theorem apply_piecewise {δ' : α → Sort*} (h : ∀ i, δ i → δ' i) {x : α} :
h x (s.piecewise f g x) = s.piecewise (fun x => h x (f x)) (fun x => h x (g x)) x := by
by_cases hx : x ∈ s <;> simp [hx]
Set.apply_piecewise₂
theorem
{δ' δ'' : α → Sort*} (f' g' : ∀ i, δ' i) (h : ∀ i, δ i → δ' i → δ'' i) {x : α} :
h x (s.piecewise f g x) (s.piecewise f' g' x) = s.piecewise (fun x => h x (f x) (f' x)) (fun x => h x (g x) (g' x)) x
theorem apply_piecewise₂ {δ' δ'' : α → Sort*} (f' g' : ∀ i, δ' i) (h : ∀ i, δ i → δ' i → δ'' i)
{x : α} :
h x (s.piecewise f g x) (s.piecewise f' g' x) =
s.piecewise (fun x => h x (f x) (f' x)) (fun x => h x (g x) (g' x)) x := by
by_cases hx : x ∈ s <;> simp [hx]
Set.piecewise_op
theorem
{δ' : α → Sort*} (h : ∀ i, δ i → δ' i) :
(s.piecewise (fun x => h x (f x)) fun x => h x (g x)) = fun x => h x (s.piecewise f g x)
theorem piecewise_op {δ' : α → Sort*} (h : ∀ i, δ i → δ' i) :
(s.piecewise (fun x => h x (f x)) fun x => h x (g x)) = fun x => h x (s.piecewise f g x) :=
funext fun _ => (apply_piecewise _ _ _ _).symm
Set.piecewise_op₂
theorem
{δ' δ'' : α → Sort*} (f' g' : ∀ i, δ' i) (h : ∀ i, δ i → δ' i → δ'' i) :
(s.piecewise (fun x => h x (f x) (f' x)) fun x => h x (g x) (g' x)) = fun x =>
h x (s.piecewise f g x) (s.piecewise f' g' x)
theorem piecewise_op₂ {δ' δ'' : α → Sort*} (f' g' : ∀ i, δ' i) (h : ∀ i, δ i → δ' i → δ'' i) :
(s.piecewise (fun x => h x (f x) (f' x)) fun x => h x (g x) (g' x)) = fun x =>
h x (s.piecewise f g x) (s.piecewise f' g' x) :=
funext fun _ => (apply_piecewise₂ _ _ _ _ _ _).symm
Set.piecewise_same
theorem
: s.piecewise f f = f
@[simp]
theorem piecewise_same : s.piecewise f f = f := by
ext x
by_cases hx : x ∈ s <;> simp [hx]
Set.range_piecewise
theorem
(f g : α → β) : range (s.piecewise f g) = f '' s ∪ g '' sᶜ
theorem range_piecewise (f g : α → β) : range (s.piecewise f g) = f '' sf '' s ∪ g '' sᶜ := by
ext y; constructor
· rintro ⟨x, rfl⟩
by_cases h : x ∈ s <;> [left; right] <;> use x <;> simp [h]
· rintro (⟨x, hx, rfl⟩ | ⟨x, hx, rfl⟩) <;> use x <;> simp_all
Set.injective_piecewise_iff
theorem
{f g : α → β} : Injective (s.piecewise f g) ↔ InjOn f s ∧ InjOn g sᶜ ∧ ∀ x ∈ s, ∀ y ∉ s, f x ≠ g y
theorem injective_piecewise_iff {f g : α → β} :
InjectiveInjective (s.piecewise f g) ↔
InjOn f s ∧ InjOn g sᶜ ∧ ∀ x ∈ s, ∀ y ∉ s, f x ≠ g y := by
rw [injective_iff_injOn_univ, ← union_compl_self s, injOn_union (@disjoint_compl_right _ _ s),
(piecewise_eqOn s f g).injOn_iff, (piecewise_eqOn_compl s f g).injOn_iff]
refine and_congr Iff.rfl (and_congr Iff.rfl <| forall₄_congr fun x hx y hy => ?_)
rw [piecewise_eq_of_mem s f g hx, piecewise_eq_of_not_mem s f g hy]
Set.piecewise_mem_pi
theorem
{δ : α → Type*} {t : Set α} {t' : ∀ i, Set (δ i)} {f g} (hf : f ∈ pi t t') (hg : g ∈ pi t t') :
s.piecewise f g ∈ pi t t'
theorem piecewise_mem_pi {δ : α → Type*} {t : Set α} {t' : ∀ i, Set (δ i)} {f g} (hf : f ∈ pi t t')
(hg : g ∈ pi t t') : s.piecewise f g ∈ pi t t' := by
intro i ht
by_cases hs : i ∈ s <;> simp [hf i ht, hg i ht, hs]
Set.pi_piecewise
theorem
{ι : Type*} {α : ι → Type*} (s s' : Set ι) (t t' : ∀ i, Set (α i)) [∀ x, Decidable (x ∈ s')] :
pi s (s'.piecewise t t') = pi (s ∩ s') t ∩ pi (s \ s') t'
@[simp]
theorem pi_piecewise {ι : Type*} {α : ι → Type*} (s s' : Set ι) (t t' : ∀ i, Set (α i))
[∀ x, Decidable (x ∈ s')] : pi s (s'.piecewise t t') = pipi (s ∩ s') t ∩ pi (s \ s') t' :=
pi_if _ _ _
Set.univ_pi_piecewise
theorem
{ι : Type*} {α : ι → Type*} (s : Set ι) (t t' : ∀ i, Set (α i)) [∀ x, Decidable (x ∈ s)] :
pi univ (s.piecewise t t') = pi s t ∩ pi sᶜ t'
theorem univ_pi_piecewise {ι : Type*} {α : ι → Type*} (s : Set ι) (t t' : ∀ i, Set (α i))
[∀ x, Decidable (x ∈ s)] : pi univ (s.piecewise t t') = pipi s t ∩ pi sᶜ t' := by
simp [compl_eq_univ_diff]
Set.univ_pi_piecewise_univ
theorem
{ι : Type*} {α : ι → Type*} (s : Set ι) (t : ∀ i, Set (α i)) [∀ x, Decidable (x ∈ s)] :
pi univ (s.piecewise t fun _ => univ) = pi s t