Theorem: Matrix.blockTriangular_inv_of_blockTriangular
File: Mathlib/LinearAlgebra/Matrix/Block.lean

tactic: clear N
state_before: α : Type u_1
β : Type ?u.170494
m : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁶ : CommRing R
M N : Matrix m m R
b : m → α
inst✝⁵ : DecidableEq m
inst✝⁴ : Fintype m
inst✝³ : DecidableEq n
inst✝² : Fintype n
inst✝¹ : LinearOrder α
inst✝ : Invertible M
hM : BlockTriangular M b
⊢ BlockTriangular M⁻¹ b

tactic: induction' hs : univ.image b using Finset.strongInduction with s ih generalizing m
state_before: α : Type u_1
β : Type ?u.170494
m : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁶ : CommRing R
M : Matrix m m R
b : m → α
inst✝⁵ : DecidableEq m
inst✝⁴ : Fintype m
inst✝³ : DecidableEq n
inst✝² : Fintype n
inst✝¹ : LinearOrder α
inst✝ : Invertible M
hM : BlockTriangular M b
⊢ BlockTriangular M⁻¹ b

tactic: subst hs
state_before: case H
α : Type u_1
β : Type ?u.170494
m✝ : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁹ : CommRing R
M✝ : Matrix m✝ m✝ R
b✝ : m✝ → α
inst✝⁸ : DecidableEq m✝
inst✝⁷ : Fintype m✝
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : LinearOrder α
inst✝³ : Invertible M✝
hM✝ : BlockTriangular M✝ b✝
x✝ : Finset α
hs✝ : image b✝ univ = x✝
s : Finset α
ih :
  ∀ (t : Finset α),
    t ⊂ s →
      ∀ {m : Type u_2} {M : Matrix m m R} {b : m → α} [inst : DecidableEq m] [inst_1 : Fintype m]
        [inst_2 : Invertible M], BlockTriangular M b → image b univ = t → BlockTriangular M⁻¹ b
m : Type u_2
M : Matrix m m R
b : m → α
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : Invertible M
hM : BlockTriangular M b
hs : image b univ = s
⊢ BlockTriangular M⁻¹ b

tactic: intro i j hij
state_before: case H
α : Type u_1
β : Type ?u.170494
m✝ : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁹ : CommRing R
M✝ : Matrix m✝ m✝ R
b✝ : m✝ → α
inst✝⁸ : DecidableEq m✝
inst✝⁷ : Fintype m✝
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : LinearOrder α
inst✝³ : Invertible M✝
hM✝ : BlockTriangular M✝ b✝
x✝ : Finset α
hs : image b✝ univ = x✝
m : Type u_2
M : Matrix m m R
b : m → α
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : Invertible M
hM : BlockTriangular M b
ih :
  ∀ (t : Finset α),
    t ⊂ image b univ →
      ∀ {m : Type u_2} {M : Matrix m m R} {b : m → α} [inst : DecidableEq m] [inst_1 : Fintype m]
        [inst_2 : Invertible M], BlockTriangular M b → image b univ = t → BlockTriangular M⁻¹ b
⊢ BlockTriangular M⁻¹ b

tactic: haveI : Inhabited m := ⟨i⟩
state_before: case H
α : Type u_1
β : Type ?u.170494
m✝ : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁹ : CommRing R
M✝ : Matrix m✝ m✝ R
b✝ : m✝ → α
inst✝⁸ : DecidableEq m✝
inst✝⁷ : Fintype m✝
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : LinearOrder α
inst✝³ : Invertible M✝
hM✝ : BlockTriangular M✝ b✝
x✝ : Finset α
hs : image b✝ univ = x✝
m : Type u_2
M : Matrix m m R
b : m → α
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : Invertible M
hM : BlockTriangular M b
ih :
  ∀ (t : Finset α),
    t ⊂ image b univ →
      ∀ {m : Type u_2} {M : Matrix m m R} {b : m → α} [inst : DecidableEq m] [inst_1 : Fintype m]
        [inst_2 : Invertible M], BlockTriangular M b → image b univ = t → BlockTriangular M⁻¹ b
i j : m
hij : b j < b i
⊢ M⁻¹ i j = 0

