Theorem: Matrix.BlockTriangular.det
File: Mathlib/LinearAlgebra/Matrix/Block.lean

tactic: clear N
state_before: α : Type u_1
β : Type ?u.100450
m : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝¹ : DecidableEq α
inst✝ : LinearOrder α
hM : BlockTriangular M b
⊢ det M = ∏ a in image b univ, det (toSquareBlock M b a)

tactic: induction' hs : univ.image b using Finset.strongInduction with s ih generalizing m
state_before: α : Type u_1
β : Type ?u.100450
m : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝¹ : DecidableEq α
inst✝ : LinearOrder α
hM : BlockTriangular M b
⊢ det M = ∏ a in image b univ, det (toSquareBlock M b a)

tactic: subst hs
state_before: case H
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
m : Type u_2
M : Matrix m m R
b : m → α
inst✝¹ : DecidableEq m
inst✝ : Fintype m
hM : BlockTriangular M b
hs : image b univ = s
⊢ det M = ∏ a in s, det (toSquareBlock M b a)

tactic: cases isEmpty_or_nonempty m
state_before: case H
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
⊢ det M = ∏ a in image b univ, det (toSquareBlock M b a)

tactic: let k := (univ.image b).max' (univ_nonempty.image _)
state_before: case H.inr
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
⊢ det M = ∏ a in image b univ, det (toSquareBlock M b a)

