-- Mathlib/LinearAlgebra/LinearDisjoint.lean
theorem rank_inf_le_one_of_commute_of_flat (hf : Module.Flat R M ∨ Module.Flat R N)
    (hc : ∀ (m n : ↥(M ⊓ N)), Commute m.1 n.1) : Module.rank R ↥(M ⊓ N) ≤ 1

Proof state:
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : Ring S
inst✝ : Algebra R S
M N : Submodule R S
H : M.LinearDisjoint N
hf : Module.Flat R ↥M ∨ Module.Flat R ↥N
hc : ∀ (m n : ↥(M ⊓ N)), Commute ↑m ↑n
a✝ : Nontrivial R
s : Finset ↥(M ⊓ N)
h : LinearIndependent R fun i => ↑i
⊢ s.card ≤ 1

Tactic:
by_contra hs

Result:
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : Ring S
inst✝ : Algebra R S
M N : Submodule R S
H : M.LinearDisjoint N
hf : Module.Flat R ↥M ∨ Module.Flat R ↥N
hc : ∀ (m n : ↥(M ⊓ N)), Commute ↑m ↑n
a✝ : Nontrivial R
s : Finset ↥(M ⊓ N)
h : LinearIndependent R fun i => ↑i
hs : ¬s.card ≤ 1
⊢ False

Proof state:
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : Ring S
inst✝ : Algebra R S
M N : Submodule R S
H : M.LinearDisjoint N
hf : Module.Flat R ↥M ∨ Module.Flat R ↥N
hc : ∀ (m n : ↥(M ⊓ N)), Commute ↑m ↑n
a✝ : Nontrivial R
⊢ Module.rank R ↥(M ⊓ N) ≤ 1

Tactic:
refine _root_.rank_le fun s h ↦ ?_

Result:
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : Ring S
inst✝ : Algebra R S
M N : Submodule R S
H : M.LinearDisjoint N
hf : Module.Flat R ↥M ∨ Module.Flat R ↥N
hc : ∀ (m n : ↥(M ⊓ N)), Commute ↑m ↑n
a✝ : Nontrivial R
s : Finset ↥(M ⊓ N)
h : LinearIndependent R fun i => ↑i
⊢ s.card ≤ 1

