module Cubical.Algebra.Determinant.Adjugate where

open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Equiv
open import Cubical.Algebra.Matrix
open import Cubical.Algebra.Matrix.CommRingCoefficient
open import Cubical.Functions.FunExtEquiv
open import Cubical.Data.Bool
open import Cubical.Data.Sum
open import Cubical.Foundations.Structure using (⟨_⟩)
open import Cubical.Data.Nat renaming ( _+_ to _+ℕ_ ; _·_ to _·ℕ_
                                       ; +-comm to +ℕ-comm
                                       ; +-assoc to +ℕ-assoc
                                       ; ·-assoc to ·ℕ-assoc)
open import Cubical.Data.FinData
open import Cubical.Data.FinData.Order using (_<'Fin_
                                             ; _≤'Fin_
                                             ; weakenPredFinLt
                                             ; weakenweakenFinLe
                                             ; strengthenFin
                                             ; toℕstrengthenFin
                                             ; weakenStrengthenFin
                                             ; strengthenFinLt
                                             ; _≟Fin_
                                             ; FinTrichotomy
                                             ; lt; eq; gt)
open import Cubical.Algebra.Ring
open import Cubical.Algebra.Ring.Base
open import Cubical.Algebra.Ring.BigOps
open import Cubical.Algebra.Monoid.BigOp
open import Cubical.Algebra.CommRing
open import Cubical.Algebra.CommRing.Base
open import Cubical.Algebra.Semiring
open import Cubical.Data.Int.Base using (pos; negsuc)
open import Cubical.Data.Vec.Base using (_∷_; [])
open import Cubical.Data.Nat.Order
open import Cubical.Tactics.CommRingSolver

open import Cubical.Algebra.Determinant.Minor
open import Cubical.Algebra.Determinant.RingSum
open import Cubical.Algebra.Determinant.Base

