[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
m : Type u_4
n : Type u_5
R : Type u_6
A B C : Matrix m n α
inst✝¹ : DecidableEq n
inst✝ : MulZeroOneClass α
M : Matrix n n α
⊢ M ⊙ 1 = diagonal fun i => M i i
[PROOFSTEP]
ext i j
[GOAL]
case a.h
α : Type u_1
β : Type u_2
γ : Type u_3
m : Type u_4
n : Type u_5
R : Type u_6
A B C : Matrix m n α
inst✝¹ : DecidableEq n
inst✝ : MulZeroOneClass α
M : Matrix n n α
i j : n
⊢ (M ⊙ 1) i j = diagonal (fun i => M i i) i j
[PROOFSTEP]
by_cases h : i = j
[GOAL]
case pos
α : Type u_1
β : Type u_2
γ : Type u_3
m : Type u_4
n : Type u_5
R : Type u_6
A B C : Matrix m n α
inst✝¹ : DecidableEq n
inst✝ : MulZeroOneClass α
M : Matrix n n α
i j : n
h : i = j
⊢ (M ⊙ 1) i j = diagonal (fun i => M i i) i j
[PROOFSTEP]
simp [h]
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
m : Type u_4
n : Type u_5
R : Type u_6
A B C : Matrix m n α
inst✝¹ : DecidableEq n
inst✝ : MulZeroOneClass α
M : Matrix n n α
i j : n
h : ¬i = j
⊢ (M ⊙ 1) i j = diagonal (fun i => M i i) i j
[PROOFSTEP]
simp [h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
m : Type u_4
n : Type u_5
R : Type u_6
A B C : Matrix m n α
inst✝¹ : DecidableEq n
inst✝ : MulZeroOneClass α
M : Matrix n n α
⊢ 1 ⊙ M = diagonal fun i => M i i
[PROOFSTEP]
ext i j
[GOAL]
case a.h
α : Type u_1
β : Type u_2
γ : Type u_3
m : Type u_4
n : Type u_5
R : Type u_6
A B C : Matrix m n α
inst✝¹ : DecidableEq n
inst✝ : MulZeroOneClass α
M : Matrix n n α
i j : n
⊢ (1 ⊙ M) i j = diagonal (fun i => M i i) i j
[PROOFSTEP]
by_cases h : i = j
[GOAL]
case pos
α : Type u_1
β : Type u_2
γ : Type u_3
m : Type u_4
n : Type u_5
R : Type u_6
A B C : Matrix m n α
inst✝¹ : DecidableEq n
inst✝ : MulZeroOneClass α
M : Matrix n n α
i j : n
h : i = j
⊢ (1 ⊙ M) i j = diagonal (fun i => M i i) i j
[PROOFSTEP]
simp [h]
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
m : Type u_4
n : Type u_5
R : Type u_6
A B C : Matrix m n α
inst✝¹ : DecidableEq n
inst✝ : MulZeroOneClass α
M : Matrix n n α
i j : n
h : ¬i = j
⊢ (1 ⊙ M) i j = diagonal (fun i => M i i) i j
[PROOFSTEP]
simp [h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
m : Type u_4
n : Type u_5
R : Type u_6
A B C : Matrix m n α
inst✝⁶ : Fintype m
inst✝⁵ : Fintype n
inst✝⁴ : Semiring α
inst✝³ : Semiring R
inst✝² : Module R α
inst✝¹ : DecidableEq m
inst✝ : DecidableEq n
v : m → α
w : n → α
⊢ vecMul v (A ⊙ B) ⬝ᵥ w = trace (diagonal v * A * (B * diagonal w)ᵀ)
[PROOFSTEP]
rw [← sum_hadamard_eq, Finset.sum_comm]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
m : Type u_4
n : Type u_5
R : Type u_6
A B C : Matrix m n α
inst✝⁶ : Fintype m
inst✝⁵ : Fintype n
inst✝⁴ : Semiring α
inst✝³ : Semiring R
inst✝² : Module R α
inst✝¹ : DecidableEq m
inst✝ : DecidableEq n
v : m → α
w : n → α
⊢ vecMul v (A ⊙ B) ⬝ᵥ w = ∑ y : n, ∑ x : m, ((diagonal v * A) ⊙ (B * diagonal w)) x y
[PROOFSTEP]
simp [dotProduct, vecMul, Finset.sum_mul, mul_assoc]


[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹¹ : Fintype m
inst✝¹⁰ : Fintype m₁
inst✝⁹ : Fintype m₂
inst✝⁸ : Fintype n
inst✝⁷ : Fintype n₁
inst✝⁶ : Fintype n₂
inst✝⁵ : DecidableEq m
inst✝⁴ : DecidableEq m₁
inst✝³ : DecidableEq m₂
inst✝² : DecidableEq n
inst✝¹ : DecidableEq n₁
inst✝ : DecidableEq n₂
A : Matrix m (n₁ ⊕ n₂) R
⊢ fromColumns (toColumns₁ A) (toColumns₂ A) = A
[PROOFSTEP]
ext i (j | j)
[GOAL]
case a.h.inl
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹¹ : Fintype m
inst✝¹⁰ : Fintype m₁
inst✝⁹ : Fintype m₂
inst✝⁸ : Fintype n
inst✝⁷ : Fintype n₁
inst✝⁶ : Fintype n₂
inst✝⁵ : DecidableEq m
inst✝⁴ : DecidableEq m₁
inst✝³ : DecidableEq m₂
inst✝² : DecidableEq n
inst✝¹ : DecidableEq n₁
inst✝ : DecidableEq n₂
A : Matrix m (n₁ ⊕ n₂) R
i : m
j : n₁
⊢ fromColumns (toColumns₁ A) (toColumns₂ A) i (Sum.inl j) = A i (Sum.inl j)
[PROOFSTEP]
simp
[GOAL]
case a.h.inr
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹¹ : Fintype m
inst✝¹⁰ : Fintype m₁
inst✝⁹ : Fintype m₂
inst✝⁸ : Fintype n
inst✝⁷ : Fintype n₁
inst✝⁶ : Fintype n₂
inst✝⁵ : DecidableEq m
inst✝⁴ : DecidableEq m₁
inst✝³ : DecidableEq m₂
inst✝² : DecidableEq n
inst✝¹ : DecidableEq n₁
inst✝ : DecidableEq n₂
A : Matrix m (n₁ ⊕ n₂) R
i : m
j : n₂
⊢ fromColumns (toColumns₁ A) (toColumns₂ A) i (Sum.inr j) = A i (Sum.inr j)
[PROOFSTEP]
simp
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹¹ : Fintype m
inst✝¹⁰ : Fintype m₁
inst✝⁹ : Fintype m₂
inst✝⁸ : Fintype n
inst✝⁷ : Fintype n₁
inst✝⁶ : Fintype n₂
inst✝⁵ : DecidableEq m
inst✝⁴ : DecidableEq m₁
inst✝³ : DecidableEq m₂
inst✝² : DecidableEq n
inst✝¹ : DecidableEq n₁
inst✝ : DecidableEq n₂
A : Matrix (m₁ ⊕ m₂) n R
⊢ fromRows (toRows₁ A) (toRows₂ A) = A
[PROOFSTEP]
ext (i | i) j
[GOAL]
case a.inl.h
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹¹ : Fintype m
inst✝¹⁰ : Fintype m₁
inst✝⁹ : Fintype m₂
inst✝⁸ : Fintype n
inst✝⁷ : Fintype n₁
inst✝⁶ : Fintype n₂
inst✝⁵ : DecidableEq m
inst✝⁴ : DecidableEq m₁
inst✝³ : DecidableEq m₂
inst✝² : DecidableEq n
inst✝¹ : DecidableEq n₁
inst✝ : DecidableEq n₂
A : Matrix (m₁ ⊕ m₂) n R
i : m₁
j : n
⊢ fromRows (toRows₁ A) (toRows₂ A) (Sum.inl i) j = A (Sum.inl i) j
[PROOFSTEP]
simp
[GOAL]
case a.inr.h
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹¹ : Fintype m
inst✝¹⁰ : Fintype m₁
inst✝⁹ : Fintype m₂
inst✝⁸ : Fintype n
inst✝⁷ : Fintype n₁
inst✝⁶ : Fintype n₂
inst✝⁵ : DecidableEq m
inst✝⁴ : DecidableEq m₁
inst✝³ : DecidableEq m₂
inst✝² : DecidableEq n
inst✝¹ : DecidableEq n₁
inst✝ : DecidableEq n₂
A : Matrix (m₁ ⊕ m₂) n R
i : m₂
j : n
⊢ fromRows (toRows₁ A) (toRows₂ A) (Sum.inr i) j = A (Sum.inr i) j
[PROOFSTEP]
simp
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹¹ : Fintype m
inst✝¹⁰ : Fintype m₁
inst✝⁹ : Fintype m₂
inst✝⁸ : Fintype n
inst✝⁷ : Fintype n₁
inst✝⁶ : Fintype n₂
inst✝⁵ : DecidableEq m
inst✝⁴ : DecidableEq m₁
inst✝³ : DecidableEq m₂
inst✝² : DecidableEq n
inst✝¹ : DecidableEq n₁
inst✝ : DecidableEq n₂
⊢ Function.Injective2 fromRows
[PROOFSTEP]
intros x1 x2 y1 y2
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹¹ : Fintype m
inst✝¹⁰ : Fintype m₁
inst✝⁹ : Fintype m₂
inst✝⁸ : Fintype n
inst✝⁷ : Fintype n₁
inst✝⁶ : Fintype n₂
inst✝⁵ : DecidableEq m
inst✝⁴ : DecidableEq m₁
inst✝³ : DecidableEq m₂
inst✝² : DecidableEq n
inst✝¹ : DecidableEq n₁
inst✝ : DecidableEq n₂
x1 x2 : Matrix m₁ n R
y1 y2 : Matrix m₂ n R
⊢ fromRows x1 y1 = fromRows x2 y2 → x1 = x2 ∧ y1 = y2
[PROOFSTEP]
simp only [Function.funext_iff, ← Matrix.ext_iff]
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹¹ : Fintype m
inst✝¹⁰ : Fintype m₁
inst✝⁹ : Fintype m₂
inst✝⁸ : Fintype n
inst✝⁷ : Fintype n₁
inst✝⁶ : Fintype n₂
inst✝⁵ : DecidableEq m
inst✝⁴ : DecidableEq m₁
inst✝³ : DecidableEq m₂
inst✝² : DecidableEq n
inst✝¹ : DecidableEq n₁
inst✝ : DecidableEq n₂
x1 x2 : Matrix m₁ n R
y1 y2 : Matrix m₂ n R
⊢ (∀ (i : m₁ ⊕ m₂) (j : n), fromRows x1 y1 i j = fromRows x2 y2 i j) →
    (∀ (i : m₁) (j : n), x1 i j = x2 i j) ∧ ∀ (i : m₂) (j : n), y1 i j = y2 i j
[PROOFSTEP]
aesop
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹¹ : Fintype m
inst✝¹⁰ : Fintype m₁
inst✝⁹ : Fintype m₂
inst✝⁸ : Fintype n
inst✝⁷ : Fintype n₁
inst✝⁶ : Fintype n₂
inst✝⁵ : DecidableEq m
inst✝⁴ : DecidableEq m₁
inst✝³ : DecidableEq m₂
inst✝² : DecidableEq n
inst✝¹ : DecidableEq n₁
inst✝ : DecidableEq n₂
⊢ Function.Injective2 fromColumns
[PROOFSTEP]
intros x1 x2 y1 y2
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹¹ : Fintype m
inst✝¹⁰ : Fintype m₁
inst✝⁹ : Fintype m₂
inst✝⁸ : Fintype n
inst✝⁷ : Fintype n₁
inst✝⁶ : Fintype n₂
inst✝⁵ : DecidableEq m
inst✝⁴ : DecidableEq m₁
inst✝³ : DecidableEq m₂
inst✝² : DecidableEq n
inst✝¹ : DecidableEq n₁
inst✝ : DecidableEq n₂
x1 x2 : Matrix m n₁ R
y1 y2 : Matrix m n₂ R
⊢ fromColumns x1 y1 = fromColumns x2 y2 → x1 = x2 ∧ y1 = y2
[PROOFSTEP]
simp only [Function.funext_iff, ← Matrix.ext_iff]
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹¹ : Fintype m
inst✝¹⁰ : Fintype m₁
inst✝⁹ : Fintype m₂
inst✝⁸ : Fintype n
inst✝⁷ : Fintype n₁
inst✝⁶ : Fintype n₂
inst✝⁵ : DecidableEq m
inst✝⁴ : DecidableEq m₁
inst✝³ : DecidableEq m₂
inst✝² : DecidableEq n
inst✝¹ : DecidableEq n₁
inst✝ : DecidableEq n₂
x1 x2 : Matrix m n₁ R
y1 y2 : Matrix m n₂ R
⊢ (∀ (i : m) (j : n₁ ⊕ n₂), fromColumns x1 y1 i j = fromColumns x2 y2 i j) →
    (∀ (i : m) (j : n₁), x1 i j = x2 i j) ∧ ∀ (i : m) (j : n₂), y1 i j = y2 i j
[PROOFSTEP]
aesop
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹¹ : Fintype m
inst✝¹⁰ : Fintype m₁
inst✝⁹ : Fintype m₂
inst✝⁸ : Fintype n
inst✝⁷ : Fintype n₁
inst✝⁶ : Fintype n₂
inst✝⁵ : DecidableEq m
inst✝⁴ : DecidableEq m₁
inst✝³ : DecidableEq m₂
inst✝² : DecidableEq n
inst✝¹ : DecidableEq n₁
inst✝ : DecidableEq n₂
A₁ : Matrix m n₁ R
A₂ : Matrix m n₂ R
⊢ (fromColumns A₁ A₂)ᵀ = fromRows A₁ᵀ A₂ᵀ
[PROOFSTEP]
ext (i | i) j
[GOAL]
case a.inl.h
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹¹ : Fintype m
inst✝¹⁰ : Fintype m₁
inst✝⁹ : Fintype m₂
inst✝⁸ : Fintype n
inst✝⁷ : Fintype n₁
inst✝⁶ : Fintype n₂
inst✝⁵ : DecidableEq m
inst✝⁴ : DecidableEq m₁
inst✝³ : DecidableEq m₂
inst✝² : DecidableEq n
inst✝¹ : DecidableEq n₁
inst✝ : DecidableEq n₂
A₁ : Matrix m n₁ R
A₂ : Matrix m n₂ R
i : n₁
j : m
⊢ (fromColumns A₁ A₂)ᵀ (Sum.inl i) j = fromRows A₁ᵀ A₂ᵀ (Sum.inl i) j
[PROOFSTEP]
simp
  /- A row partioned matrix when transposed gives a column partioned matrix with rows of the initial
  matrix tranposed to become columns. -/
[GOAL]
case a.inr.h
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹¹ : Fintype m
inst✝¹⁰ : Fintype m₁
inst✝⁹ : Fintype m₂
inst✝⁸ : Fintype n
inst✝⁷ : Fintype n₁
inst✝⁶ : Fintype n₂
inst✝⁵ : DecidableEq m
inst✝⁴ : DecidableEq m₁
inst✝³ : DecidableEq m₂
inst✝² : DecidableEq n
inst✝¹ : DecidableEq n₁
inst✝ : DecidableEq n₂
A₁ : Matrix m n₁ R
A₂ : Matrix m n₂ R
i : n₂
j : m
⊢ (fromColumns A₁ A₂)ᵀ (Sum.inr i) j = fromRows A₁ᵀ A₂ᵀ (Sum.inr i) j
[PROOFSTEP]
simp
  /- A row partioned matrix when transposed gives a column partioned matrix with rows of the initial
  matrix tranposed to become columns. -/
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹¹ : Fintype m
inst✝¹⁰ : Fintype m₁
inst✝⁹ : Fintype m₂
inst✝⁸ : Fintype n
inst✝⁷ : Fintype n₁
inst✝⁶ : Fintype n₂
inst✝⁵ : DecidableEq m
inst✝⁴ : DecidableEq m₁
inst✝³ : DecidableEq m₂
inst✝² : DecidableEq n
inst✝¹ : DecidableEq n₁
inst✝ : DecidableEq n₂
A₁ : Matrix m₁ n R
A₂ : Matrix m₂ n R
⊢ (fromRows A₁ A₂)ᵀ = fromColumns A₁ᵀ A₂ᵀ
[PROOFSTEP]
ext i (j | j)
[GOAL]
case a.h.inl
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹¹ : Fintype m
inst✝¹⁰ : Fintype m₁
inst✝⁹ : Fintype m₂
inst✝⁸ : Fintype n
inst✝⁷ : Fintype n₁
inst✝⁶ : Fintype n₂
inst✝⁵ : DecidableEq m
inst✝⁴ : DecidableEq m₁
inst✝³ : DecidableEq m₂
inst✝² : DecidableEq n
inst✝¹ : DecidableEq n₁
inst✝ : DecidableEq n₂
A₁ : Matrix m₁ n R
A₂ : Matrix m₂ n R
i : n
j : m₁
⊢ (fromRows A₁ A₂)ᵀ i (Sum.inl j) = fromColumns A₁ᵀ A₂ᵀ i (Sum.inl j)
[PROOFSTEP]
simp
[GOAL]
case a.h.inr
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹¹ : Fintype m
inst✝¹⁰ : Fintype m₁
inst✝⁹ : Fintype m₂
inst✝⁸ : Fintype n
inst✝⁷ : Fintype n₁
inst✝⁶ : Fintype n₂
inst✝⁵ : DecidableEq m
inst✝⁴ : DecidableEq m₁
inst✝³ : DecidableEq m₂
inst✝² : DecidableEq n
inst✝¹ : DecidableEq n₁
inst✝ : DecidableEq n₂
A₁ : Matrix m₁ n R
A₂ : Matrix m₂ n R
i : n
j : m₂
⊢ (fromRows A₁ A₂)ᵀ i (Sum.inr j) = fromColumns A₁ᵀ A₂ᵀ i (Sum.inr j)
[PROOFSTEP]
simp
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A₁ : Matrix m₁ n R
A₂ : Matrix m₂ n R
B : Matrix n m R
⊢ fromRows A₁ A₂ * B = fromRows (A₁ * B) (A₂ * B)
[PROOFSTEP]
ext (_ | _) _
[GOAL]
case a.inl.h
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A₁ : Matrix m₁ n R
A₂ : Matrix m₂ n R
B : Matrix n m R
val✝ : m₁
x✝ : m
⊢ (fromRows A₁ A₂ * B) (Sum.inl val✝) x✝ = fromRows (A₁ * B) (A₂ * B) (Sum.inl val✝) x✝
[PROOFSTEP]
simp [mul_apply]
[GOAL]
case a.inr.h
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A₁ : Matrix m₁ n R
A₂ : Matrix m₂ n R
B : Matrix n m R
val✝ : m₂
x✝ : m
⊢ (fromRows A₁ A₂ * B) (Sum.inr val✝) x✝ = fromRows (A₁ * B) (A₂ * B) (Sum.inr val✝) x✝
[PROOFSTEP]
simp [mul_apply]
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A : Matrix m n R
B₁ : Matrix n n₁ R
B₂ : Matrix n n₂ R
⊢ A * fromColumns B₁ B₂ = fromColumns (A * B₁) (A * B₂)
[PROOFSTEP]
ext _ (_ | _)
[GOAL]
case a.h.inl
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A : Matrix m n R
B₁ : Matrix n n₁ R
B₂ : Matrix n n₂ R
i✝ : m
val✝ : n₁
⊢ (A * fromColumns B₁ B₂) i✝ (Sum.inl val✝) = fromColumns (A * B₁) (A * B₂) i✝ (Sum.inl val✝)
[PROOFSTEP]
simp [mul_apply]
[GOAL]
case a.h.inr
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A : Matrix m n R
B₁ : Matrix n n₁ R
B₂ : Matrix n n₂ R
i✝ : m
val✝ : n₂
⊢ (A * fromColumns B₁ B₂) i✝ (Sum.inr val✝) = fromColumns (A * B₁) (A * B₂) i✝ (Sum.inr val✝)
[PROOFSTEP]
simp [mul_apply]
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
⊢ fromRows 0 0 = 0
[PROOFSTEP]
ext (_ | _) _
[GOAL]
case a.inl.h
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
val✝ : m₁
x✝ : n
⊢ fromRows 0 0 (Sum.inl val✝) x✝ = OfNat.ofNat 0 (Sum.inl val✝) x✝
[PROOFSTEP]
simp
[GOAL]
case a.inr.h
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
val✝ : m₂
x✝ : n
⊢ fromRows 0 0 (Sum.inr val✝) x✝ = OfNat.ofNat 0 (Sum.inr val✝) x✝
[PROOFSTEP]
simp
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
⊢ fromColumns 0 0 = 0
[PROOFSTEP]
ext _ (_ | _)
[GOAL]
case a.h.inl
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
i✝ : m
val✝ : n₁
⊢ fromColumns 0 0 i✝ (Sum.inl val✝) = OfNat.ofNat 0 i✝ (Sum.inl val✝)
[PROOFSTEP]
simp
[GOAL]
case a.h.inr
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
i✝ : m
val✝ : n₂
⊢ fromColumns 0 0 i✝ (Sum.inr val✝) = OfNat.ofNat 0 i✝ (Sum.inr val✝)
[PROOFSTEP]
simp
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
B₁₁ : Matrix m₁ n₁ R
B₁₂ : Matrix m₁ n₂ R
B₂₁ : Matrix m₂ n₁ R
B₂₂ : Matrix m₂ n₂ R
⊢ fromColumns (fromRows B₁₁ B₂₁) (fromRows B₁₂ B₂₂) = fromBlocks B₁₁ B₁₂ B₂₁ B₂₂
[PROOFSTEP]
ext (_ | _) (_ | _)
[GOAL]
case a.inl.h.inl
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
B₁₁ : Matrix m₁ n₁ R
B₁₂ : Matrix m₁ n₂ R
B₂₁ : Matrix m₂ n₁ R
B₂₂ : Matrix m₂ n₂ R
val✝¹ : m₁
val✝ : n₁
⊢ fromColumns (fromRows B₁₁ B₂₁) (fromRows B₁₂ B₂₂) (Sum.inl val✝¹) (Sum.inl val✝) =
    fromBlocks B₁₁ B₁₂ B₂₁ B₂₂ (Sum.inl val✝¹) (Sum.inl val✝)
[PROOFSTEP]
simp
[GOAL]
case a.inl.h.inr
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
B₁₁ : Matrix m₁ n₁ R
B₁₂ : Matrix m₁ n₂ R
B₂₁ : Matrix m₂ n₁ R
B₂₂ : Matrix m₂ n₂ R
val✝¹ : m₁
val✝ : n₂
⊢ fromColumns (fromRows B₁₁ B₂₁) (fromRows B₁₂ B₂₂) (Sum.inl val✝¹) (Sum.inr val✝) =
    fromBlocks B₁₁ B₁₂ B₂₁ B₂₂ (Sum.inl val✝¹) (Sum.inr val✝)
[PROOFSTEP]
simp
[GOAL]
case a.inr.h.inl
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
B₁₁ : Matrix m₁ n₁ R
B₁₂ : Matrix m₁ n₂ R
B₂₁ : Matrix m₂ n₁ R
B₂₂ : Matrix m₂ n₂ R
val✝¹ : m₂
val✝ : n₁
⊢ fromColumns (fromRows B₁₁ B₂₁) (fromRows B₁₂ B₂₂) (Sum.inr val✝¹) (Sum.inl val✝) =
    fromBlocks B₁₁ B₁₂ B₂₁ B₂₂ (Sum.inr val✝¹) (Sum.inl val✝)
[PROOFSTEP]
simp
[GOAL]
case a.inr.h.inr
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
B₁₁ : Matrix m₁ n₁ R
B₁₂ : Matrix m₁ n₂ R
B₂₁ : Matrix m₂ n₁ R
B₂₂ : Matrix m₂ n₂ R
val✝¹ : m₂
val✝ : n₂
⊢ fromColumns (fromRows B₁₁ B₂₁) (fromRows B₁₂ B₂₂) (Sum.inr val✝¹) (Sum.inr val✝) =
    fromBlocks B₁₁ B₁₂ B₂₁ B₂₂ (Sum.inr val✝¹) (Sum.inr val✝)
[PROOFSTEP]
simp
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
B₁₁ : Matrix m₁ n₁ R
B₁₂ : Matrix m₁ n₂ R
B₂₁ : Matrix m₂ n₁ R
B₂₂ : Matrix m₂ n₂ R
⊢ fromRows (fromColumns B₁₁ B₁₂) (fromColumns B₂₁ B₂₂) = fromBlocks B₁₁ B₁₂ B₂₁ B₂₂
[PROOFSTEP]
ext (_ | _) (_ | _)
[GOAL]
case a.inl.h.inl
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
B₁₁ : Matrix m₁ n₁ R
B₁₂ : Matrix m₁ n₂ R
B₂₁ : Matrix m₂ n₁ R
B₂₂ : Matrix m₂ n₂ R
val✝¹ : m₁
val✝ : n₁
⊢ fromRows (fromColumns B₁₁ B₁₂) (fromColumns B₂₁ B₂₂) (Sum.inl val✝¹) (Sum.inl val✝) =
    fromBlocks B₁₁ B₁₂ B₂₁ B₂₂ (Sum.inl val✝¹) (Sum.inl val✝)
[PROOFSTEP]
simp
[GOAL]
case a.inl.h.inr
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
B₁₁ : Matrix m₁ n₁ R
B₁₂ : Matrix m₁ n₂ R
B₂₁ : Matrix m₂ n₁ R
B₂₂ : Matrix m₂ n₂ R
val✝¹ : m₁
val✝ : n₂
⊢ fromRows (fromColumns B₁₁ B₁₂) (fromColumns B₂₁ B₂₂) (Sum.inl val✝¹) (Sum.inr val✝) =
    fromBlocks B₁₁ B₁₂ B₂₁ B₂₂ (Sum.inl val✝¹) (Sum.inr val✝)
[PROOFSTEP]
simp
[GOAL]
case a.inr.h.inl
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
B₁₁ : Matrix m₁ n₁ R
B₁₂ : Matrix m₁ n₂ R
B₂₁ : Matrix m₂ n₁ R
B₂₂ : Matrix m₂ n₂ R
val✝¹ : m₂
val✝ : n₁
⊢ fromRows (fromColumns B₁₁ B₁₂) (fromColumns B₂₁ B₂₂) (Sum.inr val✝¹) (Sum.inl val✝) =
    fromBlocks B₁₁ B₁₂ B₂₁ B₂₂ (Sum.inr val✝¹) (Sum.inl val✝)
[PROOFSTEP]
simp
[GOAL]
case a.inr.h.inr
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
B₁₁ : Matrix m₁ n₁ R
B₁₂ : Matrix m₁ n₂ R
B₂₁ : Matrix m₂ n₁ R
B₂₂ : Matrix m₂ n₂ R
val✝¹ : m₂
val✝ : n₂
⊢ fromRows (fromColumns B₁₁ B₁₂) (fromColumns B₂₁ B₂₂) (Sum.inr val✝¹) (Sum.inr val✝) =
    fromBlocks B₁₁ B₁₂ B₂₁ B₂₂ (Sum.inr val✝¹) (Sum.inr val✝)
[PROOFSTEP]
simp
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A₁ : Matrix m₁ n R
A₂ : Matrix m₂ n R
B₁ : Matrix n n₁ R
B₂ : Matrix n n₂ R
⊢ fromRows A₁ A₂ * fromColumns B₁ B₂ = fromBlocks (A₁ * B₁) (A₁ * B₂) (A₂ * B₁) (A₂ * B₂)
[PROOFSTEP]
ext (_ | _) (_ | _)
[GOAL]
case a.inl.h.inl
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A₁ : Matrix m₁ n R
A₂ : Matrix m₂ n R
B₁ : Matrix n n₁ R
B₂ : Matrix n n₂ R
val✝¹ : m₁
val✝ : n₁
⊢ (fromRows A₁ A₂ * fromColumns B₁ B₂) (Sum.inl val✝¹) (Sum.inl val✝) =
    fromBlocks (A₁ * B₁) (A₁ * B₂) (A₂ * B₁) (A₂ * B₂) (Sum.inl val✝¹) (Sum.inl val✝)
[PROOFSTEP]
simp
[GOAL]
case a.inl.h.inr
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A₁ : Matrix m₁ n R
A₂ : Matrix m₂ n R
B₁ : Matrix n n₁ R
B₂ : Matrix n n₂ R
val✝¹ : m₁
val✝ : n₂
⊢ (fromRows A₁ A₂ * fromColumns B₁ B₂) (Sum.inl val✝¹) (Sum.inr val✝) =
    fromBlocks (A₁ * B₁) (A₁ * B₂) (A₂ * B₁) (A₂ * B₂) (Sum.inl val✝¹) (Sum.inr val✝)
[PROOFSTEP]
simp
[GOAL]
case a.inr.h.inl
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A₁ : Matrix m₁ n R
A₂ : Matrix m₂ n R
B₁ : Matrix n n₁ R
B₂ : Matrix n n₂ R
val✝¹ : m₂
val✝ : n₁
⊢ (fromRows A₁ A₂ * fromColumns B₁ B₂) (Sum.inr val✝¹) (Sum.inl val✝) =
    fromBlocks (A₁ * B₁) (A₁ * B₂) (A₂ * B₁) (A₂ * B₂) (Sum.inr val✝¹) (Sum.inl val✝)
[PROOFSTEP]
simp
[GOAL]
case a.inr.h.inr
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A₁ : Matrix m₁ n R
A₂ : Matrix m₂ n R
B₁ : Matrix n n₁ R
B₂ : Matrix n n₂ R
val✝¹ : m₂
val✝ : n₂
⊢ (fromRows A₁ A₂ * fromColumns B₁ B₂) (Sum.inr val✝¹) (Sum.inr val✝) =
    fromBlocks (A₁ * B₁) (A₁ * B₂) (A₂ * B₁) (A₂ * B₂) (Sum.inr val✝¹) (Sum.inr val✝)
[PROOFSTEP]
simp
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A₁ : Matrix m n₁ R
A₂ : Matrix m n₂ R
B₁ : Matrix n₁ n R
B₂ : Matrix n₂ n R
⊢ fromColumns A₁ A₂ * fromRows B₁ B₂ = A₁ * B₁ + A₂ * B₂
[PROOFSTEP]
ext
[GOAL]
case a.h
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A₁ : Matrix m n₁ R
A₂ : Matrix m n₂ R
B₁ : Matrix n₁ n R
B₂ : Matrix n₂ n R
i✝ : m
x✝ : n
⊢ (fromColumns A₁ A₂ * fromRows B₁ B₂) i✝ x✝ = (A₁ * B₁ + A₂ * B₂) i✝ x✝
[PROOFSTEP]
simp [mul_apply]
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A₁ : Matrix m m₁ R
A₂ : Matrix m m₂ R
B₁₁ : Matrix m₁ n₁ R
B₁₂ : Matrix m₁ n₂ R
B₂₁ : Matrix m₂ n₁ R
B₂₂ : Matrix m₂ n₂ R
⊢ fromColumns A₁ A₂ * fromBlocks B₁₁ B₁₂ B₂₁ B₂₂ = fromColumns (A₁ * B₁₁ + A₂ * B₂₁) (A₁ * B₁₂ + A₂ * B₂₂)
[PROOFSTEP]
ext _ (_ | _)
[GOAL]
case a.h.inl
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A₁ : Matrix m m₁ R
A₂ : Matrix m m₂ R
B₁₁ : Matrix m₁ n₁ R
B₁₂ : Matrix m₁ n₂ R
B₂₁ : Matrix m₂ n₁ R
B₂₂ : Matrix m₂ n₂ R
i✝ : m
val✝ : n₁
⊢ (fromColumns A₁ A₂ * fromBlocks B₁₁ B₁₂ B₂₁ B₂₂) i✝ (Sum.inl val✝) =
    fromColumns (A₁ * B₁₁ + A₂ * B₂₁) (A₁ * B₁₂ + A₂ * B₂₂) i✝ (Sum.inl val✝)
[PROOFSTEP]
simp [mul_apply]
[GOAL]
case a.h.inr
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A₁ : Matrix m m₁ R
A₂ : Matrix m m₂ R
B₁₁ : Matrix m₁ n₁ R
B₁₂ : Matrix m₁ n₂ R
B₂₁ : Matrix m₂ n₁ R
B₂₂ : Matrix m₂ n₂ R
i✝ : m
val✝ : n₂
⊢ (fromColumns A₁ A₂ * fromBlocks B₁₁ B₁₂ B₂₁ B₂₂) i✝ (Sum.inr val✝) =
    fromColumns (A₁ * B₁₁ + A₂ * B₂₁) (A₁ * B₁₂ + A₂ * B₂₂) i✝ (Sum.inr val✝)
[PROOFSTEP]
simp [mul_apply]
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A₁ : Matrix n₁ n R
A₂ : Matrix n₂ n R
B₁₁ : Matrix m₁ n₁ R
B₁₂ : Matrix m₁ n₂ R
B₂₁ : Matrix m₂ n₁ R
B₂₂ : Matrix m₂ n₂ R
⊢ fromBlocks B₁₁ B₁₂ B₂₁ B₂₂ * fromRows A₁ A₂ = fromRows (B₁₁ * A₁ + B₁₂ * A₂) (B₂₁ * A₁ + B₂₂ * A₂)
[PROOFSTEP]
ext (_ | _) _
[GOAL]
case a.inl.h
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A₁ : Matrix n₁ n R
A₂ : Matrix n₂ n R
B₁₁ : Matrix m₁ n₁ R
B₁₂ : Matrix m₁ n₂ R
B₂₁ : Matrix m₂ n₁ R
B₂₂ : Matrix m₂ n₂ R
val✝ : m₁
x✝ : n
⊢ (fromBlocks B₁₁ B₁₂ B₂₁ B₂₂ * fromRows A₁ A₂) (Sum.inl val✝) x✝ =
    fromRows (B₁₁ * A₁ + B₁₂ * A₂) (B₂₁ * A₁ + B₂₂ * A₂) (Sum.inl val✝) x✝
[PROOFSTEP]
simp [mul_apply]
[GOAL]
case a.inr.h
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Semiring R
A₁ : Matrix n₁ n R
A₂ : Matrix n₂ n R
B₁₁ : Matrix m₁ n₁ R
B₁₂ : Matrix m₁ n₂ R
B₂₁ : Matrix m₂ n₁ R
B₂₂ : Matrix m₂ n₂ R
val✝ : m₂
x✝ : n
⊢ (fromBlocks B₁₁ B₁₂ B₂₁ B₂₂ * fromRows A₁ A₂) (Sum.inr val✝) x✝ =
    fromRows (B₁₁ * A₁ + B₁₂ * A₂) (B₂₁ * A₁ + B₂₂ * A₂) (Sum.inr val✝) x✝
[PROOFSTEP]
simp [mul_apply]
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : CommRing R
e : n ≃ n₁ ⊕ n₂
A₁ : Matrix n n₁ R
A₂ : Matrix n n₂ R
B₁ : Matrix n₁ n R
B₂ : Matrix n₂ n R
⊢ fromColumns A₁ A₂ * fromRows B₁ B₂ = 1 ↔ fromRows B₁ B₂ * fromColumns A₁ A₂ = 1
[PROOFSTEP]
calc
  fromColumns A₁ A₂ * fromRows B₁ B₂ = 1
  _ ↔ submatrix (fromColumns A₁ A₂) id e * submatrix (fromRows B₁ B₂) e id = 1 := by simp
  _ ↔ submatrix (fromRows B₁ B₂) e id * submatrix (fromColumns A₁ A₂) id e = 1 := mul_eq_one_comm
  _ ↔ reindex e.symm e.symm (fromRows B₁ B₂ * fromColumns A₁ A₂) = reindex e.symm e.symm 1 := by
    simp only [reindex_apply, Equiv.symm_symm, submatrix_one_equiv, submatrix_mul (he₂ := Function.bijective_id)]
  _ ↔ fromRows B₁ B₂ * fromColumns A₁ A₂ = 1 := (reindex _ _).injective.eq_iff
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : CommRing R
e : n ≃ n₁ ⊕ n₂
A₁ : Matrix n n₁ R
A₂ : Matrix n n₂ R
B₁ : Matrix n₁ n R
B₂ : Matrix n₂ n R
⊢ fromColumns A₁ A₂ * fromRows B₁ B₂ = 1 ↔ submatrix (fromColumns A₁ A₂) id ↑e * submatrix (fromRows B₁ B₂) (↑e) id = 1
[PROOFSTEP]
simp
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : CommRing R
e : n ≃ n₁ ⊕ n₂
A₁ : Matrix n n₁ R
A₂ : Matrix n n₂ R
B₁ : Matrix n₁ n R
B₂ : Matrix n₂ n R
⊢ submatrix (fromRows B₁ B₂) (↑e) id * submatrix (fromColumns A₁ A₂) id ↑e = 1 ↔
    ↑(reindex e.symm e.symm) (fromRows B₁ B₂ * fromColumns A₁ A₂) = ↑(reindex e.symm e.symm) 1
[PROOFSTEP]
simp only [reindex_apply, Equiv.symm_symm, submatrix_one_equiv, submatrix_mul (he₂ := Function.bijective_id)]
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Star R
A₁ : Matrix m n₁ R
A₂ : Matrix m n₂ R
⊢ (fromColumns A₁ A₂)ᴴ = fromRows A₁ᴴ A₂ᴴ
[PROOFSTEP]
ext (_ | _) _
[GOAL]
case a.inl.h
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Star R
A₁ : Matrix m n₁ R
A₂ : Matrix m n₂ R
val✝ : n₁
x✝ : m
⊢ (fromColumns A₁ A₂)ᴴ (Sum.inl val✝) x✝ = fromRows A₁ᴴ A₂ᴴ (Sum.inl val✝) x✝
[PROOFSTEP]
simp
  /- A row partioned matrix in a Star ring when conjugate transposed gives a column partitioned matrix
  with the rows of the initial matrix conjugate transposed to become columns. -/
[GOAL]
case a.inr.h
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Star R
A₁ : Matrix m n₁ R
A₂ : Matrix m n₂ R
val✝ : n₂
x✝ : m
⊢ (fromColumns A₁ A₂)ᴴ (Sum.inr val✝) x✝ = fromRows A₁ᴴ A₂ᴴ (Sum.inr val✝) x✝
[PROOFSTEP]
simp
  /- A row partioned matrix in a Star ring when conjugate transposed gives a column partitioned matrix
  with the rows of the initial matrix conjugate transposed to become columns. -/
[GOAL]
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Star R
A₁ : Matrix m₁ n R
A₂ : Matrix m₂ n R
⊢ (fromRows A₁ A₂)ᴴ = fromColumns A₁ᴴ A₂ᴴ
[PROOFSTEP]
ext _ (_ | _)
[GOAL]
case a.h.inl
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Star R
A₁ : Matrix m₁ n R
A₂ : Matrix m₂ n R
i✝ : n
val✝ : m₁
⊢ (fromRows A₁ A₂)ᴴ i✝ (Sum.inl val✝) = fromColumns A₁ᴴ A₂ᴴ i✝ (Sum.inl val✝)
[PROOFSTEP]
simp
[GOAL]
case a.h.inr
R : Type u_1
m : Type u_2
m₁ : Type u_3
m₂ : Type u_4
n : Type u_5
n₁ : Type u_6
n₂ : Type u_7
inst✝¹² : Fintype m
inst✝¹¹ : Fintype m₁
inst✝¹⁰ : Fintype m₂
inst✝⁹ : Fintype n
inst✝⁸ : Fintype n₁
inst✝⁷ : Fintype n₂
inst✝⁶ : DecidableEq m
inst✝⁵ : DecidableEq m₁
inst✝⁴ : DecidableEq m₂
inst✝³ : DecidableEq n
inst✝² : DecidableEq n₁
inst✝¹ : DecidableEq n₂
inst✝ : Star R
A₁ : Matrix m₁ n R
A₂ : Matrix m₂ n R
i✝ : n
val✝ : m₂
⊢ (fromRows A₁ A₂)ᴴ i✝ (Sum.inr val✝) = fromColumns A₁ᴴ A₂ᴴ i✝ (Sum.inr val✝)
[PROOFSTEP]
simp


[GOAL]
s : Set ℕ
⊢ sInf s = 0 ↔ 0 ∈ s ∨ s = ∅
[PROOFSTEP]
cases eq_empty_or_nonempty s with
| inl h =>
  subst h
  simp only [or_true_iff, eq_self_iff_true, iff_true_iff, iInf, InfSet.sInf, mem_empty_iff_false, exists_false, dif_neg,
    not_false_iff]
| inr h => simp only [h.ne_empty, or_false_iff, Nat.sInf_def, h, Nat.find_eq_zero]
[GOAL]
s : Set ℕ
x✝ : s = ∅ ∨ Set.Nonempty s
⊢ sInf s = 0 ↔ 0 ∈ s ∨ s = ∅
[PROOFSTEP]
cases eq_empty_or_nonempty s with
| inl h =>
  subst h
  simp only [or_true_iff, eq_self_iff_true, iff_true_iff, iInf, InfSet.sInf, mem_empty_iff_false, exists_false, dif_neg,
    not_false_iff]
| inr h => simp only [h.ne_empty, or_false_iff, Nat.sInf_def, h, Nat.find_eq_zero]
[GOAL]
case inl
s : Set ℕ
h : s = ∅
⊢ sInf s = 0 ↔ 0 ∈ s ∨ s = ∅
[PROOFSTEP]

| inl h =>
  subst h
  simp only [or_true_iff, eq_self_iff_true, iff_true_iff, iInf, InfSet.sInf, mem_empty_iff_false, exists_false, dif_neg,
    not_false_iff]
[GOAL]
case inl
s : Set ℕ
h : s = ∅
⊢ sInf s = 0 ↔ 0 ∈ s ∨ s = ∅
[PROOFSTEP]
subst h
[GOAL]
case inl
⊢ sInf ∅ = 0 ↔ 0 ∈ ∅ ∨ ∅ = ∅
[PROOFSTEP]
simp only [or_true_iff, eq_self_iff_true, iff_true_iff, iInf, InfSet.sInf, mem_empty_iff_false, exists_false, dif_neg,
  not_false_iff]
[GOAL]
case inr
s : Set ℕ
h : Set.Nonempty s
⊢ sInf s = 0 ↔ 0 ∈ s ∨ s = ∅
[PROOFSTEP]

| inr h => simp only [h.ne_empty, or_false_iff, Nat.sInf_def, h, Nat.find_eq_zero]
[GOAL]
case inr
s : Set ℕ
h : Set.Nonempty s
⊢ sInf s = 0 ↔ 0 ∈ s ∨ s = ∅
[PROOFSTEP]
simp only [h.ne_empty, or_false_iff, Nat.sInf_def, h, Nat.find_eq_zero]
[GOAL]
⊢ sInf ∅ = 0
[PROOFSTEP]
rw [sInf_eq_zero]
[GOAL]
⊢ 0 ∈ ∅ ∨ ∅ = ∅
[PROOFSTEP]
right
[GOAL]
case h
⊢ ∅ = ∅
[PROOFSTEP]
rfl
[GOAL]
ι : Sort u_1
inst✝ : IsEmpty ι
f : ι → ℕ
⊢ iInf f = 0
[PROOFSTEP]
rw [iInf_of_empty', sInf_empty]
[GOAL]
s : Set ℕ
h : Set.Nonempty s
⊢ sInf s ∈ s
[PROOFSTEP]
rw [Nat.sInf_def h]
[GOAL]
s : Set ℕ
h : Set.Nonempty s
⊢ Nat.find h ∈ s
[PROOFSTEP]
exact Nat.find_spec h
[GOAL]
s : Set ℕ
m : ℕ
hm : m < sInf s
⊢ ¬m ∈ s
[PROOFSTEP]
cases eq_empty_or_nonempty s with
| inl h => subst h; apply not_mem_empty
| inr h => rw [Nat.sInf_def h] at hm ; exact Nat.find_min h hm
[GOAL]
s : Set ℕ
m : ℕ
hm : m < sInf s
x✝ : s = ∅ ∨ Set.Nonempty s
⊢ ¬m ∈ s
[PROOFSTEP]
cases eq_empty_or_nonempty s with
| inl h => subst h; apply not_mem_empty
| inr h => rw [Nat.sInf_def h] at hm ; exact Nat.find_min h hm
[GOAL]
case inl
s : Set ℕ
m : ℕ
hm : m < sInf s
h : s = ∅
⊢ ¬m ∈ s
[PROOFSTEP]

| inl h => subst h; apply not_mem_empty
[GOAL]
case inl
s : Set ℕ
m : ℕ
hm : m < sInf s
h : s = ∅
⊢ ¬m ∈ s
[PROOFSTEP]
subst h
[GOAL]
case inl
m : ℕ
hm : m < sInf ∅
⊢ ¬m ∈ ∅
[PROOFSTEP]
apply not_mem_empty
[GOAL]
case inr
s : Set ℕ
m : ℕ
hm : m < sInf s
h : Set.Nonempty s
⊢ ¬m ∈ s
[PROOFSTEP]

| inr h => rw [Nat.sInf_def h] at hm ; exact Nat.find_min h hm
[GOAL]
case inr
s : Set ℕ
m : ℕ
hm : m < sInf s
h : Set.Nonempty s
⊢ ¬m ∈ s
[PROOFSTEP]
rw [Nat.sInf_def h] at hm
[GOAL]
case inr
s : Set ℕ
m : ℕ
h : Set.Nonempty s
hm : m < Nat.find h
⊢ ¬m ∈ s
[PROOFSTEP]
exact Nat.find_min h hm
[GOAL]
s : Set ℕ
m : ℕ
hm : m ∈ s
⊢ sInf s ≤ m
[PROOFSTEP]
rw [Nat.sInf_def ⟨m, hm⟩]
[GOAL]
s : Set ℕ
m : ℕ
hm : m ∈ s
⊢ Nat.find (_ : ∃ x, x ∈ s) ≤ m
[PROOFSTEP]
exact Nat.find_min' ⟨m, hm⟩ hm
[GOAL]
s : Set ℕ
h : 0 < sInf s
⊢ Set.Nonempty s
[PROOFSTEP]
by_contra contra
[GOAL]
s : Set ℕ
h : 0 < sInf s
contra : ¬Set.Nonempty s
⊢ False
[PROOFSTEP]
rw [Set.not_nonempty_iff_eq_empty] at contra
[GOAL]
s : Set ℕ
h : 0 < sInf s
contra : s = ∅
⊢ False
[PROOFSTEP]
have h' : sInf s ≠ 0 := ne_of_gt h
[GOAL]
s : Set ℕ
h : 0 < sInf s
contra : s = ∅
h' : sInf s ≠ 0
⊢ False
[PROOFSTEP]
apply h'
[GOAL]
s : Set ℕ
h : 0 < sInf s
contra : s = ∅
h' : sInf s ≠ 0
⊢ sInf s = 0
[PROOFSTEP]
rw [Nat.sInf_eq_zero]
[GOAL]
s : Set ℕ
h : 0 < sInf s
contra : s = ∅
h' : sInf s ≠ 0
⊢ 0 ∈ s ∨ s = ∅
[PROOFSTEP]
right
[GOAL]
case h
s : Set ℕ
h : 0 < sInf s
contra : s = ∅
h' : sInf s ≠ 0
⊢ s = ∅
[PROOFSTEP]
assumption
[GOAL]
s : Set ℕ
hs : ∀ (k₁ k₂ : ℕ), k₁ ≤ k₂ → k₁ ∈ s → k₂ ∈ s
k : ℕ
⊢ sInf s = k + 1 ↔ k + 1 ∈ s ∧ ¬k ∈ s
[PROOFSTEP]
constructor
[GOAL]
case mp
s : Set ℕ
hs : ∀ (k₁ k₂ : ℕ), k₁ ≤ k₂ → k₁ ∈ s → k₂ ∈ s
k : ℕ
⊢ sInf s = k + 1 → k + 1 ∈ s ∧ ¬k ∈ s
[PROOFSTEP]
intro H
[GOAL]
case mp
s : Set ℕ
hs : ∀ (k₁ k₂ : ℕ), k₁ ≤ k₂ → k₁ ∈ s → k₂ ∈ s
k : ℕ
H : sInf s = k + 1
⊢ k + 1 ∈ s ∧ ¬k ∈ s
[PROOFSTEP]
rw [eq_Ici_of_nonempty_of_upward_closed (nonempty_of_sInf_eq_succ _) hs, H, mem_Ici, mem_Ici]
[GOAL]
case mp
s : Set ℕ
hs : ∀ (k₁ k₂ : ℕ), k₁ ≤ k₂ → k₁ ∈ s → k₂ ∈ s
k : ℕ
H : sInf s = k + 1
⊢ k + 1 ≤ k + 1 ∧ ¬k + 1 ≤ k
s : Set ℕ
hs : ∀ (k₁ k₂ : ℕ), k₁ ≤ k₂ → k₁ ∈ s → k₂ ∈ s
k : ℕ
H : sInf s = k + 1
⊢ ℕ
s : Set ℕ hs : ∀ (k₁ k₂ : ℕ), k₁ ≤ k₂ → k₁ ∈ s → k₂ ∈ s k : ℕ H : sInf s = k + 1 ⊢ sInf s = ?m.6254 + 1
[PROOFSTEP]
exact ⟨le_rfl, k.not_succ_le_self⟩
[GOAL]
s : Set ℕ
hs : ∀ (k₁ k₂ : ℕ), k₁ ≤ k₂ → k₁ ∈ s → k₂ ∈ s
k : ℕ
H : sInf s = k + 1
⊢ ℕ
s : Set ℕ hs : ∀ (k₁ k₂ : ℕ), k₁ ≤ k₂ → k₁ ∈ s → k₂ ∈ s k : ℕ H : sInf s = k + 1 ⊢ sInf s = ?m.6254 + 1
[PROOFSTEP]
exact k
[GOAL]
s : Set ℕ
hs : ∀ (k₁ k₂ : ℕ), k₁ ≤ k₂ → k₁ ∈ s → k₂ ∈ s
k : ℕ
H : sInf s = k + 1
⊢ sInf s = k + 1
[PROOFSTEP]
assumption
[GOAL]
case mpr
s : Set ℕ
hs : ∀ (k₁ k₂ : ℕ), k₁ ≤ k₂ → k₁ ∈ s → k₂ ∈ s
k : ℕ
⊢ k + 1 ∈ s ∧ ¬k ∈ s → sInf s = k + 1
[PROOFSTEP]
rintro ⟨H, H'⟩
[GOAL]
case mpr.intro
s : Set ℕ
hs : ∀ (k₁ k₂ : ℕ), k₁ ≤ k₂ → k₁ ∈ s → k₂ ∈ s
k : ℕ
H : k + 1 ∈ s
H' : ¬k ∈ s
⊢ sInf s = k + 1
[PROOFSTEP]
rw [sInf_def (⟨_, H⟩ : s.Nonempty), find_eq_iff]
[GOAL]
case mpr.intro
s : Set ℕ
hs : ∀ (k₁ k₂ : ℕ), k₁ ≤ k₂ → k₁ ∈ s → k₂ ∈ s
k : ℕ
H : k + 1 ∈ s
H' : ¬k ∈ s
⊢ k + 1 ∈ s ∧ ∀ (n : ℕ), n < k + 1 → ¬n ∈ s
[PROOFSTEP]
exact ⟨H, fun n hnk hns ↦ H' <| hs n k (lt_succ_iff.mp hnk) hns⟩
[GOAL]
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
s : Set ℕ
a : ℕ
hb : BddAbove s
ha : a ∈ s
⊢ a ≤ sSup s
[PROOFSTEP]
rw [sSup_def hb]
[GOAL]
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
s : Set ℕ
a : ℕ
hb : BddAbove s
ha : a ∈ s
⊢ a ≤ Nat.find hb
[PROOFSTEP]
revert a ha
[GOAL]
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
s : Set ℕ
hb : BddAbove s
⊢ ∀ (a : ℕ), a ∈ s → a ≤ Nat.find hb
[PROOFSTEP]
exact @Nat.find_spec _ _ hb
[GOAL]
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
s : Set ℕ
a : ℕ
x✝ : Set.Nonempty s
ha : a ∈ upperBounds s
⊢ sSup s ≤ a
[PROOFSTEP]
rw [sSup_def ⟨a, ha⟩]
[GOAL]
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
s : Set ℕ
a : ℕ
x✝ : Set.Nonempty s
ha : a ∈ upperBounds s
⊢ Nat.find (_ : ∃ n, ∀ (a : ℕ), a ∈ s → a ≤ n) ≤ a
[PROOFSTEP]
exact Nat.find_min' _ ha
[GOAL]
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
s : Set ℕ
a : ℕ
x✝ : BddBelow s
ha : a ∈ s
⊢ sInf s ≤ a
[PROOFSTEP]
rw [sInf_def ⟨a, ha⟩]
[GOAL]
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
s : Set ℕ
a : ℕ
x✝ : BddBelow s
ha : a ∈ s
⊢ Nat.find (_ : ∃ x, x ∈ s) ≤ a
[PROOFSTEP]
exact Nat.find_min' _ ha
[GOAL]
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
s : Set ℕ
a : ℕ
hs : Set.Nonempty s
hb : a ∈ lowerBounds s
⊢ a ≤ sInf s
[PROOFSTEP]
rw [sInf_def hs]
[GOAL]
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
s : Set ℕ
a : ℕ
hs : Set.Nonempty s
hb : a ∈ lowerBounds s
⊢ a ≤ Nat.find hs
[PROOFSTEP]
exact hb (@Nat.find_spec (fun n ↦ n ∈ s) _ _)
[GOAL]
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
⊢ ∀ (s : Set ℕ), ¬BddAbove s → sSup s = sSup univ
[PROOFSTEP]
intro s hs
[GOAL]
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
s : Set ℕ
hs : ¬BddAbove s
⊢ sSup s = sSup univ
[PROOFSTEP]
simp only [mem_univ, forall_true_left, sSup]
[GOAL]
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
s : Set ℕ
hs : ¬BddAbove s
⊢ (if h : ∃ n, ∀ (a : ℕ), a ∈ s → a ≤ n then Nat.find h else 0) =
    if h : ∃ n, ∀ (a : ℕ), a ≤ n then Nat.find (_ : ∃ n, (fun n => ∀ (a : ℕ), a ≤ n) n) else 0
[PROOFSTEP]
rw [dif_neg, dif_neg]
[GOAL]
case hnc
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
s : Set ℕ
hs : ¬BddAbove s
⊢ ¬∃ n, ∀ (a : ℕ), a ≤ n
[PROOFSTEP]
simp only [not_exists, not_forall, not_le]
[GOAL]
case hnc
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
s : Set ℕ
hs : ¬BddAbove s
⊢ ∀ (x : ℕ), ∃ x_1, x < x_1
[PROOFSTEP]
exact fun n ↦ ⟨n + 1, lt.base n⟩
[GOAL]
case hnc
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
s : Set ℕ
hs : ¬BddAbove s
⊢ ¬∃ n, ∀ (a : ℕ), a ∈ s → a ≤ n
[PROOFSTEP]
exact hs
[GOAL]
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
s : Set ℕ
hs : ¬BddBelow s
⊢ sInf s = sInf univ
[PROOFSTEP]
simp at hs
[GOAL]
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
⊢ sSup ∅ = ⊥
[PROOFSTEP]
simp only [sSup_def, Set.mem_empty_iff_false, forall_const, forall_prop_of_false, not_false_iff, exists_const]
[GOAL]
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
⊢ Nat.find (_ : ∃ n, (fun n => True) n) = ⊥
[PROOFSTEP]
apply bot_unique (Nat.find_min' _ _)
[GOAL]
src✝² : OrderBot ℕ := inferInstance
src✝¹ : Lattice ℕ := LinearOrder.toLattice
src✝ : LinearOrder ℕ := inferInstance
⊢ True
[PROOFSTEP]
trivial
[GOAL]
n : ℕ
p : ℕ → Prop
hn : n ≤ sInf {m | p m}
⊢ sInf {m | p (m + n)} + n = sInf {m | p m}
[PROOFSTEP]
obtain h | ⟨m, hm⟩ := {m | p (m + n)}.eq_empty_or_nonempty
[GOAL]
case inl
n : ℕ
p : ℕ → Prop
hn : n ≤ sInf {m | p m}
h : {m | p (m + n)} = ∅
⊢ sInf {m | p (m + n)} + n = sInf {m | p m}
[PROOFSTEP]
rw [h, Nat.sInf_empty, zero_add]
[GOAL]
case inl
n : ℕ
p : ℕ → Prop
hn : n ≤ sInf {m | p m}
h : {m | p (m + n)} = ∅
⊢ n = sInf {m | p m}
[PROOFSTEP]
obtain hnp | hnp := hn.eq_or_lt
[GOAL]
case inl.inl
n : ℕ
p : ℕ → Prop
hn : n ≤ sInf {m | p m}
h : {m | p (m + n)} = ∅
hnp : n = sInf {m | p m}
⊢ n = sInf {m | p m}
[PROOFSTEP]
exact hnp
[GOAL]
case inl.inr
n : ℕ
p : ℕ → Prop
hn : n ≤ sInf {m | p m}
h : {m | p (m + n)} = ∅
hnp : n < sInf {m | p m}
⊢ n = sInf {m | p m}
[PROOFSTEP]
suffices hp : p (sInf {m | p m} - n + n)
[GOAL]
case inl.inr
n : ℕ
p : ℕ → Prop
hn : n ≤ sInf {m | p m}
h : {m | p (m + n)} = ∅
hnp : n < sInf {m | p m}
hp : p (sInf {m | p m} - n + n)
⊢ n = sInf {m | p m}
[PROOFSTEP]
exact (h.subset hp).elim
[GOAL]
case hp
n : ℕ
p : ℕ → Prop
hn : n ≤ sInf {m | p m}
h : {m | p (m + n)} = ∅
hnp : n < sInf {m | p m}
⊢ p (sInf {m | p m} - n + n)
[PROOFSTEP]
rw [tsub_add_cancel_of_le hn]
[GOAL]
case hp
n : ℕ
p : ℕ → Prop
hn : n ≤ sInf {m | p m}
h : {m | p (m + n)} = ∅
hnp : n < sInf {m | p m}
⊢ p (sInf {m | p m})
[PROOFSTEP]
exact csInf_mem (nonempty_of_pos_sInf <| n.zero_le.trans_lt hnp)
[GOAL]
case inr.intro
n : ℕ
p : ℕ → Prop
hn : n ≤ sInf {m | p m}
m : ℕ
hm : m ∈ {m | p (m + n)}
⊢ sInf {m | p (m + n)} + n = sInf {m | p m}
[PROOFSTEP]
have hp : ∃ n, n ∈ {m | p m} := ⟨_, hm⟩
[GOAL]
case inr.intro
n : ℕ
p : ℕ → Prop
hn : n ≤ sInf {m | p m}
m : ℕ
hm : m ∈ {m | p (m + n)}
hp : ∃ n, n ∈ {m | p m}
⊢ sInf {m | p (m + n)} + n = sInf {m | p m}
[PROOFSTEP]
rw [Nat.sInf_def ⟨m, hm⟩, Nat.sInf_def hp]
[GOAL]
case inr.intro
n : ℕ
p : ℕ → Prop
hn : n ≤ sInf {m | p m}
m : ℕ
hm : m ∈ {m | p (m + n)}
hp : ∃ n, n ∈ {m | p m}
⊢ Nat.find (_ : ∃ x, x ∈ {m | p (m + n)}) + n = Nat.find hp
[PROOFSTEP]
rw [Nat.sInf_def hp] at hn
[GOAL]
case inr.intro
n : ℕ
p : ℕ → Prop
m : ℕ
hm : m ∈ {m | p (m + n)}
hp : ∃ n, n ∈ {m | p m}
hn : n ≤ Nat.find hp
⊢ Nat.find (_ : ∃ x, x ∈ {m | p (m + n)}) + n = Nat.find hp
[PROOFSTEP]
exact find_add hn
[GOAL]
n : ℕ
p : ℕ → Prop
h : 0 < sInf {m | p m}
⊢ sInf {m | p m} + n = sInf {m | p (m - n)}
[PROOFSTEP]
suffices h₁ : n ≤ sInf {m | p (m - n)}
[GOAL]
n : ℕ
p : ℕ → Prop
h : 0 < sInf {m | p m}
h₁ : n ≤ sInf {m | p (m - n)}
⊢ sInf {m | p m} + n = sInf {m | p (m - n)}
case h₁ n : ℕ p : ℕ → Prop h : 0 < sInf {m | p m} ⊢ n ≤ sInf {m | p (m - n)}
[PROOFSTEP]
convert sInf_add h₁
[GOAL]
case h.e'_2.h.e'_5.h.e'_3.h.e'_2.h.h.e'_1
n : ℕ
p : ℕ → Prop
h : 0 < sInf {m | p m}
h₁ : n ≤ sInf {m | p (m - n)}
x✝ : ℕ
⊢ x✝ = x✝ + n - n
[PROOFSTEP]
simp_rw [add_tsub_cancel_right]
[GOAL]
case h₁
n : ℕ
p : ℕ → Prop
h : 0 < sInf {m | p m}
⊢ n ≤ sInf {m | p (m - n)}
[PROOFSTEP]
obtain ⟨m, hm⟩ := nonempty_of_pos_sInf h
[GOAL]
case h₁.intro
n : ℕ
p : ℕ → Prop
h : 0 < sInf {m | p m}
m : ℕ
hm : m ∈ {m | p m}
⊢ n ≤ sInf {m | p (m - n)}
[PROOFSTEP]
refine'
  le_csInf ⟨m + n, _⟩ fun b hb ↦
    le_of_not_lt fun hbn ↦ ne_of_mem_of_not_mem _ (not_mem_of_lt_sInf h) (tsub_eq_zero_of_le hbn.le)
[GOAL]
case h₁.intro.refine'_1
n : ℕ
p : ℕ → Prop
h : 0 < sInf {m | p m}
m : ℕ
hm : m ∈ {m | p m}
⊢ m + n ∈ {m | p (m - n)}
[PROOFSTEP]
dsimp
[GOAL]
case h₁.intro.refine'_1
n : ℕ
p : ℕ → Prop
h : 0 < sInf {m | p m}
m : ℕ
hm : m ∈ {m | p m}
⊢ p (m + n - n)
[PROOFSTEP]
rwa [add_tsub_cancel_right]
[GOAL]
case h₁.intro.refine'_2
n : ℕ
p : ℕ → Prop
h : 0 < sInf {m | p m}
m : ℕ
hm : m ∈ {m | p m}
b : ℕ
hb : b ∈ {m | p (m - n)}
hbn : b < n
⊢ b - n ∈ {m | p m}
[PROOFSTEP]
exact hb
[GOAL]
α : Type u_1
inst✝ : CompleteLattice α
u : ℕ → α
n : ℕ
⊢ ⨆ (k : ℕ) (_ : k < n + 1), u k = (⨆ (k : ℕ) (_ : k < n), u k) ⊔ u n
[PROOFSTEP]
simp [Nat.lt_succ_iff_lt_or_eq, iSup_or, iSup_sup_eq]
[GOAL]
α : Type u_1
inst✝ : CompleteLattice α
u : ℕ → α
n : ℕ
⊢ ⨆ (k : ℕ) (_ : k < n + 1), u k = u 0 ⊔ ⨆ (k : ℕ) (_ : k < n), u (k + 1)
[PROOFSTEP]
rw [← sup_iSup_nat_succ]
[GOAL]
α : Type u_1
inst✝ : CompleteLattice α
u : ℕ → α
n : ℕ
⊢ (⨆ (_ : 0 < n + 1), u 0) ⊔ ⨆ (i : ℕ) (_ : i + 1 < n + 1), u (i + 1) = u 0 ⊔ ⨆ (k : ℕ) (_ : k < n), u (k + 1)
[PROOFSTEP]
simp


[GOAL]
G : Type u_1
inst✝¹ : Group G
A : Type u_2
inst✝ : AddGroup A
H K : Subgroup G
⊢ ∀ (x : { x // x ∈ ⊥ }), x ∈ {1}
[PROOFSTEP]
rintro ⟨x, ⟨hx⟩⟩
[GOAL]
case mk.refl
G : Type u_1
inst✝¹ : Group G
A : Type u_2
inst✝ : AddGroup A
H K : Subgroup G
⊢ { val := 1, property := (_ : 1 = 1) } ∈ {1}
[PROOFSTEP]
exact Finset.mem_singleton_self _
[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
H K : Subgroup G
inst✝ : Fintype G
⊢ Fintype.card { x // x ∈ ⊤ } = Fintype.card G
[PROOFSTEP]
rw [Fintype.card_eq]
[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
H K : Subgroup G
inst✝ : Fintype G
⊢ Nonempty ({ x // x ∈ ⊤ } ≃ G)
[PROOFSTEP]
exact Nonempty.intro Subgroup.topEquiv.toEquiv
[GOAL]
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
H K : Subgroup G
inst✝¹ : Fintype { x // x ∈ H }
inst✝ : Fintype G
h : Fintype.card { x // x ∈ H } = Fintype.card G
⊢ H = ⊤
[PROOFSTEP]
letI : Fintype (H : Set G) := ‹Fintype H›
[GOAL]
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
H K : Subgroup G
inst✝¹ : Fintype { x // x ∈ H }
inst✝ : Fintype G
h : Fintype.card { x // x ∈ H } = Fintype.card G
this : Fintype ↑↑H := inst✝¹
⊢ H = ⊤
[PROOFSTEP]
rw [SetLike.ext'_iff, coe_top, ← Finset.coe_univ, ← (H : Set G).coe_toFinset, Finset.coe_inj, ←
  Finset.card_eq_iff_eq_univ, ← h, Set.toFinset_card]
[GOAL]
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
H K : Subgroup G
inst✝¹ : Fintype { x // x ∈ H }
inst✝ : Fintype G
h : Fintype.card { x // x ∈ H } = Fintype.card G
this : Fintype ↑↑H := inst✝¹
⊢ Fintype.card ↑↑H = Fintype.card { x // x ∈ H }
[PROOFSTEP]
congr
[GOAL]
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
H K : Subgroup G
inst✝¹ : Fintype { x // x ∈ H }
inst✝ : Fintype G
h : H = ⊤
⊢ Fintype.card { x // x ∈ H } = Fintype.card G
[PROOFSTEP]
simpa only [h] using card_top
[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
H K : Subgroup G
inst✝ : Fintype { x // x ∈ H }
h : Fintype.card { x // x ∈ H } ≤ 1
x : G
hx : x ∈ H
⊢ x = 1
[PROOFSTEP]
simpa [Subtype.ext_iff] using Fintype.card_le_one_iff.1 h ⟨x, hx⟩ 1
[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
H K : Subgroup G
inst✝ : Fintype { x // x ∈ H }
h : H = ⊥
⊢ Fintype.card { x // x ∈ H } ≤ 1
[PROOFSTEP]
simp [h]
[GOAL]
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I : Finset η
H : Subgroup ((i : η) → f i)
x : (i : η) → f i
h1 : ∀ (i : η), ¬i ∈ I → x i = 1
h2 : ∀ (i : η), i ∈ I → Pi.mulSingle i (x i) ∈ H
⊢ x ∈ H
[PROOFSTEP]
induction' I using Finset.induction_on with i I hnmem ih generalizing x
[GOAL]
case empty
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I → Pi.mulSingle i (x✝ i) ∈ H
x : (i : η) → f i
h1 : ∀ (i : η), ¬i ∈ ∅ → x i = 1
h2 : ∀ (i : η), i ∈ ∅ → Pi.mulSingle i (x i) ∈ H
⊢ x ∈ H
[PROOFSTEP]
convert one_mem H
[GOAL]
case h.e'_4
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I → Pi.mulSingle i (x✝ i) ∈ H
x : (i : η) → f i
h1 : ∀ (i : η), ¬i ∈ ∅ → x i = 1
h2 : ∀ (i : η), i ∈ ∅ → Pi.mulSingle i (x i) ∈ H
⊢ x = 1
[PROOFSTEP]
ext i
[GOAL]
case h.e'_4.h
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I → Pi.mulSingle i (x✝ i) ∈ H
x : (i : η) → f i
h1 : ∀ (i : η), ¬i ∈ ∅ → x i = 1
h2 : ∀ (i : η), i ∈ ∅ → Pi.mulSingle i (x i) ∈ H
i : η
⊢ x i = OfNat.ofNat 1 i
[PROOFSTEP]
exact h1 i (Finset.not_mem_empty i)
[GOAL]
case insert
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
ih : ∀ (x : (i : η) → f i), (∀ (i : η), ¬i ∈ I → x i = 1) → (∀ (i : η), i ∈ I → Pi.mulSingle i (x i) ∈ H) → x ∈ H
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
⊢ x ∈ H
[PROOFSTEP]
have : x = Function.update x i 1 * Pi.mulSingle i (x i) :=
  by
  ext j
  by_cases heq : j = i
  · subst heq
    simp
  · simp [heq]
[GOAL]
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
ih : ∀ (x : (i : η) → f i), (∀ (i : η), ¬i ∈ I → x i = 1) → (∀ (i : η), i ∈ I → Pi.mulSingle i (x i) ∈ H) → x ∈ H
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
⊢ x = Function.update x i 1 * Pi.mulSingle i (x i)
[PROOFSTEP]
ext j
[GOAL]
case h
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
ih : ∀ (x : (i : η) → f i), (∀ (i : η), ¬i ∈ I → x i = 1) → (∀ (i : η), i ∈ I → Pi.mulSingle i (x i) ∈ H) → x ∈ H
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
j : η
⊢ x j = (Function.update x i 1 * Pi.mulSingle i (x i)) j
[PROOFSTEP]
by_cases heq : j = i
[GOAL]
case pos
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
ih : ∀ (x : (i : η) → f i), (∀ (i : η), ¬i ∈ I → x i = 1) → (∀ (i : η), i ∈ I → Pi.mulSingle i (x i) ∈ H) → x ∈ H
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
j : η
heq : j = i
⊢ x j = (Function.update x i 1 * Pi.mulSingle i (x i)) j
[PROOFSTEP]
subst heq
[GOAL]
case pos
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
I : Finset η
ih : ∀ (x : (i : η) → f i), (∀ (i : η), ¬i ∈ I → x i = 1) → (∀ (i : η), i ∈ I → Pi.mulSingle i (x i) ∈ H) → x ∈ H
x : (i : η) → f i
j : η
hnmem : ¬j ∈ I
h1 : ∀ (i : η), ¬i ∈ insert j I → x i = 1
h2 : ∀ (i : η), i ∈ insert j I → Pi.mulSingle i (x i) ∈ H
⊢ x j = (Function.update x j 1 * Pi.mulSingle j (x j)) j
[PROOFSTEP]
simp
[GOAL]
case neg
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
ih : ∀ (x : (i : η) → f i), (∀ (i : η), ¬i ∈ I → x i = 1) → (∀ (i : η), i ∈ I → Pi.mulSingle i (x i) ∈ H) → x ∈ H
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
j : η
heq : ¬j = i
⊢ x j = (Function.update x i 1 * Pi.mulSingle i (x i)) j
[PROOFSTEP]
simp [heq]
[GOAL]
case insert
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
ih : ∀ (x : (i : η) → f i), (∀ (i : η), ¬i ∈ I → x i = 1) → (∀ (i : η), i ∈ I → Pi.mulSingle i (x i) ∈ H) → x ∈ H
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
this : x = Function.update x i 1 * Pi.mulSingle i (x i)
⊢ x ∈ H
[PROOFSTEP]
rw [this]
[GOAL]
case insert
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
ih : ∀ (x : (i : η) → f i), (∀ (i : η), ¬i ∈ I → x i = 1) → (∀ (i : η), i ∈ I → Pi.mulSingle i (x i) ∈ H) → x ∈ H
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
this : x = Function.update x i 1 * Pi.mulSingle i (x i)
⊢ Function.update x i 1 * Pi.mulSingle i (x i) ∈ H
[PROOFSTEP]
clear this
[GOAL]
case insert
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
ih : ∀ (x : (i : η) → f i), (∀ (i : η), ¬i ∈ I → x i = 1) → (∀ (i : η), i ∈ I → Pi.mulSingle i (x i) ∈ H) → x ∈ H
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
⊢ Function.update x i 1 * Pi.mulSingle i (x i) ∈ H
[PROOFSTEP]
apply mul_mem
[GOAL]
case insert.a
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
ih : ∀ (x : (i : η) → f i), (∀ (i : η), ¬i ∈ I → x i = 1) → (∀ (i : η), i ∈ I → Pi.mulSingle i (x i) ∈ H) → x ∈ H
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
⊢ Function.update x i 1 ∈ H
[PROOFSTEP]
apply ih
[GOAL]
case insert.a.h1
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
ih : ∀ (x : (i : η) → f i), (∀ (i : η), ¬i ∈ I → x i = 1) → (∀ (i : η), i ∈ I → Pi.mulSingle i (x i) ∈ H) → x ∈ H
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
⊢ ∀ (i_1 : η), ¬i_1 ∈ I → Function.update x i 1 i_1 = 1
[PROOFSTEP]
clear ih
[GOAL]
case insert.a.h2
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
ih : ∀ (x : (i : η) → f i), (∀ (i : η), ¬i ∈ I → x i = 1) → (∀ (i : η), i ∈ I → Pi.mulSingle i (x i) ∈ H) → x ∈ H
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
⊢ ∀ (i_1 : η), i_1 ∈ I → Pi.mulSingle i_1 (Function.update x i 1 i_1) ∈ H
[PROOFSTEP]
clear ih
[GOAL]
case insert.a.h1
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
⊢ ∀ (i_1 : η), ¬i_1 ∈ I → Function.update x i 1 i_1 = 1
[PROOFSTEP]
intro j hj
[GOAL]
case insert.a.h1
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
j : η
hj : ¬j ∈ I
⊢ Function.update x i 1 j = 1
[PROOFSTEP]
by_cases heq : j = i
[GOAL]
case pos
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
j : η
hj : ¬j ∈ I
heq : j = i
⊢ Function.update x i 1 j = 1
[PROOFSTEP]
subst heq
[GOAL]
case pos
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
I : Finset η
x : (i : η) → f i
j : η
hj hnmem : ¬j ∈ I
h1 : ∀ (i : η), ¬i ∈ insert j I → x i = 1
h2 : ∀ (i : η), i ∈ insert j I → Pi.mulSingle i (x i) ∈ H
⊢ Function.update x j 1 j = 1
[PROOFSTEP]
simp
[GOAL]
case neg
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
j : η
hj : ¬j ∈ I
heq : ¬j = i
⊢ Function.update x i 1 j = 1
[PROOFSTEP]
simp [heq]
[GOAL]
case neg
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
j : η
hj : ¬j ∈ I
heq : ¬j = i
⊢ x j = 1
[PROOFSTEP]
apply h1 j
[GOAL]
case neg
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
j : η
hj : ¬j ∈ I
heq : ¬j = i
⊢ ¬j ∈ insert i I
[PROOFSTEP]
simpa [heq] using hj
[GOAL]
case insert.a.h2
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
⊢ ∀ (i_1 : η), i_1 ∈ I → Pi.mulSingle i_1 (Function.update x i 1 i_1) ∈ H
[PROOFSTEP]
intro j hj
[GOAL]
case insert.a.h2
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
j : η
hj : j ∈ I
⊢ Pi.mulSingle j (Function.update x i 1 j) ∈ H
[PROOFSTEP]
have : j ≠ i := by
  rintro rfl
  contradiction
[GOAL]
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
j : η
hj : j ∈ I
⊢ j ≠ i
[PROOFSTEP]
rintro rfl
[GOAL]
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
I : Finset η
x : (i : η) → f i
j : η
hj : j ∈ I
hnmem : ¬j ∈ I
h1 : ∀ (i : η), ¬i ∈ insert j I → x i = 1
h2 : ∀ (i : η), i ∈ insert j I → Pi.mulSingle i (x i) ∈ H
⊢ False
[PROOFSTEP]
contradiction
[GOAL]
case insert.a.h2
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
j : η
hj : j ∈ I
this : j ≠ i
⊢ Pi.mulSingle j (Function.update x i 1 j) ∈ H
[PROOFSTEP]
simp [this]
[GOAL]
case insert.a.h2
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
j : η
hj : j ∈ I
this : j ≠ i
⊢ Pi.mulSingle j (x j) ∈ H
[PROOFSTEP]
exact h2 _ (Finset.mem_insert_of_mem hj)
[GOAL]
case insert.a
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
ih : ∀ (x : (i : η) → f i), (∀ (i : η), ¬i ∈ I → x i = 1) → (∀ (i : η), i ∈ I → Pi.mulSingle i (x i) ∈ H) → x ∈ H
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
⊢ Pi.mulSingle i (x i) ∈ H
[PROOFSTEP]
apply h2
[GOAL]
case insert.a.a
G : Type u_1
inst✝³ : Group G
A : Type u_2
inst✝² : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I✝ : Finset η
H : Subgroup ((i : η) → f i)
x✝ : (i : η) → f i
h1✝ : ∀ (i : η), ¬i ∈ I✝ → x✝ i = 1
h2✝ : ∀ (i : η), i ∈ I✝ → Pi.mulSingle i (x✝ i) ∈ H
i : η
I : Finset η
hnmem : ¬i ∈ I
ih : ∀ (x : (i : η) → f i), (∀ (i : η), ¬i ∈ I → x i = 1) → (∀ (i : η), i ∈ I → Pi.mulSingle i (x i) ∈ H) → x ∈ H
x : (i : η) → f i
h1 : ∀ (i_1 : η), ¬i_1 ∈ insert i I → x i_1 = 1
h2 : ∀ (i_1 : η), i_1 ∈ insert i I → Pi.mulSingle i_1 (x i_1) ∈ H
⊢ i ∈ insert i I
[PROOFSTEP]
simp
[GOAL]
G : Type u_1
inst✝⁴ : Group G
A : Type u_2
inst✝³ : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝² : (i : η) → Group (f i)
inst✝¹ : Finite η
inst✝ : DecidableEq η
H : Subgroup ((i : η) → f i)
x : (i : η) → f i
h : ∀ (i : η), Pi.mulSingle i (x i) ∈ H
⊢ x ∈ H
[PROOFSTEP]
cases nonempty_fintype η
[GOAL]
case intro
G : Type u_1
inst✝⁴ : Group G
A : Type u_2
inst✝³ : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝² : (i : η) → Group (f i)
inst✝¹ : Finite η
inst✝ : DecidableEq η
H : Subgroup ((i : η) → f i)
x : (i : η) → f i
h : ∀ (i : η), Pi.mulSingle i (x i) ∈ H
val✝ : Fintype η
⊢ x ∈ H
[PROOFSTEP]
exact pi_mem_of_mulSingle_mem_aux Finset.univ x (by simp) fun i _ => h i
[GOAL]
G : Type u_1
inst✝⁴ : Group G
A : Type u_2
inst✝³ : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝² : (i : η) → Group (f i)
inst✝¹ : Finite η
inst✝ : DecidableEq η
H : Subgroup ((i : η) → f i)
x : (i : η) → f i
h : ∀ (i : η), Pi.mulSingle i (x i) ∈ H
val✝ : Fintype η
⊢ ∀ (i : η), ¬i ∈ Finset.univ → x i = 1
[PROOFSTEP]
simp
[GOAL]
G : Type u_1
inst✝⁴ : Group G
A : Type u_2
inst✝³ : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝² : (i : η) → Group (f i)
inst✝¹ : DecidableEq η
inst✝ : Finite η
H : (i : η) → Subgroup (f i)
J : Subgroup ((i : η) → f i)
⊢ pi univ H ≤ J ↔ ∀ (i : η), map (MonoidHom.single f i) (H i) ≤ J
[PROOFSTEP]
constructor
[GOAL]
case mp
G : Type u_1
inst✝⁴ : Group G
A : Type u_2
inst✝³ : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝² : (i : η) → Group (f i)
inst✝¹ : DecidableEq η
inst✝ : Finite η
H : (i : η) → Subgroup (f i)
J : Subgroup ((i : η) → f i)
⊢ pi univ H ≤ J → ∀ (i : η), map (MonoidHom.single f i) (H i) ≤ J
[PROOFSTEP]
rintro h i _ ⟨x, hx, rfl⟩
[GOAL]
case mp.intro.intro
G : Type u_1
inst✝⁴ : Group G
A : Type u_2
inst✝³ : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝² : (i : η) → Group (f i)
inst✝¹ : DecidableEq η
inst✝ : Finite η
H : (i : η) → Subgroup (f i)
J : Subgroup ((i : η) → f i)
h : pi univ H ≤ J
i : η
x : f i
hx : x ∈ ↑(H i)
⊢ ↑(MonoidHom.single f i) x ∈ J
[PROOFSTEP]
apply h
[GOAL]
case mp.intro.intro.a
G : Type u_1
inst✝⁴ : Group G
A : Type u_2
inst✝³ : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝² : (i : η) → Group (f i)
inst✝¹ : DecidableEq η
inst✝ : Finite η
H : (i : η) → Subgroup (f i)
J : Subgroup ((i : η) → f i)
h : pi univ H ≤ J
i : η
x : f i
hx : x ∈ ↑(H i)
⊢ ↑(MonoidHom.single f i) x ∈ pi univ H
[PROOFSTEP]
simpa using hx
[GOAL]
case mpr
G : Type u_1
inst✝⁴ : Group G
A : Type u_2
inst✝³ : AddGroup A
η : Type u_3
f : η → Type u_4
inst✝² : (i : η) → Group (f i)
inst✝¹ : DecidableEq η
inst✝ : Finite η
H : (i : η) → Subgroup (f i)
J : Subgroup ((i : η) → f i)
⊢ (∀ (i : η), map (MonoidHom.single f i) (H i) ≤ J) → pi univ H ≤ J
[PROOFSTEP]
exact fun h x hx => pi_mem_of_mulSingle_mem x fun i => h i (mem_map_of_mem _ (hx i trivial))
[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
S : Set G
inst✝ : Finite ↑S
x : G
h : ∀ (n : G), n ∈ S → x * n * x⁻¹ ∈ S
⊢ x ∈ setNormalizer S
[PROOFSTEP]
haveI := Classical.propDecidable
[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
S : Set G
inst✝ : Finite ↑S
x : G
h : ∀ (n : G), n ∈ S → x * n * x⁻¹ ∈ S
this : (a : Prop) → Decidable a
⊢ x ∈ setNormalizer S
[PROOFSTEP]
cases nonempty_fintype S
[GOAL]
case intro
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
S : Set G
inst✝ : Finite ↑S
x : G
h : ∀ (n : G), n ∈ S → x * n * x⁻¹ ∈ S
this : (a : Prop) → Decidable a
val✝ : Fintype ↑S
⊢ x ∈ setNormalizer S
[PROOFSTEP]
haveI := Set.fintypeImage S fun n => x * n * x⁻¹
[GOAL]
case intro
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
S : Set G
inst✝ : Finite ↑S
x : G
h : ∀ (n : G), n ∈ S → x * n * x⁻¹ ∈ S
this✝ : (a : Prop) → Decidable a
val✝ : Fintype ↑S
this : Fintype ↑((fun n => x * n * x⁻¹) '' S)
⊢ x ∈ setNormalizer S
[PROOFSTEP]
exact fun n =>
  ⟨h n, fun h₁ =>
    have heq : (fun n => x * n * x⁻¹) '' S = S :=
      Set.eq_of_subset_of_card_le (fun n ⟨y, hy⟩ => hy.2 ▸ h y hy.1)
        (by rw [Set.card_image_of_injective S conj_injective])
    have : x * n * x⁻¹ ∈ (fun n => x * n * x⁻¹) '' S := heq.symm ▸ h₁
    let ⟨y, hy⟩ := this
    conj_injective hy.2 ▸ hy.1⟩
[GOAL]
G : Type u_1
inst✝² : Group G
A : Type u_2
inst✝¹ : AddGroup A
S : Set G
inst✝ : Finite ↑S
x : G
h : ∀ (n : G), n ∈ S → x * n * x⁻¹ ∈ S
this✝ : (a : Prop) → Decidable a
val✝ : Fintype ↑S
this : Fintype ↑((fun n => x * n * x⁻¹) '' S)
n : G
h₁ : x * n * x⁻¹ ∈ S
⊢ Fintype.card ↑S ≤ Fintype.card ↑((fun n => x * n * x⁻¹) '' S)
[PROOFSTEP]
rw [Set.card_image_of_injective S conj_injective]


[GOAL]
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F G F' G' : C ⥤ D
α : F ⟶ G
β : F' ⟶ G'
X Y : C
f : X ⟶ Y
⊢ (tensorObj F F').map f ≫ (fun X => NatTrans.app α X ⊗ NatTrans.app β X) Y =
    (fun X => NatTrans.app α X ⊗ NatTrans.app β X) X ≫ (tensorObj G G').map f
[PROOFSTEP]
dsimp
[GOAL]
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F G F' G' : C ⥤ D
α : F ⟶ G
β : F' ⟶ G'
X Y : C
f : X ⟶ Y
⊢ (F.map f ⊗ F'.map f) ≫ (NatTrans.app α Y ⊗ NatTrans.app β Y) =
    (NatTrans.app α X ⊗ NatTrans.app β X) ≫ (G.map f ⊗ G'.map f)
[PROOFSTEP]
rw [← tensor_comp, α.naturality, β.naturality, tensor_comp]
[GOAL]
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F✝ G F' G' : C ⥤ D
α : F✝ ⟶ G
β✝ : F' ⟶ G'
F : C ⥤ D
β : F' ⟶ G'
X Y : C
f : X ⟶ Y
⊢ (tensorObj F F').map f ≫ (fun X => F.obj X ◁ NatTrans.app β X) Y =
    (fun X => F.obj X ◁ NatTrans.app β X) X ≫ (tensorObj F G').map f
[PROOFSTEP]
simp only [← id_tensorHom]
[GOAL]
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F✝ G F' G' : C ⥤ D
α : F✝ ⟶ G
β✝ : F' ⟶ G'
F : C ⥤ D
β : F' ⟶ G'
X Y : C
f : X ⟶ Y
⊢ (tensorObj F F').map f ≫ (𝟙 (F.obj Y) ⊗ NatTrans.app β Y) = (𝟙 (F.obj X) ⊗ NatTrans.app β X) ≫ (tensorObj F G').map f
[PROOFSTEP]
apply (tensorHom (𝟙 F) β).naturality
[GOAL]
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F G F'✝ G' : C ⥤ D
α : F ⟶ G
β : F'✝ ⟶ G'
F' : C ⥤ D
X Y : C
f : X ⟶ Y
⊢ (tensorObj F F').map f ≫ (fun X => NatTrans.app α X ▷ F'.obj X) Y =
    (fun X => NatTrans.app α X ▷ F'.obj X) X ≫ (tensorObj G F').map f
[PROOFSTEP]
simp only [← tensorHom_id]
[GOAL]
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F G F'✝ G' : C ⥤ D
α : F ⟶ G
β : F'✝ ⟶ G'
F' : C ⥤ D
X Y : C
f : X ⟶ Y
⊢ (tensorObj F F').map f ≫ (NatTrans.app α Y ⊗ 𝟙 (F'.obj Y)) =
    (NatTrans.app α X ⊗ 𝟙 (F'.obj X)) ≫ (tensorObj G F').map f
[PROOFSTEP]
apply (tensorHom α (𝟙 F')).naturality
[GOAL]
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
⊢ ∀ {X₁ Y₁ X₂ Y₂ : C ⥤ D} (f : X₁ ⟶ Y₁) (g : X₂ ⟶ Y₂),
    (fun {X₁ Y₁ X₂ Y₂} α β => FunctorCategory.tensorHom α β) f g =
      (fun {X₁ X₂} α F => FunctorCategory.whiskerRight α F) f X₂ ≫
        (fun F x x_1 α => FunctorCategory.whiskerLeft F α) Y₁ X₂ Y₂ g
[PROOFSTEP]
intros
[GOAL]
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
X₁✝ Y₁✝ X₂✝ Y₂✝ : C ⥤ D
f✝ : X₁✝ ⟶ Y₁✝
g✝ : X₂✝ ⟶ Y₂✝
⊢ (fun {X₁ Y₁ X₂ Y₂} α β => FunctorCategory.tensorHom α β) f✝ g✝ =
    (fun {X₁ X₂} α F => FunctorCategory.whiskerRight α F) f✝ X₂✝ ≫
      (fun F x x_1 α => FunctorCategory.whiskerLeft F α) Y₁✝ X₂✝ Y₂✝ g✝
[PROOFSTEP]
ext
[GOAL]
case w.h
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
X₁✝ Y₁✝ X₂✝ Y₂✝ : C ⥤ D
f✝ : X₁✝ ⟶ Y₁✝
g✝ : X₂✝ ⟶ Y₂✝
x✝ : C
⊢ NatTrans.app ((fun {X₁ Y₁ X₂ Y₂} α β => FunctorCategory.tensorHom α β) f✝ g✝) x✝ =
    NatTrans.app
      ((fun {X₁ X₂} α F => FunctorCategory.whiskerRight α F) f✝ X₂✝ ≫
        (fun F x x_1 α => FunctorCategory.whiskerLeft F α) Y₁✝ X₂✝ Y₂✝ g✝)
      x✝
[PROOFSTEP]
simp [tensorHom_def]
[GOAL]
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F G H K : C ⥤ D
⊢ (fun {X₁ Y₁ X₂ Y₂} α β => FunctorCategory.tensorHom α β)
        ((fun F G H => NatIso.ofComponents fun X => α_ (F.obj X) (G.obj X) (H.obj X)) F G H).hom (𝟙 K) ≫
      ((fun F G H => NatIso.ofComponents fun X => α_ (F.obj X) (G.obj X) (H.obj X)) F
            ((fun F G => FunctorCategory.tensorObj F G) G H) K).hom ≫
        (fun {X₁ Y₁ X₂ Y₂} α β => FunctorCategory.tensorHom α β) (𝟙 F)
          ((fun F G H => NatIso.ofComponents fun X => α_ (F.obj X) (G.obj X) (H.obj X)) G H K).hom =
    ((fun F G H => NatIso.ofComponents fun X => α_ (F.obj X) (G.obj X) (H.obj X))
          ((fun F G => FunctorCategory.tensorObj F G) F G) H K).hom ≫
      ((fun F G H => NatIso.ofComponents fun X => α_ (F.obj X) (G.obj X) (H.obj X)) F G
          ((fun F G => FunctorCategory.tensorObj F G) H K)).hom
[PROOFSTEP]
ext X
[GOAL]
case w.h
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F G H K : C ⥤ D
X : C
⊢ NatTrans.app
      ((fun {X₁ Y₁ X₂ Y₂} α β => FunctorCategory.tensorHom α β)
          ((fun F G H => NatIso.ofComponents fun X => α_ (F.obj X) (G.obj X) (H.obj X)) F G H).hom (𝟙 K) ≫
        ((fun F G H => NatIso.ofComponents fun X => α_ (F.obj X) (G.obj X) (H.obj X)) F
              ((fun F G => FunctorCategory.tensorObj F G) G H) K).hom ≫
          (fun {X₁ Y₁ X₂ Y₂} α β => FunctorCategory.tensorHom α β) (𝟙 F)
            ((fun F G H => NatIso.ofComponents fun X => α_ (F.obj X) (G.obj X) (H.obj X)) G H K).hom)
      X =
    NatTrans.app
      (((fun F G H => NatIso.ofComponents fun X => α_ (F.obj X) (G.obj X) (H.obj X))
            ((fun F G => FunctorCategory.tensorObj F G) F G) H K).hom ≫
        ((fun F G H => NatIso.ofComponents fun X => α_ (F.obj X) (G.obj X) (H.obj X)) F G
            ((fun F G => FunctorCategory.tensorObj F G) H K)).hom)
      X
[PROOFSTEP]
dsimp
[GOAL]
case w.h
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
inst✝ : MonoidalCategory D
F G H K : C ⥤ D
X : C
⊢ ((α_ (F.obj X) (G.obj X) (H.obj X)).hom ⊗ 𝟙 (K.obj X)) ≫
      (α_ (F.obj X) (G.obj X ⊗ H.obj X) (K.obj X)).hom ≫ (𝟙 (F.obj X) ⊗ (α_ (G.obj X) (H.obj X) (K.obj X)).hom) =
    (α_ (F.obj X ⊗ G.obj X) (H.obj X) (K.obj X)).hom ≫ (α_ (F.obj X) (G.obj X) (H.obj X ⊗ K.obj X)).hom
[PROOFSTEP]
rw [pentagon]
[GOAL]
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
inst✝¹ : MonoidalCategory D
inst✝ : BraidedCategory D
F G H : C ⥤ D
⊢ (α_ F G H).hom ≫ ((fun F G => NatIso.ofComponents fun X => β_ (F.obj X) (G.obj X)) F (G ⊗ H)).hom ≫ (α_ G H F).hom =
    (((fun F G => NatIso.ofComponents fun X => β_ (F.obj X) (G.obj X)) F G).hom ⊗ 𝟙 H) ≫
      (α_ G F H).hom ≫ (𝟙 G ⊗ ((fun F G => NatIso.ofComponents fun X => β_ (F.obj X) (G.obj X)) F H).hom)
[PROOFSTEP]
ext X
[GOAL]
case w.h
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
inst✝¹ : MonoidalCategory D
inst✝ : BraidedCategory D
F G H : C ⥤ D
X : C
⊢ NatTrans.app
      ((α_ F G H).hom ≫
        ((fun F G => NatIso.ofComponents fun X => β_ (F.obj X) (G.obj X)) F (G ⊗ H)).hom ≫ (α_ G H F).hom)
      X =
    NatTrans.app
      ((((fun F G => NatIso.ofComponents fun X => β_ (F.obj X) (G.obj X)) F G).hom ⊗ 𝟙 H) ≫
        (α_ G F H).hom ≫ (𝟙 G ⊗ ((fun F G => NatIso.ofComponents fun X => β_ (F.obj X) (G.obj X)) F H).hom))
      X
[PROOFSTEP]
apply hexagon_forward
[GOAL]
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
inst✝¹ : MonoidalCategory D
inst✝ : BraidedCategory D
F G H : C ⥤ D
⊢ (α_ F G H).inv ≫ ((fun F G => NatIso.ofComponents fun X => β_ (F.obj X) (G.obj X)) (F ⊗ G) H).hom ≫ (α_ H F G).inv =
    (𝟙 F ⊗ ((fun F G => NatIso.ofComponents fun X => β_ (F.obj X) (G.obj X)) G H).hom) ≫
      (α_ F H G).inv ≫ (((fun F G => NatIso.ofComponents fun X => β_ (F.obj X) (G.obj X)) F H).hom ⊗ 𝟙 G)
[PROOFSTEP]
ext X
[GOAL]
case w.h
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
inst✝¹ : MonoidalCategory D
inst✝ : BraidedCategory D
F G H : C ⥤ D
X : C
⊢ NatTrans.app
      ((α_ F G H).inv ≫
        ((fun F G => NatIso.ofComponents fun X => β_ (F.obj X) (G.obj X)) (F ⊗ G) H).hom ≫ (α_ H F G).inv)
      X =
    NatTrans.app
      ((𝟙 F ⊗ ((fun F G => NatIso.ofComponents fun X => β_ (F.obj X) (G.obj X)) G H).hom) ≫
        (α_ F H G).inv ≫ (((fun F G => NatIso.ofComponents fun X => β_ (F.obj X) (G.obj X)) F H).hom ⊗ 𝟙 G))
      X
[PROOFSTEP]
apply hexagon_reverse
[GOAL]
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
inst✝¹ : MonoidalCategory D
inst✝ : SymmetricCategory D
F G : C ⥤ D
⊢ (β_ F G).hom ≫ (β_ G F).hom = 𝟙 (F ⊗ G)
[PROOFSTEP]
ext X
[GOAL]
case w.h
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
inst✝¹ : MonoidalCategory D
inst✝ : SymmetricCategory D
F G : C ⥤ D
X : C
⊢ NatTrans.app ((β_ F G).hom ≫ (β_ G F).hom) X = NatTrans.app (𝟙 (F ⊗ G)) X
[PROOFSTEP]
apply symmetry