data.sum

# More theorems about the sum type #

@[simp]
def sum.get_left {α : Type u_1} {β : Type u_2} :
α β

Check if a sum is inl and if so, retrieve its contents.

Equations
@[simp]
def sum.get_right {α : Type u_1} {β : Type u_2} :
α β

Check if a sum is inr and if so, retrieve its contents.

Equations
@[simp]
def sum.is_left {α : Type u_1} {β : Type u_2} :
α βbool

Check if a sum is inl.

Equations
@[simp]
def sum.is_right {α : Type u_1} {β : Type u_2} :
α βbool

Check if a sum is inr.

Equations
@[protected, instance]
def sum.decidable_eq (α : Type u) [a : decidable_eq α] (β : Type v) [a_1 : decidable_eq β] :
@[simp]
theorem sum.forall {α : Type u} {β : Type v} {p : α β → Prop} :
(∀ (x : α β), p x) (∀ (a : α), p (sum.inl a)) ∀ (b : β), p (sum.inr b)
@[simp]
theorem sum.exists {α : Type u} {β : Type v} {p : α β → Prop} :
(∃ (x : α β), p x) (∃ (a : α), p (sum.inl a)) ∃ (b : β), p (sum.inr b)
theorem sum.inl_injective {α : Type u} {β : Type v} :
theorem sum.inr_injective {α : Type u} {β : Type v} :
@[protected]
def sum.map {α : Type u} {α' : Type w} {β : Type v} {β' : Type x} (f : α → α') (g : β → β') :
α βα' β'

Map α ⊕ β to α' ⊕ β' sending α to α' and β to β'.

Equations
@[simp]
theorem sum.map_inl {α : Type u} {α' : Type w} {β : Type v} {β' : Type x} (f : α → α') (g : β → β') (x : α) :
g (sum.inl x) = sum.inl (f x)
@[simp]
theorem sum.map_inr {α : Type u} {α' : Type w} {β : Type v} {β' : Type x} (f : α → α') (g : β → β') (x : β) :
g (sum.inr x) = sum.inr (g x)
@[simp]
theorem sum.map_map {α : Type u} {α' : Type w} {β : Type v} {β' : Type x} {α'' : Type u_1} {β'' : Type u_2} (f' : α' → α'') (g' : β' → β'') (f : α → α') (g : β → β') (x : α β) :
sum.map f' g' (sum.map f g x) = sum.map (f' f) (g' g) x
@[simp]
theorem sum.map_comp_map {α : Type u} {α' : Type w} {β : Type v} {β' : Type x} {α'' : Type u_1} {β'' : Type u_2} (f' : α' → α'') (g' : β' → β'') (f : α → α') (g : β → β') :
sum.map f' g' g = sum.map (f' f) (g' g)
@[simp]
theorem sum.map_id_id (α : Type u_1) (β : Type u_2) :
theorem sum.inl.inj_iff {α : Type u} {β : Type v} {a b : α} :
= a = b
theorem sum.inr.inj_iff {α : Type u} {β : Type v} {a b : β} :
= a = b
theorem sum.inl_ne_inr {α : Type u} {β : Type v} {a : α} {b : β} :
theorem sum.inr_ne_inl {α : Type u} {β : Type v} {a : α} {b : β} :
@[protected]
def sum.elim {α : Type u_1} {β : Type u_2} {γ : Sort u_3} (f : α → γ) (g : β → γ) :
α β → γ

Define a function on α ⊕ β by giving separate definitions on α and β.