Proof state:
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : Ring S
inst✝ : Algebra R S
M N : Submodule R S
H : M.LinearDisjoint N
hf : Module.Flat R ↥M ∨ Module.Flat R ↥N
hc : ∀ (m n : ↥(M ⊓ N)), Commute ↑m ↑n
a✝ : Nontrivial R
s : Finset ↥(M ⊓ N)
h : LinearIndependent R fun i => ↑i
hs : Nontrivial { x // x ∈ s }
a b : { x // x ∈ s }
hab : a ≠ b
i j : Fin (Nat.succ 0).succ
hij : ![a, b] i = ![a, b] j
⊢ i = j

Tactic:
fin_cases i <;> fin_cases j

Result:
case «0».«0»
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : Ring S
inst✝ : Algebra R S
M N : Submodule R S
H : M.LinearDisjoint N
hf : Module.Flat R ↥M ∨ Module.Flat R ↥N
hc : ∀ (m n : ↥(M ⊓ N)), Commute ↑m ↑n
a✝ : Nontrivial R
s : Finset ↥(M ⊓ N)
h : LinearIndependent R fun i => ↑i
hs : Nontrivial { x // x ∈ s }
a b : { x // x ∈ s }
hab : a ≠ b
hij : ![a, b] ((fun i => i) ⟨0, ⋯⟩) = ![a, b] ((fun i => i) ⟨0, ⋯⟩)
⊢ (fun i => i) ⟨0, ⋯⟩ = (fun i => i) ⟨0, ⋯⟩

case «0».«1»
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : Ring S
inst✝ : Algebra R S
M N : Submodule R S
H : M.LinearDisjoint N
hf : Module.Flat R ↥M ∨ Module.Flat R ↥N
hc : ∀ (m n : ↥(M ⊓ N)), Commute ↑m ↑n
a✝ : Nontrivial R
s : Finset ↥(M ⊓ N)
h : LinearIndependent R fun i => ↑i
hs : Nontrivial { x // x ∈ s }
a b : { x // x ∈ s }
hab : a ≠ b
hij : ![a, b] ((fun i => i) ⟨0, ⋯⟩) = ![a, b] ((fun i => i) ⟨1, ⋯⟩)
⊢ (fun i => i) ⟨0, ⋯⟩ = (fun i => i) ⟨1, ⋯⟩

case «1».«0»
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : Ring S
inst✝ : Algebra R S
M N : Submodule R S
H : M.LinearDisjoint N
hf : Module.Flat R ↥M ∨ Module.Flat R ↥N
hc : ∀ (m n : ↥(M ⊓ N)), Commute ↑m ↑n
a✝ : Nontrivial R
s : Finset ↥(M ⊓ N)
h : LinearIndependent R fun i => ↑i
hs : Nontrivial { x // x ∈ s }
a b : { x // x ∈ s }
hab : a ≠ b
hij : ![a, b] ((fun i => i) ⟨1, ⋯⟩) = ![a, b] ((fun i => i) ⟨0, ⋯⟩)
⊢ (fun i => i) ⟨1, ⋯⟩ = (fun i => i) ⟨0, ⋯⟩

case «1».«1»
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : Ring S
inst✝ : Algebra R S
M N : Submodule R S
H : M.LinearDisjoint N
hf : Module.Flat R ↥M ∨ Module.Flat R ↥N
hc : ∀ (m n : ↥(M ⊓ N)), Commute ↑m ↑n
a✝ : Nontrivial R
s : Finset ↥(M ⊓ N)
h : LinearIndependent R fun i => ↑i
hs : Nontrivial { x // x ∈ s }
a b : { x // x ∈ s }
hab : a ≠ b
hij : ![a, b] ((fun i => i) ⟨1, ⋯⟩) = ![a, b] ((fun i => i) ⟨1, ⋯⟩)
⊢ (fun i => i) ⟨1, ⋯⟩ = (fun i => i) ⟨1, ⋯⟩

Proof state:
case «1».«1»
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : Ring S
inst✝ : Algebra R S
M N : Submodule R S
H : M.LinearDisjoint N
hf : Module.Flat R ↥M ∨ Module.Flat R ↥N
hc : ∀ (m n : ↥(M ⊓ N)), Commute ↑m ↑n
a✝ : Nontrivial R
s : Finset ↥(M ⊓ N)
h : LinearIndependent R fun i => ↑i
hs : Nontrivial { x // x ∈ s }
a b : { x // x ∈ s }
hab : a ≠ b
hij : ![a, b] ((fun i => i) ⟨1, ⋯⟩) = ![a, b] ((fun i => i) ⟨1, ⋯⟩)
⊢ (fun i => i) ⟨1, ⋯⟩ = (fun i => i) ⟨1, ⋯⟩

Tactic:
rfl

Result:
no goals

Proof state:
case «0».«1»
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : Ring S
inst✝ : Algebra R S
M N : Submodule R S
H : M.LinearDisjoint N
hf : Module.Flat R ↥M ∨ Module.Flat R ↥N
hc : ∀ (m n : ↥(M ⊓ N)), Commute ↑m ↑n
a✝ : Nontrivial R
s : Finset ↥(M ⊓ N)
h : LinearIndependent R fun i => ↑i
hs : Nontrivial { x // x ∈ s }
a b : { x // x ∈ s }
hab : a ≠ b
hij : ![a, b] ((fun i => i) ⟨0, ⋯⟩) = ![a, b] ((fun i => i) ⟨1, ⋯⟩)
⊢ (fun i => i) ⟨0, ⋯⟩ = (fun i => i) ⟨1, ⋯⟩

Tactic:
simp [hab] at hij

Result:
no goals

Proof state:
case h.e'_4
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : Ring S
inst✝ : Algebra R S
M N : Submodule R S
H : M.LinearDisjoint N
hf : Module.Flat R ↥M ∨ Module.Flat R ↥N
hc : ∀ (m n : ↥(M ⊓ N)), Commute ↑m ↑n
a✝ : Nontrivial R
s : Finset ↥(M ⊓ N)
h : LinearIndependent R fun i => ↑i
hs : Nontrivial { x // x ∈ s }
a b : { x // x ∈ s }
hab : a ≠ b
this : LinearIndependent R ((fun i => ↑i) ∘ ![a, b])
⊢ ![↑a, ↑b] = (fun i => ↑i) ∘ ![a, b]

Tactic:
ext i

Result:
case h.e'_4.h.a
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : Ring S
inst✝ : Algebra R S
M N : Submodule R S
H : M.LinearDisjoint N
hf : Module.Flat R ↥M ∨ Module.Flat R ↥N
hc : ∀ (m n : ↥(M ⊓ N)), Commute ↑m ↑n
a✝ : Nontrivial R
s : Finset ↥(M ⊓ N)
h : LinearIndependent R fun i => ↑i
hs : Nontrivial { x // x ∈ s }
a b : { x // x ∈ s }
hab : a ≠ b
this : LinearIndependent R ((fun i => ↑i) ∘ ![a, b])
i : Fin (Nat.succ 0).succ
⊢ ↑(![↑a, ↑b] i) = ↑(((fun i => ↑i) ∘ ![a, b]) i)

Proof state:
case «1».«0»
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : Ring S
inst✝ : Algebra R S
M N : Submodule R S
H : M.LinearDisjoint N
hf : Module.Flat R ↥M ∨ Module.Flat R ↥N
hc : ∀ (m n : ↥(M ⊓ N)), Commute ↑m ↑n
a✝ : Nontrivial R
s : Finset ↥(M ⊓ N)
h : LinearIndependent R fun i => ↑i
hs : Nontrivial { x // x ∈ s }
a b : { x // x ∈ s }
hab : a ≠ b
hij : ![a, b] ((fun i => i) ⟨1, ⋯⟩) = ![a, b] ((fun i => i) ⟨0, ⋯⟩)
⊢ (fun i => i) ⟨1, ⋯⟩ = (fun i => i) ⟨0, ⋯⟩

Tactic:
simp [hab.symm] at hij

Result:
no goals

Proof state:
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : Ring S
inst✝ : Algebra R S
M N : Submodule R S
H : M.LinearDisjoint N
hf : Module.Flat R ↥M ∨ Module.Flat R ↥N
hc : ∀ (m n : ↥(M ⊓ N)), Commute ↑m ↑n
a✝ : Nontrivial R
s : Finset ↥(M ⊓ N)
h : LinearIndependent R fun i => ↑i
hs : ¬s.card ≤ 1
⊢ False

Tactic:
rw [not_le, ← Fintype.card_coe, Fintype.one_lt_card_iff_nontrivial] at hs

Result:
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : Ring S
inst✝ : Algebra R S
M N : Submodule R S
H : M.LinearDisjoint N
hf : Module.Flat R ↥M ∨ Module.Flat R ↥N
hc : ∀ (m n : ↥(M ⊓ N)), Commute ↑m ↑n
a✝ : Nontrivial R
s : Finset ↥(M ⊓ N)
h : LinearIndependent R fun i => ↑i
hs : Nontrivial { x // x ∈ s }
⊢ False

Proof state:
case intro.intro
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : Ring S
inst✝ : Algebra R S
M N : Submodule R S
H : M.LinearDisjoint N
hf : Module.Flat R ↥M ∨ Module.Flat R ↥N
hc : ∀ (m n : ↥(M ⊓ N)), Commute ↑m ↑n
a✝ : Nontrivial R
s : Finset ↥(M ⊓ N)
h : LinearIndependent R fun i => ↑i
hs : Nontrivial { x // x ∈ s }
a b : { x // x ∈ s }
hab : a ≠ b
this : LinearIndependent R ((fun i => ↑i) ∘ ![a, b])
⊢ LinearIndependent R ![↑a, ↑b]

Tactic:
convert this

Result:
case h.e'_4
R : Type u
S : Type v
inst✝² : CommRing R
inst✝¹ : Ring S
inst✝ : Algebra R S
M N : Submodule R S
H : M.LinearDisjoint N
hf : Module.Flat R ↥M ∨ Module.Flat R ↥N
hc : ∀ (m n : ↥(M ⊓ N)), Commute ↑m ↑n
a✝ : Nontrivial R
s : Finset ↥(M ⊓ N)
h : LinearIndependent R fun i => ↑i
hs : Nontrivial { x // x ∈ s }
a b : { x // x ∈ s }
hab : a ≠ b
this : LinearIndependent R ((fun i => ↑i) ∘ ![a, b])
⊢ ![↑a, ↑b] = (fun i => ↑i) ∘ ![a, b]