Cauchy-Binet in Lean

Theorem. ${\det (AB) = \sum_{|I| = m} (\det A[\cdot, I]) (\det B[I, \cdot])}$
variable {R : Type*} [CommRing R]
variable {M N : Type} [Fintype M] [Fintype N] [DecidableEq M] [DecidableEq N]
  [LinearOrder M] [LinearOrder N]

/-- Cauchy-Binet, https://en.wikipedia.org/wiki/Cauchy%E2%80%93Binet_formula -/
theorem Matrix.det_mul' (A : Matrix M N R) (B : Matrix N M R) :
    det (A * B) = ∑ f : M ↪o N, 
	  det (A.submatrix id f) * det (B.submatrix f id) := by
	...

Cauchy-Binet in Lean

Many choices for "spelling" formalization
variable [Fintype M] ... [LinearOrder M] [LinearOrder N]

theorem Matrix.det_mul' (A : Matrix M N R) (B : Matrix N M R) :
    det (A * B) = ∑ f : M ↪o N, 
	  det (A.submatrix id f) * det (B.submatrix f id) := by
	...
  • From Meta's autoformalizing textbooks project
theorem cauchyBinet {n m : ℕ} 
	(A : Matrix (Fin n) (Fin m) R) (B : Matrix (Fin m) (Fin n) R) :
    (A * B).det = ∑ S ∈ (Finset.univ : Finset (Fin m)).powersetCard n,
	if h : S.card = n then
	(colsSubmatrix A S h).det * (rowsSubmatrix B S h).det
	else 0 := by
	...

Cauchy-Binet in Lean

Many choices for "spelling" formalization
theorem Matrix.det_mul' (A : Matrix M N R) (B : Matrix N M R) :
    det (A * B) = ∑ f : M ↪o N, 
	  det (A.submatrix id f) * det (B.submatrix f id) := by
	...
/-! We prove the Cauchy–Binet formula in the "function form":
`det(A * B) = ∑ f : m → n, (∏ i, A i (f i)) * det(B.submatrix f id)`
and then restrict to injective functions.
... -/

theorem Matrix.det_mul_sum (A : Matrix m n R) (B : Matrix n m R) :
    (A * B).det = ∑ f : m → n, 
	  (∏ i, A i (f i)) * (B.submatrix f id).det := by
	...

Cauchy-Binet: small case

  • Start with $2 \times 3$ matrices
variable {R : Type*} [CommRing R]
lemma det_mul_2_by_3 (A : Matrix (Fin 2) (Fin 3) R) 
    	(B : Matrix (Fin 3) (Fin 2) R) :
		det (A * B) = ∑ f : (Fin 2) ↪o (Fin 3), 
		det (A.submatrix id f) * det (B.submatrix f id) := by
	...

Cauchy-Binet: small case

import Mathlib

open Matrix

lemma injec_2_3 : (Finset.univ : Finset ( Fin 2 ↪o Fin 3 )) = 
	{ 
		OrderEmbedding.ofStrictMono ( ![0,1] ) ( by decide ), 
		OrderEmbedding.ofStrictMono ( ![0,2] ) ( by decide ), 
		OrderEmbedding.ofStrictMono ( ![1,2] ) ( by decide ) 
	} := by
	ext f
	simp [Finset.mem_univ]
	rcases f with ⟨ f, hf ⟩
	rcases f with ⟨ f, hf ⟩
	fin_cases f <;> simp +decide at hf ⊢
	· left
		ext i
		fin_cases i <;> rfl
	· right; left
		ext i
		fin_cases i <;> rfl;
	· right; right
		ext i
		fin_cases i <;> rfl;
	
	

variable {R : Type*} [CommRing R]
lemma det_mul_2_by_3 (A : Matrix (Fin 2) (Fin 3) R) 
    	(B : Matrix (Fin 3) (Fin 2) R) :
		det (A * B) = ∑ f : (Fin 2) ↪o (Fin 3), 
		det (A.submatrix id f) * det (B.submatrix f id) := by
	simp +decide [ Matrix.det_fin_two]
	simp +decide [ Matrix.mul_apply, Fin.sum_univ_three ]
	rw [ injec_2_3 ]
	simp +decide ; 
	ring!;
[Lean playground]