tactic: let k := (univ.image b).max' (univ_nonempty.image _)
state_before: case H
α : Type u_1
β : Type ?u.170494
m✝ : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁹ : CommRing R
M✝ : Matrix m✝ m✝ R
b✝ : m✝ → α
inst✝⁸ : DecidableEq m✝
inst✝⁷ : Fintype m✝
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : LinearOrder α
inst✝³ : Invertible M✝
hM✝ : BlockTriangular M✝ b✝
x✝ : Finset α
hs : image b✝ univ = x✝
m : Type u_2
M : Matrix m m R
b : m → α
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : Invertible M
hM : BlockTriangular M b
ih :
  ∀ (t : Finset α),
    t ⊂ image b univ →
      ∀ {m : Type u_2} {M : Matrix m m R} {b : m → α} [inst : DecidableEq m] [inst_1 : Fintype m]
        [inst_2 : Invertible M], BlockTriangular M b → image b univ = t → BlockTriangular M⁻¹ b
i j : m
hij : b j < b i
this : Inhabited m
⊢ M⁻¹ i j = 0

tactic: let b' := fun i : { a // b a < k } => b ↑i
state_before: case H
α : Type u_1
β : Type ?u.170494
m✝ : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁹ : CommRing R
M✝ : Matrix m✝ m✝ R
b✝ : m✝ → α
inst✝⁸ : DecidableEq m✝
inst✝⁷ : Fintype m✝
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : LinearOrder α
inst✝³ : Invertible M✝
hM✝ : BlockTriangular M✝ b✝
x✝ : Finset α
hs : image b✝ univ = x✝
m : Type u_2
M : Matrix m m R
b : m → α
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : Invertible M
hM : BlockTriangular M b
ih :
  ∀ (t : Finset α),
    t ⊂ image b univ →
      ∀ {m : Type u_2} {M : Matrix m m R} {b : m → α} [inst : DecidableEq m] [inst_1 : Fintype m]
        [inst_2 : Invertible M], BlockTriangular M b → image b univ = t → BlockTriangular M⁻¹ b
i j : m
hij : b j < b i
this : Inhabited m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
⊢ M⁻¹ i j = 0

tactic: let A := M.toBlock (fun i => b i < k) fun j => b j < k
state_before: case H
α : Type u_1
β : Type ?u.170494
m✝ : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁹ : CommRing R
M✝ : Matrix m✝ m✝ R
b✝ : m✝ → α
inst✝⁸ : DecidableEq m✝
inst✝⁷ : Fintype m✝
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : LinearOrder α
inst✝³ : Invertible M✝
hM✝ : BlockTriangular M✝ b✝
x✝ : Finset α
hs : image b✝ univ = x✝
m : Type u_2
M : Matrix m m R
b : m → α
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : Invertible M
hM : BlockTriangular M b
ih :
  ∀ (t : Finset α),
    t ⊂ image b univ →
      ∀ {m : Type u_2} {M : Matrix m m R} {b : m → α} [inst : DecidableEq m] [inst_1 : Fintype m]
        [inst_2 : Invertible M], BlockTriangular M b → image b univ = t → BlockTriangular M⁻¹ b
i j : m
hij : b j < b i
this : Inhabited m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
b' : { a // b a < k } → α := fun i => b ↑i
⊢ M⁻¹ i j = 0

