Theorem: LocalEquiv.ext
File: Mathlib/Logic/Equiv/LocalEquiv.lean

tactic: have A : (e : α → β) = e' := by
  ext x
  exact h x
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.34908
δ : Type ?u.34911
e✝ : LocalEquiv α β
e'✝ : LocalEquiv β γ
e e' : LocalEquiv α β
h : ∀ (x : α), ↑e x = ↑e' x
hsymm : ∀ (x : β), ↑(LocalEquiv.symm e) x = ↑(LocalEquiv.symm e') x
hs : e.source = e'.source
⊢ e = e'

tactic: have B : (e.symm : β → α) = e'.symm := by
  ext x
  exact hsymm x
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.34908
δ : Type ?u.34911
e✝ : LocalEquiv α β
e'✝ : LocalEquiv β γ
e e' : LocalEquiv α β
h : ∀ (x : α), ↑e x = ↑e' x
hsymm : ∀ (x : β), ↑(LocalEquiv.symm e) x = ↑(LocalEquiv.symm e') x
hs : e.source = e'.source
A : ↑e = ↑e'
⊢ e = e'

tactic: have I : e '' e.source = e.target := e.image_source_eq_target
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.34908
δ : Type ?u.34911
e✝ : LocalEquiv α β
e'✝ : LocalEquiv β γ
e e' : LocalEquiv α β
h : ∀ (x : α), ↑e x = ↑e' x
hsymm : ∀ (x : β), ↑(LocalEquiv.symm e) x = ↑(LocalEquiv.symm e') x
hs : e.source = e'.source
A : ↑e = ↑e'
B : ↑(LocalEquiv.symm e) = ↑(LocalEquiv.symm e')
⊢ e = e'

tactic: have I' : e' '' e'.source = e'.target := e'.image_source_eq_target
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.34908
δ : Type ?u.34911
e✝ : LocalEquiv α β
e'✝ : LocalEquiv β γ
e e' : LocalEquiv α β
h : ∀ (x : α), ↑e x = ↑e' x
hsymm : ∀ (x : β), ↑(LocalEquiv.symm e) x = ↑(LocalEquiv.symm e') x
hs : e.source = e'.source
A : ↑e = ↑e'
B : ↑(LocalEquiv.symm e) = ↑(LocalEquiv.symm e')
I : ↑e '' e.source = e.target
⊢ e = e'

tactic: rw [A, hs, I'] at I
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.34908
δ : Type ?u.34911
e✝ : LocalEquiv α β
e'✝ : LocalEquiv β γ
e e' : LocalEquiv α β
h : ∀ (x : α), ↑e x = ↑e' x
hsymm : ∀ (x : β), ↑(LocalEquiv.symm e) x = ↑(LocalEquiv.symm e') x
hs : e.source = e'.source
A : ↑e = ↑e'
B : ↑(LocalEquiv.symm e) = ↑(LocalEquiv.symm e')
I : ↑e '' e.source = e.target
I' : ↑e' '' e'.source = e'.target
⊢ e = e'

tactic: cases e
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.34908
δ : Type ?u.34911
e✝ : LocalEquiv α β
e'✝ : LocalEquiv β γ
e e' : LocalEquiv α β
h : ∀ (x : α), ↑e x = ↑e' x
hsymm : ∀ (x : β), ↑(LocalEquiv.symm e) x = ↑(LocalEquiv.symm e') x
hs : e.source = e'.source
A : ↑e = ↑e'
B : ↑(LocalEquiv.symm e) = ↑(LocalEquiv.symm e')
I : e'.target = e.target
I' : ↑e' '' e'.source = e'.target
⊢ e = e'

tactic: cases e'
state_before: case mk
α : Type u_1
β : Type u_2
γ : Type ?u.34908
δ : Type ?u.34911
e : LocalEquiv α β
e'✝ : LocalEquiv β γ
e' : LocalEquiv α β
I' : ↑e' '' e'.source = e'.target
toFun✝ : α → β
invFun✝ : β → α
source✝ : Set α
target✝ : Set β
map_source'✝ : ∀ ⦃x : α⦄, x ∈ source✝ → toFun✝ x ∈ target✝
map_target'✝ : ∀ ⦃x : β⦄, x ∈ target✝ → invFun✝ x ∈ source✝
left_inv'✝ : ∀ ⦃x : α⦄, x ∈ source✝ → invFun✝ (toFun✝ x) = x
right_inv'✝ : ∀ ⦃x : β⦄, x ∈ target✝ → toFun✝ (invFun✝ x) = x
h :
  ∀ (x : α),
    ↑{ toFun := toFun✝, invFun := invFun✝, source := source✝, target := target✝, map_source' := map_source'✝,
            map_target' := map_target'✝, left_inv' := left_inv'✝, right_inv' := right_inv'✝ }
        x =
      ↑e' x
hsymm :
  ∀ (x : β),
    ↑(LocalEquiv.symm
            { toFun := toFun✝, invFun := invFun✝, source := source✝, target := target✝, map_source' := map_source'✝,
              map_target' := map_target'✝, left_inv' := left_inv'✝, right_inv' := right_inv'✝ })
        x =
      ↑(LocalEquiv.symm e') x
hs :
  { toFun := toFun✝, invFun := invFun✝, source := source✝, target := target✝, map_source' := map_source'✝,
        map_target' := map_target'✝, left_inv' := left_inv'✝, right_inv' := right_inv'✝ }.source =
    e'.source
A :
  ↑{ toFun := toFun✝, invFun := invFun✝, source := source✝, target := target✝, map_source' := map_source'✝,
        map_target' := map_target'✝, left_inv' := left_inv'✝, right_inv' := right_inv'✝ } =
    ↑e'
B :
  ↑(LocalEquiv.symm
        { toFun := toFun✝, invFun := invFun✝, source := source✝, target := target✝, map_source' := map_source'✝,
          map_target' := map_target'✝, left_inv' := left_inv'✝, right_inv' := right_inv'✝ }) =
    ↑(LocalEquiv.symm e')
I :
  e'.target =
    { toFun := toFun✝, invFun := invFun✝, source := source✝, target := target✝, map_source' := map_source'✝,
        map_target' := map_target'✝, left_inv' := left_inv'✝, right_inv' := right_inv'✝ }.target
⊢ { toFun := toFun✝, invFun := invFun✝, source := source✝, target := target✝, map_source' := map_source'✝,
      map_target' := map_target'✝, left_inv' := left_inv'✝, right_inv' := right_inv'✝ } =
    e'

tactic: simp [*] at *
state_before: case mk.mk
α : Type u_1
β : Type u_2
γ : Type ?u.34908
δ : Type ?u.34911
e : LocalEquiv α β
e' : LocalEquiv β γ
toFun✝¹ : α → β
invFun✝¹ : β → α
source✝¹ : Set α
target✝¹ : Set β
map_source'✝¹ : ∀ ⦃x : α⦄, x ∈ source✝¹ → toFun✝¹ x ∈ target✝¹
map_target'✝¹ : ∀ ⦃x : β⦄, x ∈ target✝¹ → invFun✝¹ x ∈ source✝¹
left_inv'✝¹ : ∀ ⦃x : α⦄, x ∈ source✝¹ → invFun✝¹ (toFun✝¹ x) = x
right_inv'✝¹ : ∀ ⦃x : β⦄, x ∈ target✝¹ → toFun✝¹ (invFun✝¹ x) = x
toFun✝ : α → β
invFun✝ : β → α
source✝ : Set α
target✝ : Set β
map_source'✝ : ∀ ⦃x : α⦄, x ∈ source✝ → toFun✝ x ∈ target✝
map_target'✝ : ∀ ⦃x : β⦄, x ∈ target✝ → invFun✝ x ∈ source✝
left_inv'✝ : ∀ ⦃x : α⦄, x ∈ source✝ → invFun✝ (toFun✝ x) = x
right_inv'✝ : ∀ ⦃x : β⦄, x ∈ target✝ → toFun✝ (invFun✝ x) = x
I' :
  ↑{ toFun := toFun✝, invFun := invFun✝, source := source✝, target := target✝, map_source' := map_source'✝,
          map_target' := map_target'✝, left_inv' := left_inv'✝, right_inv' := right_inv'✝ } ''
      { toFun := toFun✝, invFun := invFun✝, source := source✝, target := target✝, map_source' := map_source'✝,
          map_target' := map_target'✝, left_inv' := left_inv'✝, right_inv' := right_inv'✝ }.source =
    { toFun := toFun✝, invFun := invFun✝, source := source✝, target := target✝, map_source' := map_source'✝,
        map_target' := map_target'✝, left_inv' := left_inv'✝, right_inv' := right_inv'✝ }.target
h :
  ∀ (x : α),
    ↑{ toFun := toFun✝¹, invFun := invFun✝¹, source := source✝¹, target := target✝¹, map_source' := map_source'✝¹,
            map_target' := map_target'✝¹, left_inv' := left_inv'✝¹, right_inv' := right_inv'✝¹ }
        x =
      ↑{ toFun := toFun✝, invFun := invFun✝, source := source✝, target := target✝, map_source' := map_source'✝,
            map_target' := map_target'✝, left_inv' := left_inv'✝, right_inv' := right_inv'✝ }
        x
hsymm :
  ∀ (x : β),
    ↑(LocalEquiv.symm
            { toFun := toFun✝¹, invFun := invFun✝¹, source := source✝¹, target := target✝¹,
              map_source' := map_source'✝¹, map_target' := map_target'✝¹, left_inv' := left_inv'✝¹,
              right_inv' := right_inv'✝¹ })
        x =
      ↑(LocalEquiv.symm
            { toFun := toFun✝, invFun := invFun✝, source := source✝, target := target✝, map_source' := map_source'✝,
              map_target' := map_target'✝, left_inv' := left_inv'✝, right_inv' := right_inv'✝ })
        x
hs :
  { toFun := toFun✝¹, invFun := invFun✝¹, source := source✝¹, target := target✝¹, map_source' := map_source'✝¹,
        map_target' := map_target'✝¹, left_inv' := left_inv'✝¹, right_inv' := right_inv'✝¹ }.source =
    { toFun := toFun✝, invFun := invFun✝, source := source✝, target := target✝, map_source' := map_source'✝,
        map_target' := map_target'✝, left_inv' := left_inv'✝, right_inv' := right_inv'✝ }.source
A :
  ↑{ toFun := toFun✝¹, invFun := invFun✝¹, source := source✝¹, target := target✝¹, map_source' := map_source'✝¹,
        map_target' := map_target'✝¹, left_inv' := left_inv'✝¹, right_inv' := right_inv'✝¹ } =
    ↑{ toFun := toFun✝, invFun := invFun✝, source := source✝, target := target✝, map_source' := map_source'✝,
        map_target' := map_target'✝, left_inv' := left_inv'✝, right_inv' := right_inv'✝ }
B :
  ↑(LocalEquiv.symm
        { toFun := toFun✝¹, invFun := invFun✝¹, source := source✝¹, target := target✝¹, map_source' := map_source'✝¹,
          map_target' := map_target'✝¹, left_inv' := left_inv'✝¹, right_inv' := right_inv'✝¹ }) =
    ↑(LocalEquiv.symm
        { toFun := toFun✝, invFun := invFun✝, source := source✝, target := target✝, map_source' := map_source'✝,
          map_target' := map_target'✝, left_inv' := left_inv'✝, right_inv' := right_inv'✝ })
I :
  { toFun := toFun✝, invFun := invFun✝, source := source✝, target := target✝, map_source' := map_source'✝,
        map_target' := map_target'✝, left_inv' := left_inv'✝, right_inv' := right_inv'✝ }.target =
    { toFun := toFun✝¹, invFun := invFun✝¹, source := source✝¹, target := target✝¹, map_source' := map_source'✝¹,
        map_target' := map_target'✝¹, left_inv' := left_inv'✝¹, right_inv' := right_inv'✝¹ }.target
⊢ { toFun := toFun✝¹, invFun := invFun✝¹, source := source✝¹, target := target✝¹, map_source' := map_source'✝¹,
      map_target' := map_target'✝¹, left_inv' := left_inv'✝¹, right_inv' := right_inv'✝¹ } =
    { toFun := toFun✝, invFun := invFun✝, source := source✝, target := target✝, map_source' := map_source'✝,
      map_target' := map_target'✝, left_inv' := left_inv'✝, right_inv' := right_inv'✝ }

tactic: simp [*]
state_before: case mk.mk
α : Type u_1
β : Type u_2
γ : Type ?u.34908
δ : Type ?u.34911
e : LocalEquiv α β
e' : LocalEquiv β γ
toFun✝¹ : α → β
invFun✝¹ : β → α
source✝¹ : Set α
target✝¹ : Set β
map_source'✝¹ : ∀ ⦃x : α⦄, x ∈ source✝¹ → toFun✝¹ x ∈ target✝¹
map_target'✝¹ : ∀ ⦃x : β⦄, x ∈ target✝¹ → invFun✝¹ x ∈ source✝¹
left_inv'✝¹ : ∀ ⦃x : α⦄, x ∈ source✝¹ → invFun✝¹ (toFun✝¹ x) = x
right_inv'✝¹ : ∀ ⦃x : β⦄, x ∈ target✝¹ → toFun✝¹ (invFun✝¹ x) = x
toFun✝ : α → β
invFun✝ : β → α
source✝ : Set α
target✝ : Set β
map_source'✝ : ∀ ⦃x : α⦄, x ∈ source✝ → toFun✝ x ∈ target✝
map_target'✝ : ∀ ⦃x : β⦄, x ∈ target✝ → invFun✝ x ∈ source✝
left_inv'✝ : ∀ ⦃x : α⦄, x ∈ source✝ → invFun✝ (toFun✝ x) = x
right_inv'✝ : ∀ ⦃x : β⦄, x ∈ target✝ → toFun✝ (invFun✝ x) = x
h : ∀ (x : α), toFun✝¹ x = toFun✝ x
hsymm : ∀ (x : β), invFun✝¹ x = invFun✝ x
hs : source✝¹ = source✝
A : toFun✝¹ = toFun✝
B : invFun✝¹ = invFun✝
I : target✝ = target✝¹
I' : (fun a => toFun✝ a) '' source✝ = target✝
⊢ toFun✝¹ = toFun✝ ∧ invFun✝¹ = invFun✝ ∧ source✝¹ = source✝ ∧ target✝¹ = target✝

tactic: ext x
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.34908
δ : Type ?u.34911
e✝ : LocalEquiv α β
e'✝ : LocalEquiv β γ
e e' : LocalEquiv α β
h : ∀ (x : α), ↑e x = ↑e' x
hsymm : ∀ (x : β), ↑(LocalEquiv.symm e) x = ↑(LocalEquiv.symm e') x
hs : e.source = e'.source
⊢ ↑e = ↑e'

tactic: exact h x
state_before: case h
α : Type u_1
β : Type u_2
γ : Type ?u.34908
δ : Type ?u.34911
e✝ : LocalEquiv α β
e'✝ : LocalEquiv β γ
e e' : LocalEquiv α β
h : ∀ (x : α), ↑e x = ↑e' x
hsymm : ∀ (x : β), ↑(LocalEquiv.symm e) x = ↑(LocalEquiv.symm e') x
hs : e.source = e'.source
x : α
⊢ ↑e x = ↑e' x

tactic: ext x
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.34908
δ : Type ?u.34911
e✝ : LocalEquiv α β
e'✝ : LocalEquiv β γ
e e' : LocalEquiv α β
h : ∀ (x : α), ↑e x = ↑e' x
hsymm : ∀ (x : β), ↑(LocalEquiv.symm e) x = ↑(LocalEquiv.symm e') x
hs : e.source = e'.source
A : ↑e = ↑e'
⊢ ↑(LocalEquiv.symm e) = ↑(LocalEquiv.symm e')

tactic: exact hsymm x
state_before: case h
α : Type u_1
β : Type u_2
γ : Type ?u.34908
δ : Type ?u.34911
e✝ : LocalEquiv α β
e'✝ : LocalEquiv β γ
e e' : LocalEquiv α β
h : ∀ (x : α), ↑e x = ↑e' x
hsymm : ∀ (x : β), ↑(LocalEquiv.symm e) x = ↑(LocalEquiv.symm e') x
hs : e.source = e'.source
A : ↑e = ↑e'
x : β
⊢ ↑(LocalEquiv.symm e) x = ↑(LocalEquiv.symm e') x