Equations
• g = λ (x : α β), x.rec_on f g
@[simp]
theorem sum.elim_inl {α : Type u_1} {β : Type u_2} {γ : Sort u_3} (f : α → γ) (g : β → γ) (x : α) :
g (sum.inl x) = f x
@[simp]
theorem sum.elim_inr {α : Type u_1} {β : Type u_2} {γ : Sort u_3} (f : α → γ) (g : β → γ) (x : β) :
g (sum.inr x) = g x
@[simp]
theorem sum.elim_comp_inl {α : Type u_1} {β : Type u_2} {γ : Sort u_3} (f : α → γ) (g : β → γ) :
@[simp]
theorem sum.elim_comp_inr {α : Type u_1} {β : Type u_2} {γ : Sort u_3} (f : α → γ) (g : β → γ) :
@[simp]
theorem sum.elim_inl_inr {α : Type u_1} {β : Type u_2} :
theorem sum.comp_elim {α : Type u_1} {β : Type u_2} {γ : Sort u_3} {δ : Sort u_4} (f : γ → δ) (g : α → γ) (h : β → γ) :
f h = sum.elim (f g) (f h)
@[simp]
theorem sum.elim_comp_inl_inr {α : Type u_1} {β : Type u_2} {γ : Sort u_3} (f : α β → γ) :
@[simp]
theorem sum.update_elim_inl {α : Type u_1} {β : Type u_2} {γ : Sort u_3} [decidable_eq α] [decidable_eq β)] {f : α → γ} {g : β → γ} {i : α} {x : γ} :
@[simp]
theorem sum.update_elim_inr {α : Type u_1} {β : Type u_2} {γ : Sort u_3} [decidable_eq β] [decidable_eq β)] {f : α → γ} {g : β → γ} {i : β} {x : γ} :
@[simp]
theorem sum.update_inl_comp_inl {α : Type u_1} {β : Type u_2} {γ : Sort u_3} [decidable_eq α] [decidable_eq β)] {f : α β → γ} {i : α} {x : γ} :
(sum.inl i) x sum.inl = i x
@[simp]
theorem sum.update_inl_apply_inl {α : Type u_1} {β : Type u_2} {γ : Sort u_3} [decidable_eq α] [decidable_eq β)] {f : α β → γ} {i j : α} {x : γ} :
(sum.inl i) x (sum.inl j) = i x j
@[simp]
theorem sum.update_inl_comp_inr {α : Type u_1} {β : Type u_2} {γ : Sort u_3} [decidable_eq β)] {f : α β → γ} {i : α} {x : γ} :
@[simp]
theorem sum.update_inl_apply_inr {α : Type u_1} {β : Type u_2} {γ : Sort u_3} [decidable_eq β)] {f : α β → γ} {i : α} {j : β} {x : γ} :
(sum.inl i) x (sum.inr j) = f (sum.inr j)
@[simp]
theorem sum.update_inr_comp_inl {α : Type u_1} {β : Type u_2} {γ : Sort u_3} [decidable_eq β)] {f : α β → γ} {i : β} {x : γ} :
@[simp]
theorem sum.update_inr_apply_inl {α : Type u_1} {β : Type u_2} {γ : Sort u_3} [decidable_eq β)] {f : α β → γ} {i : α} {j : β} {x : γ} :
(sum.inr j) x (sum.inl i) = f (sum.inl i)
@[simp]
theorem sum.update_inr_comp_inr {α : Type u_1} {β : Type u_2} {γ : Sort u_3} [decidable_eq β] [decidable_eq β)] {f : α β → γ} {i : β} {x : γ} :
(sum.inr i) x sum.inr = i x
@[simp]
theorem sum.update_inr_apply_inr {α : Type u_1} {β : Type u_2} {γ : Sort u_3} [decidable_eq β] [decidable_eq β)] {f : α β → γ} {i j : β} {x : γ} :
(sum.inr i) x (sum.inr j) = i x j
inductive sum.lex {α : Type u} {β : Type v} (ra : α → α → Prop) (rb : β → β → Prop) :
α βα β → Prop
• inl : ∀ {α : Type u} {β : Type v} (ra : α → α → Prop) (rb : β → β → Prop) {a₁ a₂ : α}, ra a₁ a₂sum.lex ra rb (sum.inl a₁) (sum.inl a₂)
• inr : ∀ {α : Type u} {β : Type v} (ra : α → α → Prop) (rb : β → β → Prop) {b₁ b₂ : β}, rb b₁ b₂sum.lex ra rb (sum.inr b₁) (sum.inr b₂)
• sep : ∀ {α : Type u} {β : Type v} (ra : α → α → Prop) (rb : β → β → Prop) (a : α) (b : β), sum.lex ra rb (sum.inl a) (sum.inr b)

Lexicographic order for sum. Sort all the inl a before the inr b, otherwise use the respective order on α or β.

@[simp]
theorem sum.lex_inl_inl {α : Type u} {β : Type v} {ra : α → α → Prop} {rb : β → β → Prop} {a₁ a₂ : α} :
sum.lex ra rb (sum.inl a₁) (sum.inl a₂) ra a₁ a₂
@[simp]
theorem sum.lex_inr_inr {α : Type u} {β : Type v} {ra : α → α → Prop} {rb : β → β → Prop} {b₁ b₂ : β} :
sum.lex ra rb (sum.inr b₁) (sum.inr b₂) rb b₁ b₂
@[simp]
theorem sum.lex_inr_inl {α : Type u} {β : Type v} {ra : α → α → Prop} {rb : β → β → Prop} {b : β} {a : α} :
¬sum.lex ra rb (sum.inr b) (sum.inl a)
theorem sum.lex_acc_inl {α : Type u} {β : Type v} {ra : α → α → Prop} {rb : β → β → Prop} {a : α} (aca : acc ra a) :
acc (sum.lex ra rb) (sum.inl a)
theorem sum.lex_acc_inr {α : Type u} {β : Type v} {ra : α → α → Prop} {rb : β → β → Prop} (aca : ∀ (a : α), acc (sum.lex ra rb) (sum.inl a)) {b : β} (acb : acc rb b) :
acc (sum.lex ra rb) (sum.inr b)
theorem sum.lex_wf {α : Type u} {β : Type v} {ra : α → α → Prop} {rb : β → β → Prop} (ha : well_founded ra) (hb : well_founded rb) :
@[simp]
def sum.swap {α : Type u} {β : Type v} :
α ββ α

Swap the factors of a sum type

Equations
@[simp]
theorem sum.swap_swap {α : Type u} {β : Type v} (x : α β) :
x.swap.swap = x
@[simp]
theorem sum.swap_swap_eq {α : Type u} {β : Type v} :
@[simp]
theorem sum.swap_left_inverse {α : Type u} {β : Type v} :
@[simp]
theorem sum.swap_right_inverse {α : Type u} {β : Type v} :
theorem function.injective.sum_elim {α : Type u} {β : Type v} {γ : Sort u_1} {f : α → γ} {g : β → γ} (hf : function.injective f) (hg : function.injective g) (hfg : ∀ (a : α) (b : β), f a g b) :
theorem function.injective.sum_map {α : Type u} {α' : Type w} {β : Type v} {β' : Type x} {f : α → β} {g : α' → β'} (hf : function.injective f) (hg : function.injective g) :
theorem function.surjective.sum_map {α : Type u} {α' : Type w} {β : Type v} {β' : Type x} {f : α → β} {g : α' → β'} (hf : function.surjective f) (hg : function.surjective g) :