tactic: obtain hbi | hi : b i = k ∨ _ := (le_max' _ (b i) <| mem_image_of_mem _ <| mem_univ _).eq_or_lt
state_before: case H
α : Type u_1
β : Type ?u.170494
m✝ : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁹ : CommRing R
M✝ : Matrix m✝ m✝ R
b✝ : m✝ → α
inst✝⁸ : DecidableEq m✝
inst✝⁷ : Fintype m✝
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : LinearOrder α
inst✝³ : Invertible M✝
hM✝ : BlockTriangular M✝ b✝
x✝ : Finset α
hs : image b✝ univ = x✝
m : Type u_2
M : Matrix m m R
b : m → α
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : Invertible M
hM : BlockTriangular M b
ih :
  ∀ (t : Finset α),
    t ⊂ image b univ →
      ∀ {m : Type u_2} {M : Matrix m m R} {b : m → α} [inst : DecidableEq m] [inst_1 : Fintype m]
        [inst_2 : Invertible M], BlockTriangular M b → image b univ = t → BlockTriangular M⁻¹ b
i j : m
hij : b j < b i
this : Inhabited m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
b' : { a // b a < k } → α := fun i => b ↑i
A : Matrix { a // b a < k } { a // b a < k } R := toBlock M (fun i => b i < k) fun j => b j < k
⊢ M⁻¹ i j = 0

tactic: haveI : Invertible A := hM.invertibleToBlock _
state_before: case H.inr
α : Type u_1
β : Type ?u.170494
m✝ : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁹ : CommRing R
M✝ : Matrix m✝ m✝ R
b✝ : m✝ → α
inst✝⁸ : DecidableEq m✝
inst✝⁷ : Fintype m✝
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : LinearOrder α
inst✝³ : Invertible M✝
hM✝ : BlockTriangular M✝ b✝
x✝ : Finset α
hs : image b✝ univ = x✝
m : Type u_2
M : Matrix m m R
b : m → α
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : Invertible M
hM : BlockTriangular M b
ih :
  ∀ (t : Finset α),
    t ⊂ image b univ →
      ∀ {m : Type u_2} {M : Matrix m m R} {b : m → α} [inst : DecidableEq m] [inst_1 : Fintype m]
        [inst_2 : Invertible M], BlockTriangular M b → image b univ = t → BlockTriangular M⁻¹ b
i j : m
hij : b j < b i
this : Inhabited m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
b' : { a // b a < k } → α := fun i => b ↑i
A : Matrix { a // b a < k } { a // b a < k } R := toBlock M (fun i => b i < k) fun j => b j < k
hi : b i < max' (image b univ) (_ : ∃ x, x ∈ image b univ)
⊢ M⁻¹ i j = 0

tactic: have hA : A.BlockTriangular b' := hM.submatrix
state_before: case H.inr
α : Type u_1
β : Type ?u.170494
m✝ : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁹ : CommRing R
M✝ : Matrix m✝ m✝ R
b✝ : m✝ → α
inst✝⁸ : DecidableEq m✝
inst✝⁷ : Fintype m✝
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : LinearOrder α
inst✝³ : Invertible M✝
hM✝ : BlockTriangular M✝ b✝
x✝ : Finset α
hs : image b✝ univ = x✝
m : Type u_2
M : Matrix m m R
b : m → α
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : Invertible M
hM : BlockTriangular M b
ih :
  ∀ (t : Finset α),
    t ⊂ image b univ →
      ∀ {m : Type u_2} {M : Matrix m m R} {b : m → α} [inst : DecidableEq m] [inst_1 : Fintype m]
        [inst_2 : Invertible M], BlockTriangular M b → image b univ = t → BlockTriangular M⁻¹ b
i j : m
hij : b j < b i
this✝ : Inhabited m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
b' : { a // b a < k } → α := fun i => b ↑i
A : Matrix { a // b a < k } { a // b a < k } R := toBlock M (fun i => b i < k) fun j => b j < k
hi : b i < max' (image b univ) (_ : ∃ x, x ∈ image b univ)
this : Invertible A
⊢ M⁻¹ i j = 0

tactic: have hb' : image b' univ ⊂ image b univ := by
  convert image_subtype_univ_ssubset_image_univ k b _ (fun a => a < k) (lt_irrefl _)
  convert max'_mem (α := α) _ _
state_before: case H.inr
α : Type u_1
β : Type ?u.170494
m✝ : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁹ : CommRing R
M✝ : Matrix m✝ m✝ R
b✝ : m✝ → α
inst✝⁸ : DecidableEq m✝
inst✝⁷ : Fintype m✝
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : LinearOrder α
inst✝³ : Invertible M✝
hM✝ : BlockTriangular M✝ b✝
x✝ : Finset α
hs : image b✝ univ = x✝
m : Type u_2
M : Matrix m m R
b : m → α
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : Invertible M
hM : BlockTriangular M b
ih :
  ∀ (t : Finset α),
    t ⊂ image b univ →
      ∀ {m : Type u_2} {M : Matrix m m R} {b : m → α} [inst : DecidableEq m] [inst_1 : Fintype m]
        [inst_2 : Invertible M], BlockTriangular M b → image b univ = t → BlockTriangular M⁻¹ b
i j : m
hij : b j < b i
this✝ : Inhabited m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
b' : { a // b a < k } → α := fun i => b ↑i
A : Matrix { a // b a < k } { a // b a < k } R := toBlock M (fun i => b i < k) fun j => b j < k
hi : b i < max' (image b univ) (_ : ∃ x, x ∈ image b univ)
this : Invertible A
hA : BlockTriangular A b'
⊢ M⁻¹ i j = 0

tactic: have hij' : b' ⟨j, hij.trans hi⟩ < b' ⟨i, hi⟩ := by simp_rw [hij]
state_before: case H.inr
α : Type u_1
β : Type ?u.170494
m✝ : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁹ : CommRing R
M✝ : Matrix m✝ m✝ R
b✝ : m✝ → α
inst✝⁸ : DecidableEq m✝
inst✝⁷ : Fintype m✝
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : LinearOrder α
inst✝³ : Invertible M✝
hM✝ : BlockTriangular M✝ b✝
x✝ : Finset α
hs : image b✝ univ = x✝
m : Type u_2
M : Matrix m m R
b : m → α
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : Invertible M
hM : BlockTriangular M b
ih :
  ∀ (t : Finset α),
    t ⊂ image b univ →
      ∀ {m : Type u_2} {M : Matrix m m R} {b : m → α} [inst : DecidableEq m] [inst_1 : Fintype m]
        [inst_2 : Invertible M], BlockTriangular M b → image b univ = t → BlockTriangular M⁻¹ b
i j : m
hij : b j < b i
this✝ : Inhabited m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
b' : { a // b a < k } → α := fun i => b ↑i
A : Matrix { a // b a < k } { a // b a < k } R := toBlock M (fun i => b i < k) fun j => b j < k
hi : b i < max' (image b univ) (_ : ∃ x, x ∈ image b univ)
this : Invertible A
hA : BlockTriangular A b'
hb' : image b' univ ⊂ image b univ
⊢ M⁻¹ i j = 0

tactic: simp [hM.inv_toBlock k, (ih (image b' univ) hb' hA rfl hij').symm]
state_before: case H.inr
α : Type u_1
β : Type ?u.170494
m✝ : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁹ : CommRing R
M✝ : Matrix m✝ m✝ R
b✝ : m✝ → α
inst✝⁸ : DecidableEq m✝
inst✝⁷ : Fintype m✝
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : LinearOrder α
inst✝³ : Invertible M✝
hM✝ : BlockTriangular M✝ b✝
x✝ : Finset α
hs : image b✝ univ = x✝
m : Type u_2
M : Matrix m m R
b : m → α
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : Invertible M
hM : BlockTriangular M b
ih :
  ∀ (t : Finset α),
    t ⊂ image b univ →
      ∀ {m : Type u_2} {M : Matrix m m R} {b : m → α} [inst : DecidableEq m] [inst_1 : Fintype m]
        [inst_2 : Invertible M], BlockTriangular M b → image b univ = t → BlockTriangular M⁻¹ b
i j : m
hij : b j < b i
this✝ : Inhabited m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
b' : { a // b a < k } → α := fun i => b ↑i
A : Matrix { a // b a < k } { a // b a < k } R := toBlock M (fun i => b i < k) fun j => b j < k
hi : b i < max' (image b univ) (_ : ∃ x, x ∈ image b univ)
this : Invertible A
hA : BlockTriangular A b'
hb' : image b' univ ⊂ image b univ
hij' : b' { val := j, property := (_ : b j < k) } < b' { val := i, property := hi }
⊢ M⁻¹ i j = 0

tactic: have : M⁻¹.toBlock (fun i => k ≤ b i) (fun i => b i < k) ⟨i, hbi.ge⟩ ⟨j, hbi ▸ hij⟩ = 0 := by
  simp only [toBlock_inverse_eq_zero hM k, Matrix.zero_apply]
state_before: case H.inl
α : Type u_1
β : Type ?u.170494
m✝ : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁹ : CommRing R
M✝ : Matrix m✝ m✝ R
b✝ : m✝ → α
inst✝⁸ : DecidableEq m✝
inst✝⁷ : Fintype m✝
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : LinearOrder α
inst✝³ : Invertible M✝
hM✝ : BlockTriangular M✝ b✝
x✝ : Finset α
hs : image b✝ univ = x✝
m : Type u_2
M : Matrix m m R
b : m → α
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : Invertible M
hM : BlockTriangular M b
ih :
  ∀ (t : Finset α),
    t ⊂ image b univ →
      ∀ {m : Type u_2} {M : Matrix m m R} {b : m → α} [inst : DecidableEq m] [inst_1 : Fintype m]
        [inst_2 : Invertible M], BlockTriangular M b → image b univ = t → BlockTriangular M⁻¹ b
i j : m
hij : b j < b i
this : Inhabited m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
b' : { a // b a < k } → α := fun i => b ↑i
A : Matrix { a // b a < k } { a // b a < k } R := toBlock M (fun i => b i < k) fun j => b j < k
hbi : b i = k
⊢ M⁻¹ i j = 0

tactic: simp [this.symm]
state_before: case H.inl
α : Type u_1
β : Type ?u.170494
m✝ : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁹ : CommRing R
M✝ : Matrix m✝ m✝ R
b✝ : m✝ → α
inst✝⁸ : DecidableEq m✝
inst✝⁷ : Fintype m✝
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : LinearOrder α
inst✝³ : Invertible M✝
hM✝ : BlockTriangular M✝ b✝
x✝ : Finset α
hs : image b✝ univ = x✝
m : Type u_2
M : Matrix m m R
b : m → α
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : Invertible M
hM : BlockTriangular M b
ih :
  ∀ (t : Finset α),
    t ⊂ image b univ →
      ∀ {m : Type u_2} {M : Matrix m m R} {b : m → α} [inst : DecidableEq m] [inst_1 : Fintype m]
        [inst_2 : Invertible M], BlockTriangular M b → image b univ = t → BlockTriangular M⁻¹ b
i j : m
hij : b j < b i
this✝ : Inhabited m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
b' : { a // b a < k } → α := fun i => b ↑i
A : Matrix { a // b a < k } { a // b a < k } R := toBlock M (fun i => b i < k) fun j => b j < k
hbi : b i = k
this :
  toBlock M⁻¹ (fun i => k ≤ b i) (fun i => b i < k) { val := i, property := (_ : k ≤ b i) }
      { val := j, property := (_ : (fun i => b i < k) j) } =
    0
⊢ M⁻¹ i j = 0

tactic: simp only [toBlock_inverse_eq_zero hM k, Matrix.zero_apply]
state_before: α : Type u_1
β : Type ?u.170494
m✝ : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁹ : CommRing R
M✝ : Matrix m✝ m✝ R
b✝ : m✝ → α
inst✝⁸ : DecidableEq m✝
inst✝⁷ : Fintype m✝
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : LinearOrder α
inst✝³ : Invertible M✝
hM✝ : BlockTriangular M✝ b✝
x✝ : Finset α
hs : image b✝ univ = x✝
m : Type u_2
M : Matrix m m R
b : m → α
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : Invertible M
hM : BlockTriangular M b
ih :
  ∀ (t : Finset α),
    t ⊂ image b univ →
      ∀ {m : Type u_2} {M : Matrix m m R} {b : m → α} [inst : DecidableEq m] [inst_1 : Fintype m]
        [inst_2 : Invertible M], BlockTriangular M b → image b univ = t → BlockTriangular M⁻¹ b
i j : m
hij : b j < b i
this : Inhabited m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
b' : { a // b a < k } → α := fun i => b ↑i
A : Matrix { a // b a < k } { a // b a < k } R := toBlock M (fun i => b i < k) fun j => b j < k
hbi : b i = k
⊢ toBlock M⁻¹ (fun i => k ≤ b i) (fun i => b i < k) { val := i, property := (_ : k ≤ b i) }
      { val := j, property := (_ : (fun i => b i < k) j) } =
    0

tactic: convert image_subtype_univ_ssubset_image_univ k b _ (fun a => a < k) (lt_irrefl _)
state_before: α : Type u_1
β : Type ?u.170494
m✝ : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁹ : CommRing R
M✝ : Matrix m✝ m✝ R
b✝ : m✝ → α
inst✝⁸ : DecidableEq m✝
inst✝⁷ : Fintype m✝
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : LinearOrder α
inst✝³ : Invertible M✝
hM✝ : BlockTriangular M✝ b✝
x✝ : Finset α
hs : image b✝ univ = x✝
m : Type u_2
M : Matrix m m R
b : m → α
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : Invertible M
hM : BlockTriangular M b
ih :
  ∀ (t : Finset α),
    t ⊂ image b univ →
      ∀ {m : Type u_2} {M : Matrix m m R} {b : m → α} [inst : DecidableEq m] [inst_1 : Fintype m]
        [inst_2 : Invertible M], BlockTriangular M b → image b univ = t → BlockTriangular M⁻¹ b
i j : m
hij : b j < b i
this✝ : Inhabited m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
b' : { a // b a < k } → α := fun i => b ↑i
A : Matrix { a // b a < k } { a // b a < k } R := toBlock M (fun i => b i < k) fun j => b j < k
hi : b i < max' (image b univ) (_ : ∃ x, x ∈ image b univ)
this : Invertible A
hA : BlockTriangular A b'
⊢ image b' univ ⊂ image b univ

tactic: convert max'_mem (α := α) _ _
state_before: α : Type u_1
β : Type ?u.170494
m✝ : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁹ : CommRing R
M✝ : Matrix m✝ m✝ R
b✝ : m✝ → α
inst✝⁸ : DecidableEq m✝
inst✝⁷ : Fintype m✝
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : LinearOrder α
inst✝³ : Invertible M✝
hM✝ : BlockTriangular M✝ b✝
x✝ : Finset α
hs : image b✝ univ = x✝
m : Type u_2
M : Matrix m m R
b : m → α
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : Invertible M
hM : BlockTriangular M b
ih :
  ∀ (t : Finset α),
    t ⊂ image b univ →
      ∀ {m : Type u_2} {M : Matrix m m R} {b : m → α} [inst : DecidableEq m] [inst_1 : Fintype m]
        [inst_2 : Invertible M], BlockTriangular M b → image b univ = t → BlockTriangular M⁻¹ b
i j : m
hij : b j < b i
this✝ : Inhabited m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
b' : { a // b a < k } → α := fun i => b ↑i
A : Matrix { a // b a < k } { a // b a < k } R := toBlock M (fun i => b i < k) fun j => b j < k
hi : b i < max' (image b univ) (_ : ∃ x, x ∈ image b univ)
this : Invertible A
hA : BlockTriangular A b'
⊢ k ∈ image b univ

tactic: simp_rw [hij]
state_before: α : Type u_1
β : Type ?u.170494
m✝ : Type u_2
n : Type ?u.170500
o : Type ?u.170503
m' : α → Type ?u.170508
n' : α → Type ?u.170513
R : Type v
inst✝⁹ : CommRing R
M✝ : Matrix m✝ m✝ R
b✝ : m✝ → α
inst✝⁸ : DecidableEq m✝
inst✝⁷ : Fintype m✝
inst✝⁶ : DecidableEq n
inst✝⁵ : Fintype n
inst✝⁴ : LinearOrder α
inst✝³ : Invertible M✝
hM✝ : BlockTriangular M✝ b✝
x✝ : Finset α
hs : image b✝ univ = x✝
m : Type u_2
M : Matrix m m R
b : m → α
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : Invertible M
hM : BlockTriangular M b
ih :
  ∀ (t : Finset α),
    t ⊂ image b univ →
      ∀ {m : Type u_2} {M : Matrix m m R} {b : m → α} [inst : DecidableEq m] [inst_1 : Fintype m]
        [inst_2 : Invertible M], BlockTriangular M b → image b univ = t → BlockTriangular M⁻¹ b
i j : m
hij : b j < b i
this✝ : Inhabited m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
b' : { a // b a < k } → α := fun i => b ↑i
A : Matrix { a // b a < k } { a // b a < k } R := toBlock M (fun i => b i < k) fun j => b j < k
hi : b i < max' (image b univ) (_ : ∃ x, x ∈ image b univ)
this : Invertible A
hA : BlockTriangular A b'
hb' : image b' univ ⊂ image b univ
⊢ b' { val := j, property := (_ : b j < k) } < b' { val := i, property := hi }