tactic: rw [twoBlockTriangular_det' M fun i => b i = k]
state_before: case H.inr
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
⊢ det M = ∏ a in image b univ, det (toSquareBlock M b a)

tactic: simp
state_before: case H.inl
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : IsEmpty m
⊢ det M = ∏ a in image b univ, det (toSquareBlock M b a)

tactic: have : univ.image b = insert k ((univ.image b).erase k) := by
  rw [insert_erase]
  apply max'_mem
state_before: case H.inr
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
⊢ det (toSquareBlockProp M fun i => b i = k) * det (toSquareBlockProp M fun i => ¬b i = k) =
    ∏ a in image b univ, det (toSquareBlock M b a)

tactic: rw [this, prod_insert (not_mem_erase _ _)]
state_before: case H.inr
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
this : image b univ = insert k (erase (image b univ) k)
⊢ det (toSquareBlockProp M fun i => b i = k) * det (toSquareBlockProp M fun i => ¬b i = k) =
    ∏ a in image b univ, det (toSquareBlock M b a)

tactic: refine' congr_arg _ _
state_before: case H.inr
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
this : image b univ = insert k (erase (image b univ) k)
⊢ det (toSquareBlockProp M fun i => b i = k) * det (toSquareBlockProp M fun i => ¬b i = k) =
    det (toSquareBlock M b k) * ∏ x in erase (image b univ) k, det (toSquareBlock M b x)

tactic: let b' := fun i : { a // b a ≠ k } => b ↑i
state_before: case H.inr
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
this : image b univ = insert k (erase (image b univ) k)
⊢ det (toSquareBlockProp M fun i => ¬b i = k) = ∏ x in erase (image b univ) k, det (toSquareBlock M b x)

tactic: have h' : BlockTriangular (M.toSquareBlockProp fun i => b i ≠ k) b' := hM.submatrix
state_before: case H.inr
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
this : image b univ = insert k (erase (image b univ) k)
b' : { a // b a ≠ k } → α := fun i => b ↑i
⊢ det (toSquareBlockProp M fun i => ¬b i = k) = ∏ x in erase (image b univ) k, det (toSquareBlock M b x)

tactic: have hb' : image b' univ = (image b univ).erase k := by
  convert image_subtype_ne_univ_eq_image_erase k b
state_before: case H.inr
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
this : image b univ = insert k (erase (image b univ) k)
b' : { a // b a ≠ k } → α := fun i => b ↑i
h' : BlockTriangular (toSquareBlockProp M fun i => b i ≠ k) b'
⊢ det (toSquareBlockProp M fun i => ¬b i = k) = ∏ x in erase (image b univ) k, det (toSquareBlock M b x)

tactic: rw [ih _ (erase_ssubset <| max'_mem _ _) h' hb']
state_before: case H.inr
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
this : image b univ = insert k (erase (image b univ) k)
b' : { a // b a ≠ k } → α := fun i => b ↑i
h' : BlockTriangular (toSquareBlockProp M fun i => b i ≠ k) b'
hb' : image b' univ = erase (image b univ) k
⊢ det (toSquareBlockProp M fun i => ¬b i = k) = ∏ x in erase (image b univ) k, det (toSquareBlock M b x)

tactic: refine' Finset.prod_congr rfl fun l hl => _
state_before: case H.inr
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
this : image b univ = insert k (erase (image b univ) k)
b' : { a // b a ≠ k } → α := fun i => b ↑i
h' : BlockTriangular (toSquareBlockProp M fun i => b i ≠ k) b'
hb' : image b' univ = erase (image b univ) k
⊢ ∏ a in erase (image b univ) (max' (image b univ) (_ : Finset.Nonempty (image b univ))),
      det (toSquareBlock (toSquareBlockProp M fun i => b i ≠ k) b' a) =
    ∏ x in erase (image b univ) k, det (toSquareBlock M b x)

tactic: let he : { a // b' a = l } ≃ { a // b a = l } :=
  haveI hc : ∀ i, b i = l → b i ≠ k := fun i hi => ne_of_eq_of_ne hi (ne_of_mem_erase hl)
  Equiv.subtypeSubtypeEquivSubtype @(hc)
state_before: case H.inr
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
this : image b univ = insert k (erase (image b univ) k)
b' : { a // b a ≠ k } → α := fun i => b ↑i
h' : BlockTriangular (toSquareBlockProp M fun i => b i ≠ k) b'
hb' : image b' univ = erase (image b univ) k
l : α
hl : l ∈ erase (image b univ) k
⊢ det (toSquareBlock (toSquareBlockProp M fun i => b i ≠ k) b' l) = det (toSquareBlock M b l)

tactic: simp only [toSquareBlock_def]
state_before: case H.inr
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
this : image b univ = insert k (erase (image b univ) k)
b' : { a // b a ≠ k } → α := fun i => b ↑i
h' : BlockTriangular (toSquareBlockProp M fun i => b i ≠ k) b'
hb' : image b' univ = erase (image b univ) k
l : α
hl : l ∈ erase (image b univ) k
he : { a // b' a = l } ≃ { a // b a = l } := Equiv.subtypeSubtypeEquivSubtype (_ : ∀ (i : m), b i = l → b i ≠ k)
⊢ det (toSquareBlock (toSquareBlockProp M fun i => b i ≠ k) b' l) = det (toSquareBlock M b l)

tactic: erw [← Matrix.det_reindex_self he.symm fun i j : { a // b a = l } => M ↑i ↑j]
state_before: case H.inr
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
this : image b univ = insert k (erase (image b univ) k)
b' : { a // b a ≠ k } → α := fun i => b ↑i
h' : BlockTriangular (toSquareBlockProp M fun i => b i ≠ k) b'
hb' : image b' univ = erase (image b univ) k
l : α
hl : l ∈ erase (image b univ) k
he : { a // b' a = l } ≃ { a // b a = l } := Equiv.subtypeSubtypeEquivSubtype (_ : ∀ (i : m), b i = l → b i ≠ k)
⊢ det
      (↑of fun i j =>
        toSquareBlockProp M (fun i => b i ≠ max' (image b univ) (_ : Finset.Nonempty (image b univ))) ↑i ↑j) =
    det (↑of fun i j => M ↑i ↑j)

tactic: rfl
state_before: case H.inr
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
this : image b univ = insert k (erase (image b univ) k)
b' : { a // b a ≠ k } → α := fun i => b ↑i
h' : BlockTriangular (toSquareBlockProp M fun i => b i ≠ k) b'
hb' : image b' univ = erase (image b univ) k
l : α
hl : l ∈ erase (image b univ) k
he : { a // b' a = l } ≃ { a // b a = l } := Equiv.subtypeSubtypeEquivSubtype (_ : ∀ (i : m), b i = l → b i ≠ k)
⊢ det
      (↑of fun i j =>
        toSquareBlockProp M (fun i => b i ≠ max' (image b univ) (_ : Finset.Nonempty (image b univ))) ↑i ↑j) =
    det (↑(reindex he.symm he.symm) fun i j => M ↑i ↑j)

tactic: rw [insert_erase]
state_before: α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
⊢ image b univ = insert k (erase (image b univ) k)

tactic: apply max'_mem
state_before: α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
⊢ k ∈ image b univ

tactic: convert image_subtype_ne_univ_eq_image_erase k b
state_before: α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
this : image b univ = insert k (erase (image b univ) k)
b' : { a // b a ≠ k } → α := fun i => b ↑i
h' : BlockTriangular (toSquareBlockProp M fun i => b i ≠ k) b'
⊢ image b' univ = erase (image b univ) k

tactic: intro i hi j hj
state_before: case H.inr
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
⊢ ∀ (i : m), b i = k → ∀ (j : m), ¬b j = k → M i j = 0

tactic: apply hM
state_before: case H.inr
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
i : m
hi : b i = k
j : m
hj : ¬b j = k
⊢ M i j = 0

tactic: rw [hi]
state_before: case H.inr.a
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
i : m
hi : b i = k
j : m
hj : ¬b j = k
⊢ b j < b i

tactic: apply lt_of_le_of_ne _ hj
state_before: case H.inr.a
α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
i : m
hi : b i = k
j : m
hj : ¬b j = k
⊢ b j < k

tactic: exact Finset.le_max' (univ.image b) _ (mem_image_of_mem _ (mem_univ _))
state_before: α : Type u_1
β : Type ?u.100450
m✝ : Type u_2
n : Type ?u.100456
o : Type ?u.100459
m' : α → Type ?u.100464
n' : α → Type ?u.100469
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✝³ : DecidableEq α
inst✝² : LinearOrder α
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
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],
        BlockTriangular M b → image b univ = t → det M = ∏ a in t, det (toSquareBlock M b a)
h✝ : Nonempty m
k : α := max' (image b univ) (_ : Finset.Nonempty (image b univ))
i : m
hi : b i = k
j : m
hj : ¬b j = k
⊢ b j ≤ k