module Adjugate ( : Level) (P' : CommRing ) where
  open Cubical.Algebra.Determinant.Minor.Minor 
  open Cubical.Algebra.Determinant.RingSum.RingSum  P'
  open RingStr (snd (CommRing→Ring P'))
  open Cubical.Algebra.Determinant.Base.Determinat  P'
  open Coefficient (P')

  -- Scalar multiplication
  _∘_ : {n m : }  R  FinMatrix R n m  FinMatrix R n m
  (a  M) i j = a · (M i j)

  -- Properties of ==
  ==Refl : {n : }  (k : Fin n)  k == k  true
  ==Refl {n} zero = refl
  ==Refl {suc n} (suc k) = ==Refl {n} k

  ==Sym :  {n : }  (k l : Fin n)  k == l  l == k
  ==Sym {suc n} zero zero = refl
  ==Sym {suc n} zero (suc l) = refl
  ==Sym {suc n} (suc k) zero = refl
  ==Sym {suc n} (suc k) (suc l) = ==Sym {n} k l

  -- Properties of the Kronecker Delta
  deltaProp : {n : }  (k l : Fin n)  toℕ k <' toℕ l  δ k l  0r
  deltaProp {suc n} zero (suc l) (s≤s le) = refl
  deltaProp {suc n} (suc k) (suc l) (s≤s le) =  deltaProp {n} k l le

  deltaPropSym : {n : }  (k l : Fin n)  toℕ l <' toℕ k  δ k l  0r
  deltaPropSym {suc n} (suc k) (zero) (s≤s le) = refl
  deltaPropSym {suc n} (suc k) (suc l) (s≤s le) =  deltaPropSym {n} k l le

  deltaPropEq : {n : }  (k l : Fin n)  k  l  δ k l  1r
  deltaPropEq k l e =
    δ k l
    ≡⟨ cong  a  δ a l) e 
    δ l l
    ≡⟨ cong  a  if a then 1r else 0r) (==Refl l) 
    1r
    

  deltaComm : {n : }  (k l : Fin n)  δ k l  δ l k
  deltaComm k l = cong  a  if a then 1r else 0r) (==Sym k l)

  -- Definition of the cofactor matrix
  cof : {n : }  FinMatrix R n n  FinMatrix R n n
  cof {suc n} M i j = (MF (toℕ i +ℕ toℕ j)) ·  det {n} (minor i j M)

  -- Behavior of the cofactor matrix under transposition
  cofTransp : {n : }  (M : FinMatrix R n n)  (i j : Fin n) 
    cof (M ) i j  cof M j i
  cofTransp {suc n} M i j =
    MF (toℕ i +ℕ toℕ j) ·  det (minor i j (M ))
    ≡⟨ cong  a  MF (toℕ i +ℕ toℕ j) · a) (detTransp ((minor j i M ))) 
    (MF (toℕ i +ℕ toℕ j) · det (minor j i M))
    ≡⟨
      cong
       a  MF (a) · det (minor j i M)) (+ℕ-comm (toℕ i) (toℕ j)) 
    (MF (toℕ j +ℕ toℕ i) · det (minor j i M))
    

  -- Definition of the adjugate matrix
  adjugate : {n : }  FinMatrix R n n  FinMatrix R n n
  adjugate M i j = cof M j i

  -- Behavior of the adjugate matrix under transposition
  adjugateTransp : {n : }  (M : FinMatrix R n n)  (i j : Fin n) 
    adjugate (M ) i j  adjugate M j i
  adjugateTransp M i j = cofTransp M j i

  adjugatePropAux1a :  {n : }  (M : FinMatrix R (suc (suc n)) (suc (suc n))) 
    (k l : Fin (suc (suc n)))  toℕ k <' toℕ l 
   
       i 
         
          j 
            ind> (toℕ i) (toℕ j) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
              det (minor (predFin l) j (minor k i M))))))
    
    
       i 
         
          z 
            ind> (toℕ i) (toℕ z) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (predFin l) +ℕ toℕ z) · M l (weakenFin z))
             · det (minor (predFin l) z (minor k i M)))))
  adjugatePropAux1a M k l le =
    ∑∑Compat
     i j 
           ind> (toℕ i) (toℕ j) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
              det (minor (predFin l) j (minor k i M)))))
     z z₁ 
        ind> (toℕ z) (toℕ z₁) ·
        (M l z · MF (toℕ k +ℕ toℕ z) ·
         (MF (toℕ (predFin l) +ℕ toℕ z₁) · M l (weakenFin z₁))
         · det (minor (predFin l) z₁ (minor k z M))))
      (ind>prop
       z z₁ 
          M l z · MF (toℕ k +ℕ toℕ z) ·
          (MF (toℕ (predFin l) +ℕ toℕ z₁) · minor k z M (predFin l) z₁ ·
           det (minor (predFin l) z₁ (minor k z M))))
       z z₁ 
          M l z · MF (toℕ k +ℕ toℕ z) ·
          (MF (toℕ (predFin l) +ℕ toℕ z₁) · M l (weakenFin z₁))
          · det (minor (predFin l) z₁ (minor k z M)))
       i j lf 
        (M l i · MF (toℕ k +ℕ toℕ i) ·
          (MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
           det (minor (predFin l) j (minor k i M))))
        ≡⟨
          cong
           a  M l i · MF (toℕ k +ℕ toℕ i) ·
          (MF (toℕ (predFin l) +ℕ toℕ j) · a  ·
           det (minor (predFin l) j (minor k i M))))
          (minorSucId
            k
            i
            (predFin l)
            j
            M
            (weakenPredFinLt k l le)
            lf)
         
        (M l i · MF (toℕ k +ℕ toℕ i) ·
          (MF (toℕ (predFin l) +ℕ toℕ j) · M (suc (predFin l)) (weakenFin j)
           · det (minor (predFin l) j (minor k i M))))
        ≡⟨ ·Assoc _ _ _ 
        (M l i · MF (toℕ k +ℕ toℕ i) ·
          (MF (toℕ (predFin l) +ℕ toℕ j) · M (suc (predFin l)) (weakenFin j))
          · det (minor (predFin l) j (minor k i M)))
        ≡⟨ cong
           a  (M l i · MF (toℕ k +ℕ toℕ i) ·
          (MF (toℕ (predFin l) +ℕ toℕ j) · M a (weakenFin j))
          · det (minor (predFin l) j (minor k i M))))
          (sucPredFin
            k
            l
            le
          )
         
         (M l i · MF (toℕ k +ℕ toℕ i) ·
           (MF (toℕ (predFin l) +ℕ toℕ j) · M l (weakenFin j))
           · det (minor (predFin l) j (minor k i M)))
        
        )
      )

  adjugatePropAux1b :  {n : }  (M : FinMatrix R (suc (suc n)) (suc (suc n))) 
    (k l : Fin (suc (suc n)))  toℕ k <' toℕ l 
    
       i 
         
          j 
            (1r + - ind> (toℕ  i) (toℕ j)) ·
            (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) ·
              minor k (weakenFin i) M (predFin l) j
              · det (minor (predFin l) j (minor k (weakenFin i) M))))))
   
   
      i 
        
         z 
           (1r + - ind> (toℕ i) (toℕ z)) ·
           (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
            (MF (toℕ (predFin l)) · (- 1r · MF (toℕ (suc z))) · M l (suc z) ·
             det (minor (predFin l) i (minor k (suc z) M))))))

  adjugatePropAux1b M k l le =
    ∑∑Compat
       i j 
            (1r + - ind> (toℕ  i) (toℕ j)) ·
            (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) ·
              minor k (weakenFin i) M (predFin l) j
              · det (minor (predFin l) j (minor k (weakenFin i) M)))))
       z z₁ 
          (1r + - ind> (toℕ z) (toℕ z₁)) ·
          (M l (weakenFin z) · MF (toℕ k +ℕ toℕ (weakenFin z)) ·
           (MF (toℕ (predFin l)) · (- 1r · MF (toℕ (suc z₁))) · M l (suc z₁) ·
            det (minor (predFin l) z (minor k (suc z₁) M)))))
      λ i j 
        ind>anti
         i j  (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) ·
              minor k (weakenFin i) M (predFin l) j
              · det (minor (predFin l) j (minor k (weakenFin i) M)))))
         z z₁ 
            M l (weakenFin z) · MF (toℕ k +ℕ toℕ (weakenFin z)) ·
            (MF (toℕ (predFin l)) · (- 1r · MF (toℕ (suc z₁))) · M l (suc z₁) ·
             det (minor (predFin l) z (minor k (suc z₁) M))))
         i j lf 
          (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
            (MF (toℕ (predFin l) +ℕ toℕ j) ·
             minor k (weakenFin i) M (predFin l) j
             · det (minor (predFin l) j (minor k (weakenFin i) M))))
          ≡⟨
            cong
             a  M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
            (MF (toℕ (predFin l) +ℕ toℕ j) ·  a
             · det (minor (predFin l) j (minor k (weakenFin i) M))))
            (minorSucSuc
              k (weakenFin i) (predFin l) j M (weakenPredFinLt k l le) (weakenweakenFinLe i j lf))
           
           M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
           (MF (toℕ (predFin l) +ℕ toℕ j) · M (suc (predFin l)) (suc j) ·
           det (minor (predFin l) j (minor k (weakenFin i) M)))
          ≡⟨
            cong
             a 
               M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
           (MF (toℕ (predFin l) +ℕ toℕ j) · M (a) (suc j) ·
           det (minor (predFin l) j (minor k (weakenFin i) M))))
            (sucPredFin k l le)
           
          M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
            (MF (toℕ (predFin l) +ℕ toℕ j) · M l (suc j) ·
             det (minor (predFin l) j (minor k (weakenFin i) M)))
          ≡⟨
            cong
             a   M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
            (MF (toℕ (predFin l) +ℕ toℕ j) · M l (suc j) · a))
            (detComp
              (minor (predFin l) j (minor k (weakenFin i) M))
              (minor (predFin l) i (minor k (suc j) M))
               i₁ j₁ 
                (sym (minorSemiCommR k (predFin l) j i i₁ j₁ M lf))))
            
          M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
            (MF (toℕ (predFin l) +ℕ toℕ j) · M l (suc j) ·
             det (minor (predFin l) i (minor k (suc j) M)))
          ≡⟨ cong
              a 
               M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
                 (a · M l (suc j) ·
                 det (minor (predFin l) i (minor k (suc j) M))))
             (MF-add (toℕ (predFin l)) (toℕ j))
           
          (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
            (MF (toℕ (predFin l)) · MF (toℕ j) · M l (suc j) ·
             det (minor (predFin l) i (minor k (suc j) M))))
          ≡⟨
            cong
             a  (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
            (MF (toℕ (predFin l)) · a · M l (suc j) ·
             det (minor (predFin l) i (minor k (suc j) M)))))
            (MF-suc-rev (toℕ j))
           
          (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
            (MF (toℕ (predFin l)) · (- 1r · MF (toℕ (suc j))) · M l (suc j) ·
             det (minor (predFin l) i (minor k (suc j) M))))
          )
        i
        j

  adjugatePropAux2a :  {n : }  (M : FinMatrix R (suc (suc n)) (suc (suc n))) 
    (k l : Fin (suc (suc n))) 
    toℕ k <' toℕ l 
    
       i 
         
          j 
            ind> (toℕ i) (toℕ j) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) · M l (weakenFin j))
             · det (minor (predFin l) j (minor k i M)))))
   
   
      i 
        
         z 
           1r ·
           (ind> (toℕ i) (toℕ z) ·
            (M l i · (MF (toℕ k) · MF (toℕ i)) ·
             (MF (toℕ (predFin l)) · MF (toℕ z) · M l (weakenFin z) ·
              det (minor (predFin l) z (minor k i M)))))))
  adjugatePropAux2a M k l le =
    ∑∑Compat
      i j 
            ind> (toℕ i) (toℕ j) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) · M l (weakenFin j))
             · det (minor (predFin l) j (minor k i M))))
      z z₁ 
         1r ·
         (ind> (toℕ z) (toℕ z₁) ·
          (M l z · (MF (toℕ k) · MF (toℕ z)) ·
           (MF (toℕ (predFin l)) · MF (toℕ z₁) · M l (weakenFin z₁) ·
            det (minor (predFin l) z₁ (minor k z M))))))
      i j 
       (ind> (toℕ i) (toℕ j) ·
         (M l i · MF (toℕ k +ℕ toℕ i) ·
          (MF (toℕ (predFin l) +ℕ toℕ j) · M l (weakenFin j))
          · det (minor (predFin l) j (minor k i M))))
       ≡⟨
         cong
          a  (ind> (toℕ i) (toℕ j) ·
         (M l i · a ·
          (MF (toℕ (predFin l) +ℕ toℕ j) · M l (weakenFin j))
          · det (minor (predFin l) j (minor k i M)))))
         (MF-add (toℕ k) (toℕ i)) 
       (ind> (toℕ i) (toℕ j) ·
         (M l i · (MF (toℕ k) · MF (toℕ i)) ·
          (MF (toℕ (predFin l) +ℕ toℕ j) · M l (weakenFin j))
          · det (minor (predFin l) j (minor k i M))))
       ≡⟨
         cong
          a  (ind> (toℕ i) (toℕ j) ·
         (M l i · (MF (toℕ k) · MF (toℕ i)) ·
          (a · M l (weakenFin j))
          · det (minor (predFin l) j (minor k i M)))))
         (MF-add (toℕ (predFin l)) (toℕ j))
        
       (ind> (toℕ i) (toℕ j) ·
         (M l i · (MF (toℕ k) · MF (toℕ i)) ·
          (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j))
          · det (minor (predFin l) j (minor k i M))))
       ≡⟨ cong
          a  (ind> (toℕ i) (toℕ j) · a))
         (sym (·Assoc _ _ _))
         
       ind> (toℕ i) (toℕ j) ·
         (M l i · (MF (toℕ k) · MF (toℕ i)) ·
          (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j) ·
           det (minor (predFin l) j (minor k i M))))
       ≡⟨ sym (·IdL _) 
       (1r · (ind> (toℕ i) (toℕ j) ·
         (M l i · (MF (toℕ k) · MF (toℕ i)) ·
          (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j) ·
           det (minor (predFin l) j (minor k i M))))))
        )

  adjugatePropAux2b :  {n : }  (M : FinMatrix R (suc (suc n)) (suc (suc n))) 
    (k l : Fin (suc (suc n))) 
    toℕ k <' toℕ l 
    
       i 
         
          j 
            ind> (toℕ i) (toℕ j) ·
            (M l (weakenFin j) · MF (toℕ k +ℕ toℕ (weakenFin j)) ·
             (MF (toℕ (predFin l)) · (- 1r · MF (toℕ i)) · M l i ·
              det (minor (predFin l) j (minor k i M))))))
   
   
      i 
        
         z 
           - 1r ·
           (ind> (toℕ i) (toℕ z) ·
            (M l i · (MF (toℕ k) · MF (toℕ i)) ·
             (MF (toℕ (predFin l)) · MF (toℕ z) · M l (weakenFin z) ·
              det (minor (predFin l) z (minor k i M)))))))
  adjugatePropAux2b M k l le =
    ∑∑Compat
     i j 
            ind> (toℕ i) (toℕ j) ·
            (M l (weakenFin j) · MF (toℕ k +ℕ toℕ (weakenFin j)) ·
             (MF (toℕ (predFin l)) · (- 1r · MF (toℕ i)) · M l i ·
              det (minor (predFin l) j (minor k i M)))))
     z z₁ 
        - 1r ·
        (ind> (toℕ z) (toℕ z₁) ·
         (M l z · (MF (toℕ k) · MF (toℕ z)) ·
          (MF (toℕ (predFin l)) · MF (toℕ z₁) · M l (weakenFin z₁) ·
           det (minor (predFin l) z₁ (minor k z M))))))
     i j 
      (ind> (toℕ i) (toℕ j) ·
        (M l (weakenFin j) · MF (toℕ k +ℕ toℕ (weakenFin j)) ·
         (MF (toℕ (predFin l)) · (- 1r · MF (toℕ i)) · M l i ·
          det (minor (predFin l) j (minor k i M)))))
      ≡⟨
        cong
         a 
          (ind> (toℕ i) (toℕ j) ·
        (M l (weakenFin j) · a ·
         (MF (toℕ (predFin l)) · (- 1r · MF (toℕ i)) · M l i ·
          det (minor (predFin l) j (minor k i M))))))
        (MF-add (toℕ k) (toℕ (weakenFin j)))
       
      (ind> (toℕ i) (toℕ j) ·
        (M l (weakenFin j) · (MF (toℕ k) · MF (toℕ (weakenFin j))) ·
         (MF (toℕ (predFin l)) · (- 1r · MF (toℕ i)) · M l i ·
          det (minor (predFin l) j (minor k i M)))))
      ≡⟨
        cong
         a 
          (ind> (toℕ i) (toℕ j) ·
        (M l (weakenFin j) · (MF (toℕ k) · MF a) ·
         (MF (toℕ (predFin l)) · (- 1r · MF (toℕ i)) · M l i ·
          det (minor (predFin l) j (minor k i M))))))
        (toℕweakenFin j) 
      (ind> (toℕ i) (toℕ j) ·
        (M l (weakenFin j) · (MF (toℕ k) · MF (toℕ j)) ·
         (MF (toℕ (predFin l)) · (- 1r · MF (toℕ i)) · M l i ·
          det (minor (predFin l) j (minor k i M)))))
      ≡⟨
       cong
        a  ind> (toℕ i) (toℕ j) · a)
       (sym (·Assoc _ _ _))
       
      (ind> (toℕ i) (toℕ j) ·
        (M l (weakenFin j) ·
         (MF (toℕ k) · MF (toℕ j) ·
          (MF (toℕ (predFin l)) · (- 1r · MF (toℕ i)) · M l i ·
           det (minor (predFin l) j (minor k i M))))))
      ≡⟨
        cong
         a 
          ind> (toℕ i) (toℕ j) ·
             (M l (weakenFin j) · a))
        (sym (·Assoc _ _ _))
       
      (ind> (toℕ i) (toℕ j) ·
        (M l (weakenFin j) ·
         (MF (toℕ k) ·
          (MF (toℕ j) ·
           (MF (toℕ (predFin l)) · (- 1r · MF (toℕ i)) · M l i ·
            det (minor (predFin l) j (minor k i M)))))))
      ≡⟨
        cong
         a 
          (ind> (toℕ i) (toℕ j) ·
            (M l (weakenFin j) ·
              (MF (toℕ k) · a))))
        (·Assoc _ _ _)
       
      (ind> (toℕ i) (toℕ j) ·
        (M l (weakenFin j) ·
         (MF (toℕ k) ·
          (MF (toℕ j) · (MF (toℕ (predFin l)) · (- 1r · MF (toℕ i)) · M l i)
           · det (minor (predFin l) j (minor k i M))))))
      ≡⟨
        cong
         a  ind> (toℕ i) (toℕ j) ·
                   (M l (weakenFin j) · a))
        (·Assoc _ _ _)
       
      (ind> (toℕ i) (toℕ j) ·
        (M l (weakenFin j) ·
         (MF (toℕ k) ·
          (MF (toℕ j) · (MF (toℕ (predFin l)) · (- 1r · MF (toℕ i)) · M l i))
          · det (minor (predFin l) j (minor k i M)))))
      ≡⟨ cong
          a  ind> (toℕ i) (toℕ j) · a)
         (·Assoc _ _ _)
        
      (ind> (toℕ i) (toℕ j) ·
        (M l (weakenFin j) ·
         (MF (toℕ k) ·
          (MF (toℕ j) ·
           (MF (toℕ (predFin l)) · (- 1r · MF (toℕ i)) · M l i)))
         · det (minor (predFin l) j (minor k i M))))
      ≡⟨
        cong
         a  ind> (toℕ i) (toℕ j) · (a  · det (minor (predFin l) j (minor k i M))))
        (solve! P')
       
      ind> (toℕ i) (toℕ j) ·
        (- 1r · M l i · (MF (toℕ k) · MF (toℕ i)) ·
          (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j))
         · det (minor (predFin l) j (minor k i M)))
      ≡⟨ ·Assoc _ _ _ 
      (ind> (toℕ i) (toℕ j) ·
        (- 1r · M l i · (MF (toℕ k) · MF (toℕ i)) ·
         (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j)))
        · det (minor (predFin l) j (minor k i M)))
      ≡⟨
        cong
         a  a · det (minor (predFin l) j (minor k i M)))
        (·Assoc _ _ _)
       
      (ind> (toℕ i) (toℕ j) · (- 1r · M l i · (MF (toℕ k) · MF (toℕ i))) ·
        (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j))
        · det (minor (predFin l) j (minor k i M)))
      ≡⟨ cong
         a  a · (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j))
        · det (minor (predFin l) j (minor k i M)))
        (solve! P')
       
      (- 1r) · ind> (toℕ i) (toℕ j) · (M l i · (MF (toℕ k) · MF (toℕ i))) ·
        (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j))
        · det (minor (predFin l) j (minor k i M))
      ≡⟨ sym (·Assoc _ _ _) 
      - 1r · ind> (toℕ i) (toℕ j) · (M l i · (MF (toℕ k) · MF (toℕ i))) ·
        (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j) ·
         det (minor (predFin l) j (minor k i M)))
      ≡⟨ sym (·Assoc _ _ _) 
      (- 1r · ind> (toℕ i) (toℕ j) ·
        (M l i · (MF (toℕ k) · MF (toℕ i)) ·
         (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j) ·
          det (minor (predFin l) j (minor k i M)))))
      ≡⟨  sym (·Assoc _ _ _) 
      - 1r ·
        (ind> (toℕ i) (toℕ j) ·
         (M l i · (MF (toℕ k) · MF (toℕ i)) ·
          (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j) ·
           det (minor (predFin l) j (minor k i M)))))
      )

  adjugatePropRG : {n : }  (M : FinMatrix R (suc n) (suc n)) 
    (k l : Fin (suc n))  toℕ k <' toℕ l 
      i  (M l i · (MF (toℕ k +ℕ toℕ i) · det (minor k i M))))  0r
  adjugatePropRG {zero} M zero zero ()
  adjugatePropRG {zero} M zero (suc ()) (s≤s le)
  adjugatePropRG {suc n} M k l le =
      i  M l i · (MF (toℕ k +ℕ toℕ i) · det (minor k i M)))
    ≡⟨ ∑Compat
       i  M l i · (MF (toℕ k +ℕ toℕ i) · det (minor k i M)))
       i  M l i · MF (toℕ k +ℕ toℕ i) · det (minor k i M))
       i  ·Assoc _ _ _) 
      i  M l i · MF (toℕ k +ℕ toℕ i) · det (minor k i M))
    ≡⟨ ∑Compat
        i  M l i · MF (toℕ k +ℕ toℕ i) · det (minor k i M))
        i  M l i · MF (toℕ k +ℕ toℕ i) · detR (predFin l) (minor k i M))
        i 
         cong
          a  M l i · MF (toℕ k +ℕ toℕ i) · a)
         (sym (DetRow (predFin l) (minor k i M))))
     
    
       i 
         M l i · MF (toℕ k +ℕ toℕ i) · detR (predFin l) (minor k i M))
    ≡⟨ refl 
    
       i 
         M l i · MF (toℕ k +ℕ toℕ i) ·
         
          j 
            MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
            det (minor (predFin l) j (minor k i M))))
    ≡⟨ ∑Compat
        i 
         M l i · MF (toℕ k +ℕ toℕ i) ·
         
          j 
            MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
            det (minor (predFin l) j (minor k i M))))
        i 
         
          j   M l i · MF (toℕ k +ℕ toℕ i) ·
            (MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
            det (minor (predFin l) j (minor k i M)))))
        i  
         ∑DistR
           (M l i · MF (toℕ k +ℕ toℕ i))
            j  MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
            det (minor (predFin l) j (minor k i M))))
     
    
       i 
         
          j 
            M l i · MF (toℕ k +ℕ toℕ i) ·
            (MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
             det (minor (predFin l) j (minor k i M)))))
    ≡⟨ ∑∑Compat
       i j 
            M l i · MF (toℕ k +ℕ toℕ i) ·
            (MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
             det (minor (predFin l) j (minor k i M))))
       z z₁ 
          ind> (toℕ z) (toℕ z₁) ·
          (M l z · MF (toℕ k +ℕ toℕ z) ·
           (MF (toℕ (predFin l) +ℕ toℕ z₁) · minor k z M (predFin l) z₁ ·
            det (minor (predFin l) z₁ (minor k z M))))
          +
          (1r + - ind> (toℕ z) (toℕ z₁)) ·
          (M l z · MF (toℕ k +ℕ toℕ z) ·
           (MF (toℕ (predFin l) +ℕ toℕ z₁) · minor k z M (predFin l) z₁ ·
            det (minor (predFin l) z₁ (minor k z M)))))
       i j 
        distributeOne
        (ind> (toℕ i) (toℕ j))
        (M l i · MF (toℕ k +ℕ toℕ i) ·
          (MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
           det (minor (predFin l) j (minor k i M))))
      )
     
    
       i 
         
          j 
            ind> (toℕ i) (toℕ j) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
              det (minor (predFin l) j (minor k i M))))
            +
            (1r + - ind> (toℕ i) (toℕ j)) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
              det (minor (predFin l) j (minor k i M))))))
    ≡⟨
      ∑∑Split
       i j  ind> (toℕ i) (toℕ j) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
              det (minor (predFin l) j (minor k i M)))))
       i j  (1r + - ind> (toℕ i) (toℕ j)) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
              det (minor (predFin l) j (minor k i M)))))
     
    (
       i 
         
          j 
            ind> (toℕ i) (toℕ j) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
              det (minor (predFin l) j (minor k i M))))))
      +
      
       i 
         
          j 
            (1r + - ind> (toℕ i) (toℕ j)) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
              det (minor (predFin l) j (minor k i M)))))))
    ≡⟨ cong₂ _+_ refl (∑∑ShiftWeak λ i j 
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
              det (minor (predFin l) j (minor k i M))))) 
    
       i 
         
          j 
            ind> (toℕ i) (toℕ j) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
              det (minor (predFin l) j (minor k i M))))))
      +
      
       i 
         
          j 
            (1r + - ind> (toℕ (weakenFin i)) (toℕ j)) ·
            (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) ·
              minor k (weakenFin i) M (predFin l) j
              · det (minor (predFin l) j (minor k (weakenFin i) M))))))
    ≡⟨ cong₂ _+_ refl
      (∑∑Compat
         i j 
            (1r + - ind> (toℕ (weakenFin i)) (toℕ j)) ·
            (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) ·
              minor k (weakenFin i) M (predFin l) j
              · det (minor (predFin l) j (minor k (weakenFin i) M)))))
         z z₁ 
            (1r + - ind> (toℕ z) (toℕ z₁)) ·
            (M l (weakenFin z) · MF (toℕ k +ℕ toℕ (weakenFin z)) ·
             (MF (toℕ (predFin l) +ℕ toℕ z₁) ·
              minor k (weakenFin z) M (predFin l) z₁
              · det (minor (predFin l) z₁ (minor k (weakenFin z) M)))))
         i j 
          cong
           a 
            (1r + - ind> a (toℕ j)) ·
            (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) ·
              minor k (weakenFin i) M (predFin l) j
              · det (minor (predFin l) j (minor k (weakenFin i) M)))))
          (toℕweakenFin i))
        )
     
    (
       i 
         
          j 
            ind> (toℕ i) (toℕ j) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) · minor k i M (predFin l) j ·
              det (minor (predFin l) j (minor k i M))))))
      +
      
       i 
         
          j 
            (1r + - ind> (toℕ i) (toℕ j)) ·
            (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) ·
              minor k (weakenFin i) M (predFin l) j
              · det (minor (predFin l) j (minor k (weakenFin i) M)))))))
    ≡⟨ cong₂ _+_ (adjugatePropAux1a M k l le) (adjugatePropAux1b M k l le) 
    (
       i 
         
          z 
            ind> (toℕ i) (toℕ z) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (predFin l) +ℕ toℕ z) · M l (weakenFin z))
             · det (minor (predFin l) z (minor k i M)))))
      +
      
       i 
         
          z 
            (1r + - ind> (toℕ i) (toℕ z)) ·
            (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
             (MF (toℕ (predFin l)) · (- 1r · MF (toℕ (suc z))) · M l (suc z) ·
              det (minor (predFin l) i (minor k (suc z) M)))))))
    ≡⟨ cong₂ _+_
      refl
      (∑Comm
         i z 
            (1r + - ind> (toℕ i) (toℕ z)) ·
            (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
             (MF (toℕ (predFin l)) · (- 1r · MF (toℕ (suc z))) · M l (suc z) ·
              det (minor (predFin l) i (minor k (suc z) M)))))) 
    (
       i 
         
          z 
            ind> (toℕ i) (toℕ z) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (predFin l) +ℕ toℕ z) · M l (weakenFin z))
             · det (minor (predFin l) z (minor k i M)))))
      +
      
       j 
         
          i 
            (1r + - ind> (toℕ i) (toℕ j)) ·
            (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
             (MF (toℕ (predFin l)) · (- 1r · MF (toℕ (suc j))) · M l (suc j) ·
              det (minor (predFin l) i (minor k (suc j) M)))))))
    ≡⟨ cong₂ _+_ refl
       (∑∑Compat
          j i 
            (1r + - ind> (toℕ i) (toℕ j)) ·
            (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
             (MF (toℕ (predFin l)) · (- 1r · MF (toℕ (suc j))) · M l (suc j) ·
              det (minor (predFin l) i (minor k (suc j) M)))))
          z z₁ 
             ind> (suc (toℕ z)) (toℕ z₁) ·
             (M l (weakenFin z₁) · MF (toℕ k +ℕ toℕ (weakenFin z₁)) ·
              (MF (toℕ (predFin l)) · (- 1r · MF (toℕ (suc z))) · M l (suc z) ·
               det (minor (predFin l) z₁ (minor k (suc z) M)))))
          j i 
           cong
            a  a ·
            (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
             (MF (toℕ (predFin l)) · (- 1r · MF (toℕ (suc j))) · M l (suc j) ·
              det (minor (predFin l) i (minor k (suc j) M)))))
           (sym (ind>Suc (toℕ j) (toℕ i)))
           )) 
    (
       i 
         
          z 
            ind> (toℕ i) (toℕ z) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (predFin l) +ℕ toℕ z) · M l (weakenFin z))
             · det (minor (predFin l) z (minor k i M)))))
      +
      
       i 
         
          z 
            ind> (suc (toℕ i)) (toℕ z) ·
            (M l (weakenFin z) · MF (toℕ k +ℕ toℕ (weakenFin z)) ·
             (MF (toℕ (predFin l)) · (- 1r · MF (toℕ (suc i))) · M l (suc i) ·
              det (minor (predFin l) z (minor k (suc i) M)))))))
    ≡⟨ cong₂ _+_ refl
      (sym (∑∑ShiftSuc
            i z 
            (M l (weakenFin z) · MF (toℕ k +ℕ toℕ (weakenFin z)) ·
             (MF (toℕ (predFin l)) · (- 1r · MF (toℕ i)) · M l i ·
              det (minor (predFin l) z (minor k i M))))))) 
    (
       i 
         
          j 
            ind> (toℕ i) (toℕ j) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (predFin l) +ℕ toℕ j) · M l (weakenFin j))
             · det (minor (predFin l) j (minor k i M)))))
      +
      
       i 
         
          j 
            ind> (toℕ i) (toℕ j) ·
            (M l (weakenFin j) · MF (toℕ k +ℕ toℕ (weakenFin j)) ·
             (MF (toℕ (predFin l)) · (- 1r · MF (toℕ i)) · M l i ·
              det (minor (predFin l) j (minor k i M)))))))
    ≡⟨ cong₂ _+_
      (adjugatePropAux2a M k l le)
      (adjugatePropAux2b M k l le) 
    (
       i 
         
          z 
            1r ·
            (ind> (toℕ i) (toℕ z) ·
            (M l i · (MF (toℕ k) · MF (toℕ i)) ·
             (MF (toℕ (predFin l)) · MF (toℕ z) · M l (weakenFin z) ·
              det (minor (predFin l) z (minor k i M)))))))
      +
      
       i 
         
          z 
            - 1r ·
            (ind> (toℕ i) (toℕ z) ·
             (M l i · (MF (toℕ k) · MF (toℕ i)) ·
              (MF (toℕ (predFin l)) · MF (toℕ z) · M l (weakenFin z) ·
               det (minor (predFin l) z (minor k i M))))))))
     ≡⟨ sym
       (∑∑Split
        i z 
            1r ·
            (ind> (toℕ i) (toℕ z) ·
            (M l i · (MF (toℕ k) · MF (toℕ i)) ·
             (MF (toℕ (predFin l)) · MF (toℕ z) · M l (weakenFin z) ·
              det (minor (predFin l) z (minor k i M))))))
       λ i z 
            - 1r ·
            (ind> (toℕ i) (toℕ z) ·
             (M l i · (MF (toℕ k) · MF (toℕ i)) ·
              (MF (toℕ (predFin l)) · MF (toℕ z) · M l (weakenFin z) ·
               det (minor (predFin l) z (minor k i M))))))
     
     
        i 
          
           j 
             1r ·
             (ind> (toℕ i) (toℕ j) ·
              (M l i · (MF (toℕ k) · MF (toℕ i)) ·
               (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j) ·
                det (minor (predFin l) j (minor k i M)))))
             +
             - 1r ·
             (ind> (toℕ i) (toℕ j) ·
              (M l i · (MF (toℕ k) · MF (toℕ i)) ·
               (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j) ·
                det (minor (predFin l) j (minor k i M)))))))
     ≡⟨ ∑∑Compat
         i j 
             1r ·
             (ind> (toℕ i) (toℕ j) ·
              (M l i · (MF (toℕ k) · MF (toℕ i)) ·
               (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j) ·
                det (minor (predFin l) j (minor k i M)))))
             +
             - 1r ·
             (ind> (toℕ i) (toℕ j) ·
              (M l i · (MF (toℕ k) · MF (toℕ i)) ·
               (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j) ·
                det (minor (predFin l) j (minor k i M))))))
         i j  0r)
         i j 
          (1r ·
            (ind> (toℕ i) (toℕ j) ·
             (M l i · (MF (toℕ k) · MF (toℕ i)) ·
              (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j) ·
               det (minor (predFin l) j (minor k i M)))))
            +
            - 1r ·
            (ind> (toℕ i) (toℕ j) ·
             (M l i · (MF (toℕ k) · MF (toℕ i)) ·
              (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j) ·
               det (minor (predFin l) j (minor k i M))))))
          ≡⟨ sym (·DistL+ 1r (- 1r) (ind> (toℕ i) (toℕ j) ·
                                      (M l i · (MF (toℕ k) · MF (toℕ i)) ·
                                       (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j) ·
                                        det (minor (predFin l) j (minor k i M)))))) 
          ((1r + - 1r) ·
            (ind> (toℕ i) (toℕ j) ·
             (M l i · (MF (toℕ k) · MF (toℕ i)) ·
              (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j) ·
               det (minor (predFin l) j (minor k i M))))))
          ≡⟨ cong
              a  a · (ind> (toℕ i) (toℕ j) ·
             (M l i · (MF (toℕ k) · MF (toℕ i)) ·
              (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j) ·
               det (minor (predFin l) j (minor k i M))))))
             (+InvR 1r)
           
          (0r ·
            (ind> (toℕ i) (toℕ j) ·
             (M l i · (MF (toℕ k) · MF (toℕ i)) ·
              (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j) ·
               det (minor (predFin l) j (minor k i M))))))
          ≡⟨ RingTheory.0LeftAnnihilates (CommRing→Ring P')
                                         (ind> (toℕ i) (toℕ j) ·
                                           (M l i · (MF (toℕ k) · MF (toℕ i)) ·
                                           (MF (toℕ (predFin l)) · MF (toℕ j) · M l (weakenFin j) ·
                                            det (minor (predFin l) j (minor k i M))))) 
          0r
          )
      
       (i : Fin (suc (suc n)))    (j : Fin (suc n))  0r))
     ≡⟨ ∑Compat
        (i : Fin (suc (suc n)))    (j : Fin (suc n))  0r))
        (i : Fin (suc (suc n)))  0r)
        (i : Fin (suc (suc n))) 
         ∑Zero {suc n}  (i : Fin  (suc n))  0r)  (i : Fin  (suc n))  refl)) 
        (i : Fin (suc (suc n)))  0r)
     ≡⟨ ∑Zero  (i : Fin (suc (suc n)))  0r)   (i : Fin (suc (suc n)))  refl) 
     0r
     

  adjugateInvRGcomponent : {n : }  (M : FinMatrix R n n) 
    (k l : Fin n)  toℕ l <' toℕ k 
    (M  adjugate M) k l   (det M  𝟙) k l
  adjugateInvRGcomponent {suc n} M k l le =
      i  M k i · (MF(toℕ l +ℕ toℕ i) · det(minor l i M)) )
    ≡⟨ adjugatePropRG M l k le  
    0r
    ≡⟨ sym (RingTheory.0RightAnnihilates (CommRing→Ring P') (det M)) 
    det M · 0r
    ≡⟨ cong  a  det M · a) (sym (deltaPropSym k l le)) 
    (det M  𝟙) k l
    

  adjugatePropAux3a : {n : }  (M : FinMatrix R (suc (suc n)) (suc (suc n))) 
    (k l : Fin (suc (suc n)))  (le : toℕ l <' toℕ k) 
    
       i 
         
          j 
            ind> (toℕ i) (toℕ j) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
              minor k i M (strengthenFin l le) j
              · det (minor (strengthenFin l le) j (minor k i M))))))
    
    
       i 
         
          z 
            ind> (toℕ i) (toℕ z) ·
            (M l i · (MF (toℕ k) · MF (toℕ i)) ·
             (MF (toℕ l) · MF (toℕ z) · M l (weakenFin z) ·
              det (minor (strengthenFin l le) z (minor k i M))))))
  adjugatePropAux3a M k l le =
    ∑∑Compat
     i j 
         ind> (toℕ i) (toℕ j) ·
          (M l i · MF (toℕ k +ℕ toℕ i) ·
          (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
          minor k i M (strengthenFin l le) j
          · det (minor (strengthenFin l le) j (minor k i M)))))
     z z₁ 
        ind> (toℕ z) (toℕ z₁) ·
        (M l z · (MF (toℕ k) · MF (toℕ z)) ·
         (MF (toℕ l) · MF (toℕ z₁) · M l (weakenFin z₁) ·
          det (minor (strengthenFin l le) z₁ (minor k z M)))))
    (ind>prop
       i j 
          M l i · MF (toℕ k +ℕ toℕ i) ·
          (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
          minor k i M (strengthenFin l le) j
          · det (minor (strengthenFin l le) j (minor k i M))))
       z z₁ 
          M l z · (MF (toℕ k) · MF (toℕ z)) ·
          (MF (toℕ l) · MF (toℕ z₁) · M l (weakenFin z₁) ·
           det (minor (strengthenFin l le) z₁ (minor k z M))))
       i j lf 
        (M l i · MF (toℕ k +ℕ toℕ i) ·
          (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
           minor k i M (strengthenFin l le) j
           · det (minor (strengthenFin l le) j (minor k i M))))
        ≡⟨
          cong
           a 
            M l i · MF (toℕ k +ℕ toℕ i) ·
              (MF (toℕ (strengthenFin l le) +ℕ toℕ j) · a
              · det (minor (strengthenFin l le) j (minor k i M))))
          (minorIdId
            k
            i
            (strengthenFin l le)
            j
            M
            (strengthenFinLt l le)
            lf)
         
        (M l i · MF (toℕ k +ℕ toℕ i) ·
          (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
           M (weakenFin (strengthenFin l le)) (weakenFin j)
           · det (minor (strengthenFin l le) j (minor k i M))))
        ≡⟨
          cong
           a 
            M l i · MF (toℕ k +ℕ toℕ i) ·
              (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
              M a (weakenFin j)
              · det (minor (strengthenFin l le) j (minor k i M))))
          (weakenStrengthenFin l le)
         
        (M l i · MF (toℕ k +ℕ toℕ i) ·
          (MF (toℕ (strengthenFin l le) +ℕ toℕ j) · M l (weakenFin j) ·
           det (minor (strengthenFin l le) j (minor k i M))))
        ≡⟨
         cong
          a  M l i · a ·
                (MF (toℕ (strengthenFin l le) +ℕ toℕ j) · M l (weakenFin j) ·
                det (minor (strengthenFin l le) j (minor k i M))))
         (MF-add (toℕ k) (toℕ i))
         
        (M l i · (MF (toℕ k) · MF (toℕ i)) ·
          (MF (toℕ (strengthenFin l le) +ℕ toℕ j) · M l (weakenFin j) ·
           det (minor (strengthenFin l le) j (minor k i M))))
        ≡⟨
          cong
           a 
            (M l i · (MF (toℕ k) · MF (toℕ i)) ·
            (a · M l (weakenFin j) ·
            det (minor (strengthenFin l le) j (minor k i M)))))
          (MF-add (toℕ (strengthenFin l le)) (toℕ j))
         
        (M l i · (MF (toℕ k) · MF (toℕ i)) ·
          (MF (toℕ (strengthenFin l le)) · MF (toℕ j) · M l (weakenFin j) ·
           det (minor (strengthenFin l le) j (minor k i M))))
        ≡⟨
          cong
           a  M l i · (MF (toℕ k) · MF (toℕ i)) ·
                 (MF a · MF (toℕ j) · M l (weakenFin j) ·
                 det (minor (strengthenFin l le) j (minor k i M))))
          (toℕstrengthenFin l le)
         
        (M l i · (MF (toℕ k) · MF (toℕ i)) ·
          (MF (toℕ l) · MF (toℕ j) · M l (weakenFin j) ·
           det (minor (strengthenFin l le) j (minor k i M))))
        )
      )

  adjugatePropAux3b : {n : }  (M : FinMatrix R (suc (suc n)) (suc (suc n))) 
    (k l : Fin (suc (suc n)))  (le : toℕ l <' toℕ k) 
    
       i 
         
          j 
            (1r + - ind> (toℕ (weakenFin i)) (toℕ j)) ·
            (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
             (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
              minor k (weakenFin i) M (strengthenFin l le) j
              · det (minor (strengthenFin l le) j (minor k (weakenFin i) M))))))
   
   
      i 
        
         z 
           ind> (suc (toℕ z)) (toℕ i) ·
           (M l (weakenFin i) · (MF (toℕ k) · MF (toℕ (weakenFin i))) ·
            (MF (toℕ l) · (- 1r · MF (suc (toℕ z))) · M l (suc z) ·
             det (minor (strengthenFin l le) i (minor k (suc z) M))))))
  adjugatePropAux3b M k l le =
    ∑∑Compat
     i j 
            (1r + - ind> (toℕ (weakenFin i)) (toℕ j)) ·
            (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
             (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
              minor k (weakenFin i) M (strengthenFin l le) j
              · det (minor (strengthenFin l le) j (minor k (weakenFin i) M)))))
     z z₁ 
        ind> (suc (toℕ z₁)) (toℕ z) ·
        (M l (weakenFin z) · (MF (toℕ k) · MF (toℕ (weakenFin z))) ·
         (MF (toℕ l) · (- 1r · MF (suc (toℕ z₁))) · M l (suc z₁) ·
          det (minor (strengthenFin l le) z (minor k (suc z₁) M)))))
     i j 
       (1r + - ind> (toℕ (weakenFin i)) (toℕ j)) ·
         (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
          (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
           minor k (weakenFin i) M (strengthenFin l le) j
           · det (minor (strengthenFin l le) j (minor k (weakenFin i) M))))
       ≡⟨ cong
          a  (1r + - ind> a (toℕ j)) ·
         (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
          (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
           minor k (weakenFin i) M (strengthenFin l le) j
           · det (minor (strengthenFin l le) j (minor k (weakenFin i) M)))))
         (toℕweakenFin i) 
       (1r + - ind> (toℕ i) (toℕ j)) ·
         (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
          (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
           minor k (weakenFin i) M (strengthenFin l le) j
           · det (minor (strengthenFin l le) j (minor k (weakenFin i) M))))
       ≡⟨
         ind>anti
          i j  M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
          (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
           minor k (weakenFin i) M (strengthenFin l le) j
           · det (minor (strengthenFin l le) j (minor k (weakenFin i) M))))
          z z₁ 
             M l (weakenFin z) · (MF (toℕ k) · MF (toℕ (weakenFin z))) ·
             (MF (toℕ l) · (- 1r · MF (suc (toℕ z₁))) · M l (suc z₁) ·
              det (minor (strengthenFin l le) z (minor k (suc z₁) M))))
          i j lf  
           (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
             (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
              minor k (weakenFin i) M (strengthenFin l le) j
              · det (minor (strengthenFin l le) j (minor k (weakenFin i) M))))
           ≡⟨
             cong
              a 
               M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
                 (MF (toℕ (strengthenFin l le) +ℕ toℕ j) · a
                 · det (minor (strengthenFin l le) j (minor k (weakenFin i) M))))
             (minorIdSuc
               k
               (weakenFin i)
               (strengthenFin l le)
               j
               M
               (strengthenFinLt l le)
               (weakenweakenFinLe i j lf))
            
           M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
             (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
              M (weakenFin (strengthenFin l le)) (suc j)
              · det (minor (strengthenFin l le) j (minor k (weakenFin i) M)))
           ≡⟨
             cong
              a 
                M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
                 (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
                 M (weakenFin (strengthenFin l le)) (suc j) · a))
             (detComp
               (minor (strengthenFin l le) j (minor k (weakenFin i) M))
               (minor (strengthenFin l le) i (minor k (suc j) M))
                i₁ j₁  sym
                   (minorSemiCommR k (strengthenFin l le) j i i₁ j₁ M lf) )
             )
            
           (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
             (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
              M (weakenFin (strengthenFin l le)) (suc j)
              · det (minor (strengthenFin l le) i (minor k (suc j) M))))
           ≡⟨
             cong
              a 
               M l (weakenFin i) · a ·
                 (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
                 M (weakenFin (strengthenFin l le)) (suc j)
                 · det (minor (strengthenFin l le) i (minor k (suc j) M))))
             (MF-add (toℕ k) (toℕ (weakenFin i)))
            
           (M l (weakenFin i) · (MF (toℕ k) · MF (toℕ (weakenFin i))) ·
             (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
              M (weakenFin (strengthenFin l le)) (suc j)
              · det (minor (strengthenFin l le) i (minor k (suc j) M))))
           ≡⟨ cong
               a  M l (weakenFin i) · (MF (toℕ k) · MF (toℕ (weakenFin i))) ·
               (a · M (weakenFin (strengthenFin l le)) (suc j)
               · det (minor (strengthenFin l le) i (minor k (suc j) M))))
              (MF-add (toℕ (strengthenFin l le)) (toℕ j))
            
           (M l (weakenFin i) · (MF (toℕ k) · MF (toℕ (weakenFin i))) ·
             (MF (toℕ (strengthenFin l le)) · MF (toℕ j) ·
              M (weakenFin (strengthenFin l le)) (suc j)
              · det (minor (strengthenFin l le) i (minor k (suc j) M))))
           ≡⟨
             cong
              a 
               M l (weakenFin i) · (MF (toℕ k) · MF (toℕ (weakenFin i))) ·
             (MF a · MF (toℕ j) ·
              M (weakenFin (strengthenFin l le)) (suc j)
              · det (minor (strengthenFin l le) i (minor k (suc j) M))))
             (toℕstrengthenFin l le)
            
           (M l (weakenFin i) · (MF (toℕ k) · MF (toℕ (weakenFin i))) ·
             (MF (toℕ l) · MF (toℕ j) · M (weakenFin (strengthenFin l le)) (suc j)
              · det (minor (strengthenFin l le) i (minor k (suc j) M))))
           ≡⟨
             cong
              a 
               M l (weakenFin i) · (MF (toℕ k) · MF (toℕ (weakenFin i))) ·
                 (MF (toℕ l) · a · M (weakenFin (strengthenFin l le)) (suc j)
                 · det (minor (strengthenFin l le) i (minor k (suc j) M))))
             (MF-suc-rev (toℕ j))
            
           (M l (weakenFin i) · (MF (toℕ k) · MF (toℕ (weakenFin i))) ·
             (MF (toℕ l) · (- 1r · MF (suc (toℕ j))) ·
              M (weakenFin (strengthenFin l le)) (suc j)
              · det (minor (strengthenFin l le) i (minor k (suc j) M))))
           ≡⟨ cong
              a 
               M l (weakenFin i) · (MF (toℕ k) · MF (toℕ (weakenFin i))) ·
             (MF (toℕ l) · (- 1r · MF (suc (toℕ j))) ·
              M a (suc j)
              · det (minor (strengthenFin l le) i (minor k (suc j) M))))
             (weakenStrengthenFin l le)
            
           (M l (weakenFin i) · (MF (toℕ k) · MF (toℕ (weakenFin i))) ·
             (MF (toℕ l) · (- 1r · MF (suc (toℕ j))) · M l (suc j) ·
              det (minor (strengthenFin l le) i (minor k (suc j) M))))
           )
         i
         j
        
       (1r + - ind> (toℕ i) (toℕ j)) ·
         (M l (weakenFin i) · (MF (toℕ k) · MF (toℕ (weakenFin i))) ·
          (MF (toℕ l) · (- 1r · MF (suc (toℕ j))) · M l (suc j) ·
           det (minor (strengthenFin l le) i (minor k (suc j) M))))
       ≡⟨
         cong
          a 
           a ·
         (M l (weakenFin i) · (MF (toℕ k) · MF (toℕ (weakenFin i))) ·
          (MF (toℕ l) · (- 1r · MF (suc (toℕ j))) · M l (suc j) ·
           det (minor (strengthenFin l le) i (minor k (suc j) M)))))
         (sym (ind>Suc (toℕ j) (toℕ i)))
        
       (ind> (suc (toℕ j)) (toℕ i) ·
         (M l (weakenFin i) · (MF (toℕ k) · MF (toℕ (weakenFin i))) ·
          (MF (toℕ l) · (- 1r · MF (suc (toℕ j))) · M l (suc j) ·
           det (minor (strengthenFin l le) i (minor k (suc j) M)))))
       )

  adjugatePropAux4a : {n : }  (M : FinMatrix R (suc (suc n)) (suc (suc n))) 
    (k l : Fin (suc (suc n)))  (le : toℕ l <' toℕ k) 
     
       i 
         
          j 
            ind> (toℕ i) (toℕ j) ·
            (M l i · (MF (toℕ k) · MF (toℕ i)) ·
             (MF (toℕ l) · MF (toℕ j) · M l (weakenFin j) ·
              det (minor (strengthenFin l le) j (minor k i M))))))
     
     
        i 
          
           z 
             ind> (toℕ i) (toℕ z) ·
             (1r ·
              (M l i · (MF (toℕ k) · MF (toℕ z)) ·
               (MF (toℕ l) · MF (toℕ i) · M l (weakenFin z)))
              · det (minor (strengthenFin l le) z (minor k i M)))))
  adjugatePropAux4a M k l le =
    ∑∑Compat
     i j 
      ind> (toℕ i) (toℕ j) ·
      (M l i · (MF (toℕ k) · MF (toℕ i)) ·
      (MF (toℕ l) · MF (toℕ j) · M l (weakenFin j) ·
      det (minor (strengthenFin l le) j (minor k i M)))))
     z z₁ 
        ind> (toℕ z) (toℕ z₁) ·
        (1r ·
         (M l z · (MF (toℕ k) · MF (toℕ z₁)) ·
          (MF (toℕ l) · MF (toℕ z) · M l (weakenFin z₁)))
         · det (minor (strengthenFin l le) z₁ (minor k z M))))
     i j 
      (ind> (toℕ i) (toℕ j) ·
        (M l i · (MF (toℕ k) · MF (toℕ i)) ·
         (MF (toℕ l) · MF (toℕ j) · M l (weakenFin j) ·
          det (minor (strengthenFin l le) j (minor k i M)))))
      ≡⟨
        cong
         a 
          ind> (toℕ i) (toℕ j) · a)
        (·Assoc _ _ _)
       
      (ind> (toℕ i) (toℕ j) ·
        (M l i · (MF (toℕ k) · MF (toℕ i)) ·
         (MF (toℕ l) · MF (toℕ j) · M l (weakenFin j))
         · det (minor (strengthenFin l le) j (minor k i M))))
      ≡⟨
        cong
         a 
           ind> (toℕ i) (toℕ j) ·
            (a · det (minor (strengthenFin l le) j (minor k i M))))
        (solve! P')
       
      (ind> (toℕ i) (toℕ j) ·
        ( 1r ·
         ( M l i · (MF (toℕ k) · MF (toℕ j)) ·
          (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j))) ·
           det (minor (strengthenFin l le) j (minor k i M))))
      )

  adjugatePropAux4b : {n : }  (M : FinMatrix R (suc (suc n)) (suc (suc n))) 
    (k l : Fin (suc (suc n)))  (le : toℕ l <' toℕ k) 
    
       i 
         
          j 
            ind> (toℕ i) (toℕ j) ·
            (M l (weakenFin j) · (MF (toℕ k) · MF (toℕ (weakenFin j))) ·
             (MF (toℕ l) · (- 1r · MF (toℕ i)) · M l i ·
              det (minor (strengthenFin l le) j (minor k i M))))))
    
    
       i 
         
          z 
            ind> (toℕ i) (toℕ z) ·
            (- 1r ·
             (M l i · (MF (toℕ k) · MF (toℕ z)) ·
              (MF (toℕ l) · MF (toℕ i) · M l (weakenFin z)))
             · det (minor (strengthenFin l le) z (minor k i M)))))
  adjugatePropAux4b M k l le =
    ∑∑Compat
     i j 
      ind> (toℕ i) (toℕ j) ·
      (M l (weakenFin j) · (MF (toℕ k) · MF (toℕ (weakenFin j))) ·
      (MF (toℕ l) · (- 1r · MF (toℕ i)) · M l i ·
      det (minor (strengthenFin l le) j (minor k i M)))))
     z z₁ 
        ind> (toℕ z) (toℕ z₁) ·
        (- 1r ·
         (M l z · (MF (toℕ k) · MF (toℕ z₁)) ·
          (MF (toℕ l) · MF (toℕ z) · M l (weakenFin z₁)))
         · det (minor (strengthenFin l le) z₁ (minor k z M))))
     i j 
      (ind> (toℕ i) (toℕ j) ·
        (M l (weakenFin j) · (MF (toℕ k) · MF (toℕ (weakenFin j))) ·
         (MF (toℕ l) · (- 1r · MF (toℕ i)) · M l i ·
          det (minor (strengthenFin l le) j (minor k i M)))))
      ≡⟨
        cong
         a 
          ind> (toℕ i) (toℕ j) ·
          (M l (weakenFin j) · (MF (toℕ k) · MF a) ·
          (MF (toℕ l) · (- 1r · MF (toℕ i)) · M l i ·
          det (minor (strengthenFin l le) j (minor k i M)))))
        (toℕweakenFin j)
       
      ind> (toℕ i) (toℕ j) ·
        (M l (weakenFin j) · (MF (toℕ k) · MF (toℕ j)) ·
         (MF (toℕ l) · (- 1r · MF (toℕ i)) · M l i ·
          det (minor (strengthenFin l le) j (minor k i M))))
      ≡⟨ cong
         a  ind> (toℕ i) (toℕ j) · a)
        (·Assoc _ _ _)
       
      ind> (toℕ i) (toℕ j) ·
        (M l (weakenFin j) · (MF (toℕ k) · MF (toℕ j)) ·
         (MF (toℕ l) · (- 1r · MF (toℕ i)) · M l i)
         · det (minor (strengthenFin l le) j (minor k i M)))
      ≡⟨
        cong
         a  ind> (toℕ i) (toℕ j) · (a
         · det (minor (strengthenFin l le) j (minor k i M))))
        (solve! P')
       
      ind> (toℕ i) (toℕ j) ·
      ((- 1r) ·( M l (weakenFin j) · (MF (toℕ k) · MF (toℕ j)) ·
      (MF (toℕ l) · MF (toℕ i) · M l i))
      · det (minor (strengthenFin l le) j (minor k i M)))
      ≡⟨ cong
         a   ind> (toℕ i) (toℕ j) ·
        ((- 1r) · a
        · det (minor (strengthenFin l le) j (minor k i M))))
        (solve! P')
      
      ind> (toℕ i) (toℕ j) ·
        ((- 1r) ·
         ( M l i · (MF (toℕ k) · MF (toℕ j)) ·
          (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j))) ·
           det (minor (strengthenFin l le) j (minor k i M)))
      )

  adjugatePropRL : {n : }  (M : FinMatrix R (suc n) (suc n)) 
    (k l : Fin (suc n))  toℕ l <' toℕ k 
      i  (M l i · (MF (toℕ k +ℕ toℕ i) · det (minor k i M))))  0r
  adjugatePropRL {zero} M zero zero ()
  adjugatePropRL {zero} M (suc ()) zero (s≤s le)
  adjugatePropRL {suc n} M k l le =
       i  M l i · (MF (toℕ k +ℕ toℕ i) · det (minor k i M)))
    ≡⟨ ∑Compat
        i  M l i · (MF (toℕ k +ℕ toℕ i) · det (minor k i M)))
        i  M l i · MF (toℕ k +ℕ toℕ i) · det (minor k i M))
        i  ·Assoc _ _ _)
      
      i  M l i · MF (toℕ k +ℕ toℕ i) · det (minor k i M))
    ≡⟨ ∑Compat
        i  M l i · MF (toℕ k +ℕ toℕ i) · det (minor k i M))
        i  M l i · MF (toℕ k +ℕ toℕ i) · detR (strengthenFin l le) (minor k i M))
        i 
         cong
          a  M l i · MF (toℕ k +ℕ toℕ i) · a)
         (sym (DetRow  (strengthenFin l le) (minor k i M)))) 
    
       i 
         M l i · MF (toℕ k +ℕ toℕ i) ·
         detR (strengthenFin l le) (minor k i M))
    ≡⟨ refl 
    
       i 
         M l i · MF (toℕ k +ℕ toℕ i) ·
         
          j 
            MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
            minor k i M (strengthenFin l le) j
            · det (minor (strengthenFin l le) j (minor k i M))))
    ≡⟨ ∑Compat
       i 
         M l i · MF (toℕ k +ℕ toℕ i) ·
         
          j 
            MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
            minor k i M (strengthenFin l le) j
            · det (minor (strengthenFin l le) j (minor k i M))))
       i 
         
          j   M l i · MF (toℕ k +ℕ toℕ i) ·
            (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
            minor k i M (strengthenFin l le) j
            · det (minor (strengthenFin l le) j (minor k i M)))))
       i 
        ∑DistR
          (M l i · MF (toℕ k +ℕ toℕ i))
          (  j 
            MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
            minor k i M (strengthenFin l le) j
            · det (minor (strengthenFin l le) j (minor k i M)))))
     
    
       i 
         
          j 
            M l i · MF (toℕ k +ℕ toℕ i) ·
            (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
             minor k i M (strengthenFin l le) j
             · det (minor (strengthenFin l le) j (minor k i M)))))
    ≡⟨ ∑∑Compat
       i j 
            M l i · MF (toℕ k +ℕ toℕ i) ·
            (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
             minor k i M (strengthenFin l le) j
             · det (minor (strengthenFin l le) j (minor k i M))))
       i j 
          ind> (toℕ i) (toℕ j) ·
          (M l i · MF (toℕ k +ℕ toℕ i) ·
           (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
            minor k i M (strengthenFin l le) j
            · det (minor (strengthenFin l le) j (minor k i M))))
          +
          (1r + - ind> (toℕ i) (toℕ j)) ·
          (M l i · MF (toℕ k +ℕ toℕ i) ·
           (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
            minor k i M (strengthenFin l le) j
            · det (minor (strengthenFin l le) j (minor k i M)))))
       i j 
        distributeOne
        (ind> (toℕ i) (toℕ j))
        ( M l i · MF (toℕ k +ℕ toℕ i) ·
            (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
             minor k i M (strengthenFin l le) j
             · det (minor (strengthenFin l le) j (minor k i M))))
      )
     
    
       i 
         
          j 
            ind> (toℕ i) (toℕ j) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
              minor k i M (strengthenFin l le) j
              · det (minor (strengthenFin l le) j (minor k i M))))
            +
            (1r + - ind> (toℕ i) (toℕ j)) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
              minor k i M (strengthenFin l le) j
              · det (minor (strengthenFin l le) j (minor k i M))))))
    ≡⟨ ∑∑Split
        i j 
            ind> (toℕ i) (toℕ j) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
              minor k i M (strengthenFin l le) j
              · det (minor (strengthenFin l le) j (minor k i M)))))
        i j 
            (1r + - ind> (toℕ i) (toℕ j)) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
              minor k i M (strengthenFin l le) j
              · det (minor (strengthenFin l le) j (minor k i M))))) 
    
       i 
         
          j 
            ind> (toℕ i) (toℕ j) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
              minor k i M (strengthenFin l le) j
              · det (minor (strengthenFin l le) j (minor k i M))))))
     +
     
       i 
         
          j 
            (1r + - ind> (toℕ i) (toℕ j)) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
              minor k i M (strengthenFin l le) j
              · det (minor (strengthenFin l le) j (minor k i M))))))
    ≡⟨ cong₂ _+_ refl (∑∑ShiftWeak  i  j 
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
              minor k i M (strengthenFin l le) j
              · det (minor (strengthenFin l le) j (minor k i M)))))) 
    (
       i 
         
          j 
            ind> (toℕ i) (toℕ j) ·
            (M l i · MF (toℕ k +ℕ toℕ i) ·
             (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
              minor k i M (strengthenFin l le) j
              · det (minor (strengthenFin l le) j (minor k i M))))))
      +
      
       i 
         
          j 
            (1r + - ind> (toℕ (weakenFin i)) (toℕ j)) ·
            (M l (weakenFin i) · MF (toℕ k +ℕ toℕ (weakenFin i)) ·
             (MF (toℕ (strengthenFin l le) +ℕ toℕ j) ·
              minor k (weakenFin i) M (strengthenFin l le) j
              · det (minor (strengthenFin l le) j (minor k (weakenFin i) M)))))))
    ≡⟨ cong₂ _+_ (adjugatePropAux3a M k l le) (adjugatePropAux3b M k l le) 
    
       i 
         
          z 
            ind> (toℕ i) (toℕ z) ·
            (M l i · (MF (toℕ k) · MF (toℕ i)) ·
             (MF (toℕ l) · MF (toℕ z) · M l (weakenFin z) ·
              det (minor (strengthenFin l le) z (minor k i M))))))
      +
      
         i 
           
            z 
              ind> (suc (toℕ z)) (toℕ i) ·
              (M l (weakenFin i) · (MF (toℕ k) · MF (toℕ (weakenFin i))) ·
               (MF (toℕ l) · (- 1r · MF (suc (toℕ z))) · M l (suc z) ·
                det (minor (strengthenFin l le) i (minor k (suc z) M))))))
    ≡⟨ cong₂ _+_
       refl
       (∑Comm  i z 
              ind> (suc (toℕ z)) (toℕ i) ·
              (M l (weakenFin i) · (MF (toℕ k) · MF (toℕ (weakenFin i))) ·
               (MF (toℕ l) · (- 1r · MF (suc (toℕ z))) · M l (suc z) ·
                det (minor (strengthenFin l le) i (minor k (suc z) M)))))) 
    (
       i 
         
          z 
            ind> (toℕ i) (toℕ z) ·
            (M l i · (MF (toℕ k) · MF (toℕ i)) ·
             (MF (toℕ l) · MF (toℕ z) · M l (weakenFin z) ·
              det (minor (strengthenFin l le) z (minor k i M))))))
      +
      
       j 
         
          i 
            ind> (suc (toℕ j)) (toℕ i) ·
            (M l (weakenFin i) · (MF (toℕ k) · MF (toℕ (weakenFin i))) ·
             (MF (toℕ l) · (- 1r · MF (suc (toℕ j))) · M l (suc j) ·
              det (minor (strengthenFin l le) i (minor k (suc j) M)))))))
    ≡⟨
      cong₂ _+_
      refl
      (sym
        (∑∑ShiftSuc
        λ j i 
            (M l (weakenFin i) · (MF (toℕ k) · MF (toℕ (weakenFin i))) ·
             (MF (toℕ l) · (- 1r · MF (toℕ j)) · M l j ·
              det (minor (strengthenFin l le) i (minor k j M))))))
     
    
       i 
         
          j 
            ind> (toℕ i) (toℕ j) ·
            (M l i · (MF (toℕ k) · MF (toℕ i)) ·
             (MF (toℕ l) · MF (toℕ j) · M l (weakenFin j) ·
              det (minor (strengthenFin l le) j (minor k i M))))))
     +
     
       i 
         
          j 
            ind> (toℕ i) (toℕ j) ·
            (M l (weakenFin j) · (MF (toℕ k) · MF (toℕ (weakenFin j))) ·
             (MF (toℕ l) · (- 1r · MF (toℕ i)) · M l i ·
              det (minor (strengthenFin l le) j (minor k i M))))))
    ≡⟨ cong₂ _+_ (adjugatePropAux4a M k l le) (adjugatePropAux4b M k l le) 
    
       i 
         
          z 
            ind> (toℕ i) (toℕ z) ·
            (1r ·
             (M l i · (MF (toℕ k) · MF (toℕ z)) ·
              (MF (toℕ l) · MF (toℕ i) · M l (weakenFin z)))
             · det (minor (strengthenFin l le) z (minor k i M)))))
      +
      
       i 
         
          z 
            ind> (toℕ i) (toℕ z) ·
            (- 1r ·
             (M l i · (MF (toℕ k) · MF (toℕ z)) ·
              (MF (toℕ l) · MF (toℕ i) · M l (weakenFin z)))
             · det (minor (strengthenFin l le) z (minor k i M)))))
     ≡⟨
       sym
       (∑∑Split
          i z 
            ind> (toℕ i) (toℕ z) ·
            (1r ·
             (M l i · (MF (toℕ k) · MF (toℕ z)) ·
              (MF (toℕ l) · MF (toℕ i) · M l (weakenFin z)))
             · det (minor (strengthenFin l le) z (minor k i M))))
         λ i z 
            ind> (toℕ i) (toℕ z) ·
            (- 1r ·
             (M l i · (MF (toℕ k) · MF (toℕ z)) ·
              (MF (toℕ l) · MF (toℕ i) · M l (weakenFin z)))
             · det (minor (strengthenFin l le) z (minor k i M))))
      
    
       i 
         
          j 
            ind> (toℕ i) (toℕ j) ·
            (1r ·
             (M l i · (MF (toℕ k) · MF (toℕ j)) ·
              (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j)))
             · det (minor (strengthenFin l le) j (minor k i M)))
            +
            ind> (toℕ i) (toℕ j) ·
            (- 1r ·
             (M l i · (MF (toℕ k) · MF (toℕ j)) ·
              (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j)))
             · det (minor (strengthenFin l le) j (minor k i M)))))
     ≡⟨
       ∑∑Compat
        i j 
            ind> (toℕ i) (toℕ j) ·
            (1r ·
             (M l i · (MF (toℕ k) · MF (toℕ j)) ·
              (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j)))
             · det (minor (strengthenFin l le) j (minor k i M)))
            +
            ind> (toℕ i) (toℕ j) ·
            (- 1r ·
             (M l i · (MF (toℕ k) · MF (toℕ j)) ·
              (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j)))
             · det (minor (strengthenFin l le) j (minor k i M))))
        _ _  0r)
        i j 
         (ind> (toℕ i) (toℕ j) ·
           (1r ·
            (M l i · (MF (toℕ k) · MF (toℕ j)) ·
             (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j)))
            · det (minor (strengthenFin l le) j (minor k i M)))
           +
           ind> (toℕ i) (toℕ j) ·
           (- 1r ·
            (M l i · (MF (toℕ k) · MF (toℕ j)) ·
             (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j)))
            · det (minor (strengthenFin l le) j (minor k i M))))
         ≡⟨ sym
           (·DistR+
             (ind> (toℕ i) (toℕ j))
             (1r ·
               (M l i · (MF (toℕ k) · MF (toℕ j)) ·
               (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j)))
               · det (minor (strengthenFin l le) j (minor k i M)))
             (- 1r · (M l i · (MF (toℕ k) · MF (toℕ j)) ·
               (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j)))
               · det (minor (strengthenFin l le) j (minor k i M)))) 
         (ind> (toℕ i) (toℕ j) ·
           (1r ·
            (M l i · (MF (toℕ k) · MF (toℕ j)) ·
             (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j)))
            · det (minor (strengthenFin l le) j (minor k i M))
            +
            - 1r ·
            (M l i · (MF (toℕ k) · MF (toℕ j)) ·
             (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j)))
            · det (minor (strengthenFin l le) j (minor k i M)))
           )
         ≡⟨
           cong
            a  ind> (toℕ i) (toℕ j) · a)
           (sym
             (·DistL+
             (1r ·
            (M l i · (MF (toℕ k) · MF (toℕ j)) ·
             (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j))))
             ( - 1r ·
            (M l i · (MF (toℕ k) · MF (toℕ j)) ·
             (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j))))
             (det (minor (strengthenFin l le) j (minor k i M)))))
          
         (ind> (toℕ i) (toℕ j) ·
           ((1r ·
             (M l i · (MF (toℕ k) · MF (toℕ j)) ·
              (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j)))
             +
             - 1r ·
             (M l i · (MF (toℕ k) · MF (toℕ j)) ·
              (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j))))
            · det (minor (strengthenFin l le) j (minor k i M))))
         ≡⟨
           cong
            a 
             ind> (toℕ i) (toℕ j) · (a ·
              det (minor (strengthenFin l le) j (minor k i M))))
           (sym
             (·DistL+
             1r
             (- 1r)
             (M l i · (MF (toℕ k) · MF (toℕ j)) ·
               (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j)))))
          
         (ind> (toℕ i) (toℕ j) ·
           ((1r + - 1r) ·
            (M l i · (MF (toℕ k) · MF (toℕ j)) ·
             (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j)))
            · det (minor (strengthenFin l le) j (minor k i M))))
          ≡⟨ cong
             a  (ind> (toℕ i) (toℕ j) ·
                    (a · (M l i · (MF (toℕ k) · MF (toℕ j)) ·
                    (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j)))
                    · det (minor (strengthenFin l le) j (minor k i M)))))
            (+InvR 1r)
           
          (ind> (toℕ i) (toℕ j) ·
            (0r ·
             (M l i · (MF (toℕ k) · MF (toℕ j)) ·
              (MF (toℕ l) · MF (toℕ i) · M l (weakenFin j)))
             · det (minor (strengthenFin l le) j (minor k i M))))
          ≡⟨
            cong
             a  (ind> (toℕ i) (toℕ j) ·
            (a · det (minor (strengthenFin l le) j (minor k i M)))))
            (solve! P')
           
          (ind> (toℕ i) (toℕ j) ·
            (0r · det (minor (strengthenFin l le) j (minor k i M))))
          ≡⟨ cong
             a  ind> (toℕ i) (toℕ j) · a)
            (RingTheory.0LeftAnnihilates
              (CommRing→Ring P')
              (det (minor (strengthenFin l le) j (minor k i M)))) 
          (ind> (toℕ i) (toℕ j) · 0r)
          ≡⟨ solve! P' 
          0r
         )
       (i : Fin (suc (suc n)))    (j : Fin (suc n))  0r))
     ≡⟨ ∑Zero
        (i : Fin (suc (suc n)))    (j : Fin (suc n))  0r))
        i  ∑Zero  (j : Fin (suc n))  0r)  (j : Fin (suc n))  refl)) 
    0r
    

  adjugateInvRLcomponent : {n : }  (M : FinMatrix R n n) 
    (k l : Fin n)  toℕ k <' toℕ l 
    (M  adjugate M) k l   (det M  𝟙) k l
  adjugateInvRLcomponent {suc n} M k l le =
      i  M k i · (MF(toℕ l +ℕ toℕ i) · det(minor l i M)) )
    ≡⟨ adjugatePropRL M l k le  
    0r
    ≡⟨ sym (RingTheory.0RightAnnihilates (CommRing→Ring P') (det M)) 
    det M · 0r
    ≡⟨ cong  a  det M · a) (sym (deltaProp k l le)) 
    (det M  𝟙) k l
    

  -- The adjugate matrix divided by the determinant is the right inverse.
  -- Component-wise version
  adjugateInvRComp : {n : }  (M : FinMatrix R n n)  (k l : Fin n)  
    (M  adjugate M) k l   (det M  𝟙) k l
  adjugateInvRComp {zero} M () ()
  adjugateInvRComp {suc n} M k l  with k ≟Fin l
  ... | (eq k=l) =
    (  i  M k i · (MF(toℕ l +ℕ toℕ i) · det(minor l i M)) )
     ≡⟨
       ∑Compat
        i  M k i · (MF(toℕ l +ℕ toℕ i) · det(minor l i M)))
        i  M k i · MF(toℕ l +ℕ toℕ i) · det(minor l i M))
        i  ·Assoc _ _ _)
       
       i  M k i · MF (toℕ l +ℕ toℕ i) · det (minor l i M))
     ≡⟨
       ∑Compat
        i  M k i · MF (toℕ l +ℕ toℕ i) · det (minor l i M))
        i  M l i · MF (toℕ l +ℕ toℕ i) · det (minor l i M))
        i  cong
               a  M a i · MF (toℕ l +ℕ toℕ i) · det (minor l i M))
              k=l )
      
       i  M l i · MF (toℕ l +ℕ toℕ i) · det (minor l i M))
     ≡⟨  ∑Compat
            i  M l i · MF (toℕ l +ℕ toℕ i) · det (minor l i M))
            i  MF (toℕ l +ℕ toℕ i) · M l i · det (minor l i M))
            i  cong
               a  a · det (minor l i M))
              (CommRingStr.·Comm (snd P') (M l i) (MF (toℕ l +ℕ toℕ i))) ) 
     detR l M
     ≡⟨ DetRow l M 
     det M
     ≡⟨ sym (·IdR (det M)) 
     (det M · 1r)
     ≡⟨ cong  a   det M · a) (sym (deltaPropEq k l (k=l)))
     (det M  𝟙) k l
     )
  ... | lt k<l = adjugateInvRLcomponent M k l (subst x  suc (toℕ k) ≤' x)(weakenRespToℕ l)k<l)
  ... | gt l<k = adjugateInvRGcomponent M k l (subst x  suc (toℕ l) ≤' x)(weakenRespToℕ k)l<k)

  -- The adjugate matrix divided by the determinant is the left inverse.
  -- Component-wise version
  adjugateInvLComp : {n : }  (M : FinMatrix R n n)  (k l : Fin n)  
    (adjugate M  M) k l   (det M  𝟙) k l
  adjugateInvLComp M k l =
    (adjugate M  M) k l
    ≡⟨ refl 
      i  adjugate M k i · (M ) l i)
    ≡⟨
      ∑Compat
       i  adjugate M k i · (M ) l i)
       i  adjugate (M ) i k · (M ) l i)
       i  cong  a  a · (M ) l i) (sym (adjugateTransp M i k)))
     
      i  adjugate (M ) i k · (M ) l i)
    ≡⟨
      ∑Compat
       i  adjugate (M ) i k · (M ) l i)
       z  (snd P' CommRingStr.· (M ) l z) (adjugate (M ) z k))
       i  CommRingStr.·Comm (snd P') (adjugate (M ) i k) ((M ) l i))
     
      i  (M ) l i · adjugate (M ) i k )
    ≡⟨ adjugateInvRComp (M ) l k 
    (det (M )  𝟙) l k
    ≡⟨ cong  a  (a  𝟙) l k) (sym (detTransp M)) 
    det M · δ l k
    ≡⟨ cong  a  det M · a) (deltaComm l k) 
    (det M · 𝟙 k l)
    

  -- The adjugate matrix divided by the determinant is the right inverse.
  adjugateInvR : {n : }  (M : FinMatrix R n n)   M  adjugate M   det M  𝟙
  adjugateInvR M = funExt₂  k l   adjugateInvRComp M k l)

  -- The adjugate matrix divided by the determinant is the left inverse.
  adjugateInvL : {n : }  (M : FinMatrix R n n)   adjugate M  M   det M  𝟙
  adjugateInvL M = funExt₂  k l   adjugateInvLComp M k l)