Basic facts about matrices (over commutative ring) and the determinant.
The (n by n) matrices form ring  (see matrix-ring_wf).
The determinant satisfies |AB| |A|*|B| (see det-times).

The determinant is defined using the "Liebnitz" form matrix-det,
but we prove the "Laplace" formula for expanding determinant by minors
(see matrix-det-is-determinant)

Matrix is invertible iff |A| is invertible in the ring 
(invertible-matrix-iff-det)
and inverses are unique 
 (invertible-matrix-iff-leftinverse-unique).

When |A| is invertible in the ring then we have Cramer's rule
(Cramers-rule).⋅

Definition: rng_lsum
Σ{r} x ∈ as. f[x] ==  reduce(+r;0;map(λx.f[x];as))

Lemma: rng_lsum_wf
[r:Rng]. ∀[A:Type]. ∀[f:A ⟶ |r|]. ∀[as:A List].  {r} x ∈ as. f[x] ∈ |r|)

Lemma: rng_lsum_nil_lemma
f,r:Top.  {r} x ∈ []. f[x] 0)

Lemma: rng_lsum_cons_lemma
f,v,u,r:Top.  {r} x ∈ [u v]. f[x] f[u] +r Σ{r} x ∈ v. f[x])

Lemma: rng_lsum_functionality_wrt_permutation
[r:Rng]. ∀[A:Type]. ∀[f:A ⟶ |r|]. ∀[as,bs:A List].
  Σ{r} x ∈ as. f[x] = Σ{r} x ∈ bs. f[x] ∈ |r| supposing permutation(A;as;bs)

Lemma: rng_minus_lsum
r:Rng. ∀A:Type. ∀as:A List. ∀f:A ⟶ |r|.  ((-r Σ{r} x ∈ as. f[x]) = Σ{r} x ∈ as. (-r f[x]) ∈ |r|)

Lemma: rng_lsum_0
r:Rng. ∀A:Type. ∀as:A List.  {r} x ∈ as. 0 ∈ |r|)

Lemma: rng_lsum_plus
[r:Rng]. ∀[A:Type]. ∀[f,g:A ⟶ |r|]. ∀[as:A List].
  {r} x ∈ as. (f[x] +r g[x]) {r} x ∈ as. f[x] +r Σ{r} x ∈ as. g[x]) ∈ |r|)

Lemma: rng_times_lsum_l
r:Rng. ∀A:Type. ∀as:A List. ∀f:A ⟶ |r|. ∀u:|r|.  ((u * Σ{r} x ∈ as. f[x]) = Σ{r} x ∈ as. (u f[x]) ∈ |r|)

Lemma: rng_times_lsum_r
r:Rng. ∀A:Type. ∀as:A List. ∀f:A ⟶ |r|. ∀u:|r|.  ((Σ{r} x ∈ as. f[x] u) = Σ{r} x ∈ as. (f[x] u) ∈ |r|)

Lemma: rng_lsum_when_swap
r:Rng. ∀A:Type. ∀f:A ⟶ |r|. ∀b:𝔹. ∀as:A List.  {r} x ∈ as. (when b. f[x]) (when b. Σ{r} x ∈ as. f[x]) ∈ |r|)

Lemma: rng_lsum_swap
[r:Rng]. ∀[A,B:Type]. ∀[F:A ⟶ B ⟶ |r|]. ∀[as:A List]. ∀[bs:B List].
  {r} a ∈ as. Σ{r} b ∈ bs. F[a;b] = Σ{r} b ∈ bs. Σ{r} a ∈ as. F[a;b] ∈ |r|)

Lemma: rng_lsum_map
[r:Rng]. ∀[A,B:Type]. ∀[g:A ⟶ B].  ∀f:B ⟶ |r|. ∀as:A List.  {r} x ∈ map(g;as). f[x] = Σ{r} x ∈ as. f[g x] ∈ |r|)

Lemma: rng_lsum-split
[A:Type]. ∀[p:A ⟶ 𝔹]. ∀[r:Rng]. ∀[f:A ⟶ |r|]. ∀[as:A List].
  {r} x ∈ as. f[x] {r} x ∈ filter(p;as). f[x] +r Σ{r} x ∈ filter(λa.(¬b(p a));as). f[x]) ∈ |r|)

Lemma: rng_lsum-partition
[k:ℕ]. ∀[A:Type]. ∀[p:A ⟶ ℕk]. ∀[r:Rng]. ∀[f:A ⟶ |r|]. ∀[as:A List].
  {r} x ∈ as. f[x] (r) 0 ≤ i < k. Σ{r} x ∈ filter(λa.(p =z i);as). f[x]) ∈ |r|)

Lemma: rng_lsum-from-upto
[a,b:ℤ]. ∀[r:Rng]. ∀[f:{a..b-} ⟶ |r|].  {r} x ∈ [a, b). f[x] (r) a ≤ i < b. f[i]) ∈ |r|)

Lemma: rng_lsum-upto
[n:ℤ]. ∀[r:Rng]. ∀[f:ℕn ⟶ |r|].  {r} x ∈ upto(n). f[x] (r) 0 ≤ i < n. f[i]) ∈ |r|)

Lemma: rng_prod_injection
[r:CRng]. ∀[n:ℕ]. ∀[F:ℕn ⟶ |r|]. ∀[f:ℕn →⟶ ℕn].  ((Π(r) 0 ≤ i < n. F[i]) (r) 0 ≤ i < n. F[f i]) ∈ |r|)

Lemma: rng_prod_unroll_base
[r,F:Top].  (r) 0 ≤ i < 0. F[i] 1)

Lemma: rng_prod_unroll_hi
[r:CRng]. ∀[n:ℕ+]. ∀[F:ℕn ⟶ |r|].  ((Π(r) 0 ≤ i < n. F[i]) ((Π(r) 0 ≤ i < 1. F[i]) F[n 1]) ∈ |r|)

Lemma: rng_prod_1
[r:CRng]. ∀[n:ℕ].  ((Π(r) 0 ≤ i < n. 1) 1 ∈ |r|)

Lemma: rng_prod_empty_lemma
f,r:Top.  (r) 0 ≤ i < 0. f[i] 1)

Lemma: rng_prod_plus
[r:CRng]. ∀[n:ℕ]. ∀[F,G:ℕn ⟶ |r|].
  ((Π(r) 
         ≤ 
         < n
     F[i] +r G[i])
  = Σ{r} p ∈ functions-list(n;2). (r) 
                                        ≤ 
                                        < n
                                    if (p =z 0) then F[i] else G[i] fi )
  ∈ |r|)

Lemma: rng_prod_const_mul
[r:CRng]. ∀[c:|r|]. ∀[n:ℕ]. ∀[F:ℕn ⟶ |r|].  ((Π(r) 0 ≤ i < n. F[i] c) ((c ↑n) (r) 0 ≤ i < n. F[i])) ∈ |r|)

Definition: matrix
Matrix(n;m;r) ==  ℕn ⟶ ℕm ⟶ |r|

Lemma: matrix_wf
[n,m:ℤ]. ∀[r:RngSig].  (Matrix(n;m;r) ∈ Type)

Definition: matrix-ap
M[i,j] ==  j

Lemma: matrix-ap_wf
[n,m:ℤ]. ∀[r:RngSig]. ∀[i:ℕn]. ∀[j:ℕm]. ∀[M:Matrix(n;m;r)].  (M[i,j] ∈ |r|)

Definition: mx
matrix(M[x; y]) ==  λx,y. M[x; y]

Lemma: mx_wf
[n,m:ℤ]. ∀[r:RngSig]. ∀[M:ℕn ⟶ ℕm ⟶ |r|].  (matrix(M[x;y]) ∈ Matrix(n;m;r))

Lemma: matrix_ap_mx_lemma
j,i,M:Top.  (matrix(M[x;y])[i,j] M[i;j])

Definition: matrix-transpose
M' ==  matrix(M[y,x])

Lemma: matrix-transpose_wf
[n,m:ℤ]. ∀[r:RngSig]. ∀[M:Matrix(n;m;r)].  (M' ∈ Matrix(m;n;r))

Lemma: matrix-transpose-twice
[n,m:ℤ]. ∀[r:RngSig]. ∀[M:Matrix(n;m;r)].  (M'' M ∈ Matrix(n;m;r))

Definition: matrix-swap-rows
matrix-swap-rows(M;i;j) ==  matrix(M[if x=i then else if x=j then else x,y])

Lemma: matrix-swap-rows_wf
[n,m:ℤ]. ∀[r:RngSig]. ∀[i,j:ℕn]. ∀[M:Matrix(n;m;r)].  (matrix-swap-rows(M;i;j) ∈ Matrix(n;m;r))

Definition: matrix-swap-cols
matrix-swap-cols(M;i;j) ==  matrix(M[x,if y=i then else if y=j then else y])

Lemma: matrix-swap-cols_wf
[n,m:ℤ]. ∀[r:RngSig]. ∀[i,j:ℕm]. ∀[M:Matrix(n;m;r)].  (matrix-swap-cols(M;i;j) ∈ Matrix(n;m;r))

Definition: matrix-mul-col
matrix-mul-col(r;k;i;M) ==  matrix(if y=i then M[x,y] else M[x,y])

Lemma: matrix-mul-col_wf
[n,m:ℤ]. ∀[r:RngSig]. ∀[k:|r|]. ∀[i:ℕm]. ∀[M:Matrix(n;m;r)].  (matrix-mul-col(r;k;i;M) ∈ Matrix(n;m;r))

Definition: matrix-mul-row
matrix-mul-row(r;k;i;M) ==  matrix(if x=i then M[x,y] else M[x,y])

Lemma: matrix-mul-row_wf
[n,m:ℤ]. ∀[r:RngSig]. ∀[k:|r|]. ∀[i:ℕn]. ∀[M:Matrix(n;m;r)].  (matrix-mul-row(r;k;i;M) ∈ Matrix(n;m;r))

Definition: matrix-plus
==  matrix(M[x,y] +r N[x,y])

Lemma: matrix-plus_wf
[n,m:ℤ]. ∀[r:RngSig]. ∀[M,N:Matrix(n;m;r)].  (M N ∈ Matrix(n;m;r))

Lemma: matrix-plus-assoc
[n,m:ℤ]. ∀[r:Rng]. ∀[M,N,K:Matrix(n;m;r)].  (M K ∈ Matrix(n;m;r))

Lemma: matrix-plus-comm
[n,m:ℤ]. ∀[r:Rng]. ∀[M,N:Matrix(n;m;r)].  (M M ∈ Matrix(n;m;r))

Definition: matrix-times
(M*N) ==  matrix(Σ(r) 0 ≤ i < n. M[x,i] N[i,y])

Lemma: matrix-times_wf
[n,k,m:ℤ]. ∀[r:Rng]. ∀[M:Matrix(n;k;r)]. ∀[N:Matrix(k;m;r)].  ((M*N) ∈ Matrix(n;m;r))

Lemma: matrix-times-assoc
[n,k,m,l:ℕ]. ∀[r:Rng]. ∀[M:Matrix(n;k;r)]. ∀[N:Matrix(k;m;r)]. ∀[K:Matrix(m;l;r)].
  (((M*N)*K) (M*(N*K)) ∈ Matrix(n;l;r))

Lemma: matrix-times-distrib-left
[n,k,m:ℕ]. ∀[r:Rng]. ∀[M:Matrix(n;k;r)]. ∀[N,K:Matrix(k;m;r)].  ((M*N K) (M*N) (M*K) ∈ Matrix(n;m;r))

Lemma: matrix-times-distrib-right
[n,k,m:ℕ]. ∀[r:Rng]. ∀[M,N:Matrix(n;k;r)]. ∀[K:Matrix(k;m;r)].  ((M N*K) (M*K) (N*K) ∈ Matrix(n;m;r))

Lemma: matrix-transpose-times
[n,k,m:ℕ]. ∀[r:CRng]. ∀[M:Matrix(n;k;r)]. ∀[N:Matrix(k;m;r)].  ((M*N)' (N'*M') ∈ Matrix(m;n;r))

Definition: identity-matrix
==  matrix(if x=y then else 0)

Lemma: identity-matrix_wf
[n,m:ℤ]. ∀[r:RngSig].  (I ∈ Matrix(n;m;r))

Definition: zero-matrix
==  matrix(0)

Lemma: zero-matrix_wf
[m,n:ℤ]. ∀[r:RngSig].  (0 ∈ Matrix(n;m;r))

Definition: J-matrix
==  matrix(1)

Lemma: J-matrix_wf
[m,n:ℤ]. ∀[r:RngSig].  (J ∈ Matrix(n;m;r))

Definition: matrix-minus
-(M) ==  matrix(-r M[x,y])

Lemma: matrix-minus_wf
[m,n:ℤ]. ∀[r:RngSig]. ∀[M:Matrix(n;m;r)].  (-(M) ∈ Matrix(n;m;r))

Lemma: matrix-times-id-left
[k,m:ℕ]. ∀[r:Rng]. ∀[N:Matrix(k;m;r)].  ((I*N) N ∈ Matrix(k;m;r))

Lemma: matrix-times-0-right
[k,m,n:ℕ]. ∀[r:Rng]. ∀[N:Matrix(k;m;r)].  ((N*0) 0 ∈ Matrix(k;n;r))

Lemma: matrix-plus-zero-left
[k,m:ℕ]. ∀[r:Rng]. ∀[N:Matrix(k;m;r)].  (0 N ∈ Matrix(k;m;r))

Lemma: matrix-plus-minus-left
[k,m:ℕ]. ∀[r:Rng]. ∀[N:Matrix(k;m;r)].  (-(N) 0 ∈ Matrix(k;m;r))

Lemma: matrix-times-id-right
[k,m:ℕ]. ∀[r:Rng]. ∀[N:Matrix(k;m;r)].  ((N*I) N ∈ Matrix(k;m;r))

Lemma: matrix-times-0-left
[k,m,n:ℕ]. ∀[r:Rng]. ∀[N:Matrix(k;m;r)].  ((0*N) 0 ∈ Matrix(n;m;r))

Lemma: matrix-plus-zero-right
[k,m:ℕ]. ∀[r:Rng]. ∀[N:Matrix(k;m;r)].  (N N ∈ Matrix(k;m;r))

Lemma: matrix-plus-minus-right
[k,m:ℕ]. ∀[r:Rng]. ∀[N:Matrix(k;m;r)].  (N -(N) 0 ∈ Matrix(k;m;r))

Definition: matrix-ring
matrix-ring(r;n) ==  <Matrix(n;n;r), λu,v. ff, λu,v. ff, λM,N. N, 0, λM.-(M), λM,N. (M*N), I, λu,v. (inr ⋅ )>

Lemma: matrix-ring_wf
[r:Rng]. ∀[n:ℕ].  (matrix-ring(r;n) ∈ Rng)

Definition: matrix-det
|M| ==  Σ{r} f ∈ permutations-list(n). let = Π(r) 0 ≤ i < n. M[i,f i] in if permutation-sign(n;f)=1 then else (-r k)

Lemma: matrix-det_wf
[r:Rng]. ∀[n:ℕ]. ∀[M:Matrix(n;n;r)].  (|M| ∈ |r|)

Lemma: matrix-det-dim0
[r:Rng]. ∀[M:Top].  (|M| 1 ∈ |r|)

Lemma: matrix-det-dim1
[r:CRng]. ∀[M:Row(1;r)].  (|M| M[0,0] ∈ |r|)

Lemma: det-transpose
[r:CRng]. ∀[n:ℕ]. ∀[M:Matrix(n;n;r)].  (|M'| |M| ∈ |r|)

Lemma: det-id
[r:CRng]. ∀[n:ℕ].  (|I| 1 ∈ |r|)

Lemma: det-swap-cols
[r:CRng]. ∀[n:ℕ]. ∀[M:Matrix(n;n;r)]. ∀[i,j:ℕn].  |matrix-swap-cols(M;i;j)| (-r |M|) ∈ |r| supposing ¬(i j ∈ ℤ)

Lemma: det-equal-rows
[r:CRng]. ∀[n:ℕ]. ∀[M:Matrix(n;n;r)]. ∀[i,j:ℕn].
  |M| 0 ∈ |r| supposing (i j ∈ ℤ)) ∧ (matrix-swap-rows(M;i;j) M ∈ Matrix(n;n;r))

Lemma: equal-rows-det
[r:CRng]. ∀[n:ℕ]. ∀[M:Matrix(n;n;r)].
  |M| 0 ∈ |r| supposing ∃i,j:ℕn. ((¬(i j ∈ ℤ)) ∧ (matrix-swap-rows(M;i;j) M ∈ Matrix(n;n;r)))

Lemma: swap-rows-is-transpose-swap-cols
[M,i,j:Top].  (matrix-swap-rows(M;i;j) matrix-swap-cols(M';i;j)')

Lemma: mul-row-is-transpose-mul-col
[M,r,i,k:Top].  (matrix-mul-row(r;k;i;M) matrix-mul-col(r;k;i;M')')

Lemma: mul-col-is-transpose-mul-row
[M,r,i,k:Top].  (matrix-mul-col(r;k;i;M) matrix-mul-row(r;k;i;M')')

Lemma: det-mul-row
[r:CRng]. ∀[n:ℕ]. ∀[M:Matrix(n;n;r)]. ∀[i:ℕn]. ∀[k:|r|].  (|matrix-mul-row(r;k;i;M)| (k |M|) ∈ |r|)

Lemma: det-mul-col
[r:CRng]. ∀[n:ℕ]. ∀[M:Matrix(n;n;r)]. ∀[i:ℕn]. ∀[k:|r|].  (|matrix-mul-col(r;k;i;M)| (k |M|) ∈ |r|)

Lemma: det-swap-rows
[r:CRng]. ∀[n:ℕ]. ∀[M:Matrix(n;n;r)]. ∀[i,j:ℕn].  |matrix-swap-rows(M;i;j)| (-r |M|) ∈ |r| supposing ¬(i j ∈ ℤ)

Lemma: det-add-row
[r:CRng]. ∀[n:ℕ]. ∀[M:Matrix(n;n;r)]. ∀[i:ℕn]. ∀[row:ℕn ⟶ |r|].
  (|matrix(if x=i then (row y) +r M[x,y] else M[x,y])| (|matrix(if x=i then row else M[x,y])| +r |M|) ∈ |r|)

Definition: det-fun
These properties characterize the determinant up to multiplicative constant.
⌜λM.|M|⌝ is such function (see matrix-det-is-det-fun)
and we prove that any such function d  is equal to 
               λM.((d I) (determinant(n;r) M))
where the primitive recursive function ⌜determinant(n;r)⌝
expands by minors of the first row.
   (see det-fun-is-determinant)

corollary is that the two versions of the determinant
(the "Leibnitz" form  
|M| ==  Σ{r} f ∈ permutations-list(n). let = Π(r) 0 ≤ i < n. M[i,f i] in if permutation-sign(n;f)=1 then else (-r k)
and the  "Laplace" form 
  determinant(n;r) ==
  primrec(n;λm.1;λn',d,m. (r) 0 ≤ i < n' 1. if isEven(i) then m[0,i] else -r m[0,i] fi  (d matrix-minor(0;i;m))))
are equal  (matrix-det-is-determinant).
   

We include the property that when two distinct rows are equal then
the determinant is 0, because for rings of characteristic 2, this does
not follow from the property that swapping rows reverses the sign.
.⋅

det-fun(r;n) ==
  {d:Matrix(n;n;r) ⟶ |r|| 
   (∀i:ℕn. ∀k:|r|. ∀M:Matrix(n;n;r).  ((d matrix-mul-row(r;k;i;M)) (k (d M)) ∈ |r|))
   ∧ (∀i:ℕn. ∀row:ℕn ⟶ |r|. ∀M:Matrix(n;n;r).
        ((d matrix(if x=i then (row y) +r M[x,y] else M[x,y]))
        ((d matrix(if x=i then row else M[x,y])) +r (d M))
        ∈ |r|))
   ∧ (∀i,j:ℕn.  ((¬(i j ∈ ℤ))  (∀M:Matrix(n;n;r). ((d matrix-swap-rows(M;i;j)) (-r (d M)) ∈ |r|))))
   ∧ (∀i,j:ℕn.
        ((¬(i j ∈ ℤ))  (∀M:Matrix(n;n;r). ((matrix-swap-rows(M;i;j) M ∈ Matrix(n;n;r))  ((d M) 0 ∈ |r|)))))} 

Lemma: det-fun_wf
[r:Rng]. ∀[n:ℕ].  (det-fun(r;n) ∈ Type)

Lemma: det-fun-zero-row
[r:Rng]. ∀[n:ℕ]. ∀[d:det-fun(r;n)]. ∀[M:Matrix(n;n;r)].  (d M) 0 ∈ |r| supposing ∃i:ℕn. ∀j:ℕn. (M[i,j] 0 ∈ |r|)

Definition: row-op
row-op(r;a;b;k;M) ==  matrix(if x=a then M[x,y] +r (k M[b,y]) else M[x,y])

Lemma: row-op_wf
[n,m:ℤ]. ∀[r:RngSig]. ∀[k:|r|]. ∀[a,b:ℕn]. ∀[M:Matrix(n;m;r)].  (row-op(r;a;b;k;M) ∈ Matrix(n;m;r))

Lemma: det-fun-row-op
[r:Rng]. ∀[n:ℕ]. ∀[d:det-fun(r;n)]. ∀[M:Matrix(n;n;r)]. ∀[a,b:ℕn]. ∀[k:|r|].
  (d row-op(r;a;b;k;M)) (d M) ∈ |r| supposing ¬(a b ∈ ℤ)

Lemma: matrix-det-is-det-fun
[r:CRng]. ∀[n:ℕ].  M.|M| ∈ det-fun(r;n))

Lemma: det-row-op
[r:CRng]. ∀[n:ℕ]. ∀[M:Matrix(n;n;r)]. ∀[a,b:ℕn]. ∀[k:|r|].  |row-op(r;a;b;k;M)| |M| ∈ |r| supposing ¬(a b ∈ ℤ)

Lemma: det-multiple-row-ops
[r:CRng]. ∀[n:ℕ]. ∀[M:Matrix(n;n;r)]. ∀[a:ℕn]. ∀[k:|r|].
  (|matrix(if x=a then M[x,y] else (M[x,y] +r (k M[a,y])))| |M| ∈ |r|)

Lemma: det-multiple-col-ops
[r:CRng]. ∀[n:ℕ]. ∀[M:Matrix(n;n;r)]. ∀[a:ℕn]. ∀[k:|r|].
  (|matrix(if y=a then M[x,y] else (M[x,y] +r (k M[x,a])))| |M| ∈ |r|)

Definition: matrix-minor
The minor of an (n by m) matrix is an (n-1 by m-1) matrix obtained
by deleting row and column j.⋅

matrix-minor(i;j;m) ==  λx,y. m[if (x) < (i)  then x  else (x 1),if (y) < (j)  then y  else (y 1)]

Lemma: matrix-minor_wf
[n,m:ℤ]. ∀[r:RngSig]. ∀[i:ℕn]. ∀[j:ℕm]. ∀[M:Matrix(n;m;r)].  (matrix-minor(i;j;M) ∈ Matrix(n 1;m 1;r))

Lemma: transpose-matrix-minor
[i,j,M:Top].  (matrix-minor(i;j;M)' matrix-minor(j;i;M'))

Definition: matrix+
matrix+(r;j;M) ==
  matrix(if x=0
         then if y=j then else 0
         else if (y) < (j)  then M[x 1,y]  else if (j) < (y)  then M[x 1,y 1]  else 0)

Lemma: matrix+_wf
[n,m:ℤ]. ∀[j:ℕ1]. ∀[r:RngSig]. ∀[M:Matrix(n;m;r)].  (matrix+(r;j;M) ∈ Matrix(n 1;m 1;r))

Lemma: det-fun+
[n:ℕ]. ∀[J:ℕ1]. ∀[r:Rng]. ∀[d:det-fun(r;n 1)].  M.(d matrix+(r;J;M)) ∈ det-fun(r;n))

Lemma: det-fun+-at-identity
[n:ℕ]. ∀[J:ℕ1]. ∀[r:Rng]. ∀[d:det-fun(r;n 1)].
  ((d matrix+(r;J;I)) if isEven(J) then else -r (d I) fi  ∈ |r|)

Definition: determinant
determinant(n;r) ==
  primrec(n;λm.1;λn',d,m. (r) 0 ≤ i < n' 1. if isEven(i) then m[0,i] else -r m[0,i] fi  (d matrix-minor(0;i;m))))

Lemma: determinant_wf
[r:CRng]. ∀[n:ℕ].  (determinant(n;r) ∈ Matrix(n;n;r) ⟶ |r|)

Lemma: det-fun-is-determinant
[r:CRng]. ∀[n:ℕ]. ∀[d:det-fun(r;n)].  (d M.((d I) (determinant(n;r) M))) ∈ (Matrix(n;n;r) ⟶ |r|))

Lemma: matrix-det-is-determinant
[r:CRng]. ∀[n:ℕ]. ∀[M:Matrix(n;n;r)].  (|M| (determinant(n;r) M) ∈ |r|)

Definition: diagonal-matrix
diagonal-matrix(r;x.F[x]) ==  matrix(if x=y then F[x] else 0)

Lemma: diagonal-matrix_wf
[r:RngSig]. ∀[n:ℕ]. ∀[F:ℕn ⟶ |r|].  (diagonal-matrix(r;i.F[i]) ∈ Matrix(n;n;r))

Lemma: det-times
[r:CRng]. ∀[n:ℕ]. ∀[A,B:Matrix(n;n;r)].  (|(A*B)| (|A| |B|) ∈ |r|)

Definition: matrix-scalar-mul
k*M ==  matrix(k M[x,y])

Lemma: matrix-scalar-mul_wf
[r:RngSig]. ∀[k:|r|]. ∀[n,m:ℕ]. ∀[M:Matrix(n;m;r)].  (k*M ∈ Matrix(n;m;r))

Lemma: matrix-scalar-mul-mul
[n,m:ℕ]. ∀[r:Rng]. ∀[k1,k2:|r|]. ∀[M:Matrix(n;m;r)].  (k1*k2*M k1 k2*M ∈ Matrix(n;m;r))

Lemma: matrix-scalar-mul-1
[n,m:ℕ]. ∀[r:Rng]. ∀[M:Matrix(n;m;r)].  (1*M M ∈ Matrix(n;m;r))

Lemma: matrix-times-scalar-mul
[n,k,m:ℕ]. ∀[r:CRng]. ∀[A:Matrix(n;k;r)]. ∀[B:Matrix(k;m;r)]. ∀[c:|r|].  ((A*c*B) c*(A*B) ∈ Matrix(n;m;r))

Lemma: matrix-scalar-mul-times
[n,k,m:ℕ]. ∀[r:Rng]. ∀[A:Matrix(n;k;r)]. ∀[B:Matrix(k;m;r)]. ∀[c:|r|].  ((c*A*B) c*(A*B) ∈ Matrix(n;m;r))

Lemma: transpose-scalar-mul
[r,k,M:Top].  (k*M' k*M')

Lemma: transpose-identity-matrix
[r:RngSig]. ∀[n:ℕ].  (I' I ∈ Matrix(n;n;r))

Definition: adjugate
adj(M) ==  matrix(if isEven(x y) then |matrix-minor(y;x;M)| else -r |matrix-minor(y;x;M)| fi )

Lemma: adjugate_wf
[r:Rng]. ∀[n:ℕ]. ∀[M:Matrix(n;n;r)].  (adj(M) ∈ Matrix(n;n;r))

Lemma: adjugate-property
[r:CRng]. ∀[n:ℕ]. ∀[M:Matrix(n;n;r)].  ((M*adj(M)) |M|*I ∈ Matrix(n;n;r))

Lemma: adjugate-transpose
[r:CRng]. ∀[n:ℕ]. ∀[M:Matrix(n;n;r)].  (adj(M') adj(M)' ∈ Matrix(n;n;r))

Lemma: adjugate-property2
[r:CRng]. ∀[n:ℕ]. ∀[M:Matrix(n;n;r)].  ((adj(M)*M) |M|*I ∈ Matrix(n;n;r))

Lemma: null-space-unique
[r:IntegDom{i}]. ∀[n:ℕ]. ∀[M:Matrix(n;n;r)].
  ∀[u:Column(n;r)]. (((M*u) 0 ∈ Column(n;r))  (u 0 ∈ Column(n;r))) supposing ¬(|M| 0 ∈ |r|)

Lemma: expand-det-by-column
[n:ℕ]. ∀[j:ℕn]. ∀[r:CRng]. ∀[M:Matrix(n;n;r)].
  (|M| (r) 0 ≤ i < n. if isEven(i j) then M[i,j] else -r M[i,j] fi  |matrix-minor(i;j;M)|) ∈ |r|)

Lemma: expand-det-by-row
[n:ℕ]. ∀[i:ℕn]. ∀[r:CRng]. ∀[M:Matrix(n;n;r)].
  (|M| (r) 0 ≤ j < n. if isEven(i j) then M[i,j] else -r M[i,j] fi  |matrix-minor(i;j;M)|) ∈ |r|)

Lemma: det-diagonal
[r:CRng]. ∀[n:ℕ]. ∀[F:ℕn ⟶ |r|].  (|diagonal-matrix(r;i.F[i])| (r) 0 ≤ i < n. F[i]) ∈ |r|)

Lemma: det-kI+J
[r:CRng]. ∀[n:ℕ]. ∀[a:|r|].  (|a*I J| if (n =z 0) then else (a +r int-to-ring(r;n)) (a ↑(n 1)) fi  ∈ |r|)

Definition: invertible-matrix
invertible-matrix(r;n;A) ==  ∃B:Matrix(n;n;r). ((A*B) I ∈ Matrix(n;n;r))

Lemma: invertible-matrix_wf
[r:Rng]. ∀[n:ℕ]. ∀[A:Matrix(n;n;r)].  (invertible-matrix(r;n;A) ∈ ℙ)

Lemma: invertible-matrix-iff-det
r:CRng. ∀n:ℕ. ∀A:Matrix(n;n;r).  (invertible-matrix(r;n;A) ⇐⇒ |A| in r)

Lemma: invertible-matrix-iff-left
r:CRng. ∀n:ℕ. ∀A:Matrix(n;n;r).  (invertible-matrix(r;n;A) ⇐⇒ ∃B:Matrix(n;n;r). ((B*A) I ∈ Matrix(n;n;r)))

Lemma: inverse-unique
[r:CRng]. ∀[n:ℕ]. ∀[A,B,C:Matrix(n;n;r)].
  ((((A*B) I ∈ Matrix(n;n;r)) ∨ ((B*A) I ∈ Matrix(n;n;r)))
   (((A*C) I ∈ Matrix(n;n;r)) ∨ ((C*A) I ∈ Matrix(n;n;r)))
   (B C ∈ Matrix(n;n;r)))

Definition: adj-solution
adj-solution(r;n;A;c;b) ==  c*(adj(A)*b)

Lemma: adj-solution_wf
[r:CRng]. ∀[n,m:ℕ]. ∀[A:Matrix(n;n;r)]. ∀[c:|r|]. ∀[b:Matrix(n;m;r)].  (adj-solution(r;n;A;c;b) ∈ Matrix(n;m;r))

Lemma: adj-solution-property
[r:CRng]. ∀[n,m:ℕ]. ∀[A:Matrix(n;n;r)]. ∀[c:|r|]. ∀[b:Matrix(n;m;r)].
  (A*adj-solution(r;n;A;c;b)) b ∈ Matrix(n;m;r) supposing (c |A|) 1 ∈ |r|

Lemma: adj-solution-column
[r:CRng]. ∀[n:ℕ]. ∀[A:Matrix(n;n;r)]. ∀[c:|r|]. ∀[b:Column(n;r)].
  (adj-solution(r;n;A;c;b) c*matrix(|matrix(if y=j then b[x,0] else A[x,y])|) ∈ Column(n;r))

Lemma: Cramers-rule
[r:CRng]. ∀[n:ℕ]. ∀[A:Matrix(n;n;r)]. ∀[c:{c:|r|| (c |A|) 1 ∈ |r|} ]. ∀[b:Column(n;r)].
  ((A*c*matrix(|matrix(if y=j then b[x,0] else A[x,y])|)) b ∈ Column(n;r))

Definition: vector-add
(a b) ==  λi.((a i) +r (b i))

Lemma: vector-add_wf
[i:Type]. ∀[r:RngSig]. ∀[a,b:i ⟶ |r|].  ((a b) ∈ i ⟶ |r|)

Definition: vector-mul
(c*a) ==  λi.(c (a i))

Lemma: vector-mul_wf
[i:Type]. ∀[r:RngSig]. ∀[c:|r|]. ∀[a:i ⟶ |r|].  ((c*a) ∈ i ⟶ |r|)

Lemma: vector-mul-mul
[i:Type]. ∀[r:Rng]. ∀[c1,c2:|r|]. ∀[a:i ⟶ |r|].  ((c1*(c2*a)) (c1 c2*a) ∈ (i ⟶ |r|))

Definition: zero-vector
==  λi.0

Lemma: zero-vector_wf
[i:Type]. ∀[r:RngSig].  (0 ∈ i ⟶ |r|)

Lemma: mul-zero-vector
[i:Type]. ∀[r:Rng]. ∀[c:|r|].  ((c*0) 0 ∈ (i ⟶ |r|))

Lemma: zero-vector-add-left
[i:Type]. ∀[r:Rng]. ∀[a:i ⟶ |r|].  ((0 a) a ∈ (i ⟶ |r|))

Lemma: zero-vector-add-right
[i:Type]. ∀[r:Rng]. ∀[a:i ⟶ |r|].  ((a 0) a ∈ (i ⟶ |r|))

Definition: cross-product
(a b) ==
  λi.[((a 1) (b 2)) +r (-r ((a 2) (b 1)));
      ((a 2) (b 0)) +r (-r ((a 0) (b 2)));
      ((a 0) (b 1)) +r (-r ((a 1) (b 0)))][i]

Lemma: cross-product_wf
[r:RngSig]. ∀[a,b:ℕ3 ⟶ |r|].  ((a b) ∈ ℕ3 ⟶ |r|)

Lemma: cross-product-same
[r:CRng]. ∀[a:ℕ3 ⟶ |r|].  ((a a) 0 ∈ (ℕ3 ⟶ |r|))

Lemma: cross-product-anti-comm
[r:CRng]. ∀[a,b:ℕ3 ⟶ |r|].  ((b a) (-r 1*(a b)) ∈ (ℕ3 ⟶ |r|))

Lemma: Jacobi-identity
[r:CRng]. ∀[a,b,c:ℕ3 ⟶ |r|].  (((a (b c)) ((b (c a)) (c (a b)))) 0 ∈ (ℕ3 ⟶ |r|))

Lemma: cross-product-distrib1
[r:CRng]. ∀[a,b,c:ℕ3 ⟶ |r|].  ((a (b c)) ((a b) (a c)) ∈ (ℕ3 ⟶ |r|))

Lemma: cross-product-distrib2
[r:CRng]. ∀[a,b,c:ℕ3 ⟶ |r|].  (((b c) a) ((b a) (c a)) ∈ (ℕ3 ⟶ |r|))

Lemma: cross-product-mul1
[r:CRng]. ∀[a,b:ℕ3 ⟶ |r|]. ∀[c:|r|].  (((c*a) b) (c*(a b)) ∈ (ℕ3 ⟶ |r|))

Lemma: cross-product-mul2
[r:CRng]. ∀[a,b:ℕ3 ⟶ |r|]. ∀[c:|r|].  ((a (c*b)) (c*(a b)) ∈ (ℕ3 ⟶ |r|))

Lemma: cross-product-0
[r:Rng]. ∀[a:ℕ3 ⟶ |r|].  ((a 0) 0 ∈ (ℕ3 ⟶ |r|))

Lemma: cross-product-equal-zero
r:IntegDom{i}. ∀a,b:ℕ3 ⟶ |r|.
  ((∀x,y:|r|.  Dec(x y ∈ |r|))
   ((a b) 0 ∈ (ℕ3 ⟶ |r|)
     ⇐⇒ (a 0 ∈ (ℕ3 ⟶ |r|))
         ∨ (b 0 ∈ (ℕ3 ⟶ |r|))
         ∨ (∃i:ℕ3. ((¬((b i) 0 ∈ |r|)) ∧ ((a i) 0 ∈ |r|)) ∧ ((b i*a) (a i*b) ∈ (ℕ3 ⟶ |r|))))))

Lemma: cross-product-equal-0
r:IntegDom{i}. ∀a,b:ℕ3 ⟶ |r|.
  ((∀x,y:|r|.  Dec(x y ∈ |r|))
   ((a b) 0 ∈ (ℕ3 ⟶ |r|)
     ⇐⇒ (a 0 ∈ (ℕ3 ⟶ |r|))
         ∨ (b 0 ∈ (ℕ3 ⟶ |r|))
         ∨ (∃c1,c2:|r|. ((¬(c1 0 ∈ |r|)) ∧ (c2 0 ∈ |r|)) ∧ ((c1*a) (c2*b) ∈ (ℕ3 ⟶ |r|))))))

Definition: scalar-product
(a b) ==  Σ(r) 0 ≤ i < n. (a i) (b i)

Lemma: scalar-product_wf
[r:Rng]. ∀[n:ℕ]. ∀[a,b:ℕn ⟶ |r|].  ((a b) ∈ |r|)

Lemma: scalar-product-comm
[r:CRng]. ∀[n:ℕ]. ∀[a,b:ℕn ⟶ |r|].  ((a b) (b a) ∈ |r|)

Lemma: scalar-product-0
[r:Rng]. ∀[n:ℕ]. ∀[a:ℕn ⟶ |r|].  ((0 a) 0 ∈ |r|)

Lemma: scalar-product-mul
[r:Rng]. ∀[n:ℕ]. ∀[a,b:ℕn ⟶ |r|]. ∀[c:|r|].  (((c*a) b) (c (a b)) ∈ |r|)

Lemma: scalar-product-add-left
[r:Rng]. ∀[n:ℕ]. ∀[a,b,c:ℕn ⟶ |r|].  (((a b) c) ((a c) +r (b c)) ∈ |r|)

Lemma: scalar-product-add-right
[r:Rng]. ∀[n:ℕ]. ∀[a,b,c:ℕn ⟶ |r|].  ((c (a b)) ((c a) +r (c b)) ∈ |r|)

Definition: scalar-triple-product
|a,b,c| ==  (a (b c))

Lemma: scalar-triple-product_wf
[r:Rng]. ∀[a,b,c:ℕ3 ⟶ |r|].  (|a,b,c| ∈ |r|)

Lemma: scalar-product-3
[r,a,b:Top].  ((a b) ((0 +r ((a 0) (b 0))) +r ((a 1) (b 1))) +r ((a 2) (b 2)))

Lemma: Binet-Cauchy-identity
[r:CRng]. ∀[a,b,c,d:ℕ3 ⟶ |r|].  (((a b) (c d)) (((a c) (b d)) +r (-r ((a d) (b c)))) ∈ |r|)

Lemma: Binet-Cauchy-corollary
[r:CRng]. ∀[a,b:ℕ3 ⟶ |r|].  (((a b) (a b)) (((a a) (b b)) +r (-r ((a b) (b a)))) ∈ |r|)

Lemma: non-zero-vector-implies
r:RngSig
  ((∀x,y:|r|.  Dec(x y ∈ |r|))  (∀k:ℕ. ∀a:{a:ℕk ⟶ |r|| ¬(a 0 ∈ (ℕk ⟶ |r|))} .  (∃i:ℕ[(¬((a i) 0 ∈ |r|))])))

Lemma: non-zero-vector-implies-ext
r:RngSig
  ((∀x,y:|r|.  Dec(x y ∈ |r|))  (∀k:ℕ. ∀a:{a:ℕk ⟶ |r|| ¬(a 0 ∈ (ℕk ⟶ |r|))} .  (∃i:ℕ[(¬((a i) 0 ∈ |r|))])))

Definition: non-zero-component
non-zero-component(r;eq;k;a) ==
  r,eq,k,a. eval j' in
              case letrec G(x)=if (x) < (j')
                                  then if eq (a x) then (x 1) else inl <x, λ_.Ax> fi 
                                  else (inr x.Ax) in
                    G(0)
               of inl(p) =>
               let i,_ 
               in i
               inr(_) =>
               ⊥
  
  eq 
  
  a

Lemma: non-zero-component_wf
[r:RngSig]. ∀[eq:∀x,y:|r|.  Dec(x y ∈ |r|)]. ∀[k:ℕ]. ∀[a:{a:ℕk ⟶ |r|| ¬(a 0 ∈ (ℕk ⟶ |r|))} ].
  (non-zero-component(r;eq;k;a) ∈ {i:ℕk| ¬((a i) 0 ∈ |r|)} )

Lemma: non-zero-component-exists
r:RngSig
  ((∀x,y:|r|.  Dec(x y ∈ |r|))  (∀k:ℕ{∀a:ℕk ⟶ |r|. ((¬(a 0 ∈ (ℕk ⟶ |r|)))  (∃i:ℕk. ((a i) 0 ∈ |r|))))}))

Definition: nonzero-cross-imp
nonzero-cross-imp(r;eq;a;b) ==
  case int_seg_decide(λi.if eq (a i) then inr %.let %4,%5 in Ax) 
                         if eq (b i) then inr %.let %5,%6 in Ax) 
                         else inl <λ%.Ax, λ%.Ax>
                         fi ;0;3)
   of inl(tr) =>
   let i,pr tr 
   in eval i@0 in
      let _,_ pr 
      in if eq (a i@0) then Ax
         if int_seg_decide(λx.if eq (* (b i@0) (a x)) (* (a i@0) (b x)) then inr %.Ax)  else inl Ax fi ;0;3)
           then case int_seg_decide(λj.if eq (* (b i@0) (a j)) (* (a i@0) (b j))
                                       then inr %.Ax) 
                                       else inl %.Ax)
                                       fi ;0;3)
                 of inl(x) =>
                 let j,_ 
                 in λx.if x=i@0 then else if x=j then -r (a i@0) else 0
                 inr(x) =>
                 let j,_ Ax 
                 in λx.if x=i@0 then else if x=j then -r (a i@0) else 0
         else Ax
         fi 
   inr(_) =>
   λi.if i=non-zero-component(r;eq;3;b) then else 0

Lemma: cross-product-non-zero-implies
r:IntegDom{i}
  ((∀x,y:|r|.  Dec(x y ∈ |r|))
   (∀a:{a:ℕ3 ⟶ |r|| ¬(a 0 ∈ (ℕ3 ⟶ |r|))} . ∀b:{b:ℕ3 ⟶ |r|| 
                                                    (b 0 ∈ (ℕ3 ⟶ |r|))) ∧ ((a b) 0 ∈ (ℕ3 ⟶ |r|)))} .
        (∃l:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))}  [(((a l) 0 ∈ |r|) ∧ ((b l) 0 ∈ |r|)))])))

Lemma: cross-product-non-zero-implies-ext
r:IntegDom{i}
  ((∀x,y:|r|.  Dec(x y ∈ |r|))
   (∀a:{a:ℕ3 ⟶ |r|| ¬(a 0 ∈ (ℕ3 ⟶ |r|))} . ∀b:{b:ℕ3 ⟶ |r|| 
                                                    (b 0 ∈ (ℕ3 ⟶ |r|))) ∧ ((a b) 0 ∈ (ℕ3 ⟶ |r|)))} .
        (∃l:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))}  [(((a l) 0 ∈ |r|) ∧ ((b l) 0 ∈ |r|)))])))

Lemma: nonzero-cross-imp_wf
[r:IntegDom{i}]. ∀[eq:∀x,y:|r|.  Dec(x y ∈ |r|)]. ∀[a:{a:ℕ3 ⟶ |r|| ¬(a 0 ∈ (ℕ3 ⟶ |r|))} ]. ∀[b:{b:ℕ3 ⟶ |r|| 
                                                                                                      (b
                                                                                                      0
                                                                                                      ∈ (ℕ3 ⟶ |r|)))
                                                                                                      ∧ ((a b)
                                                                                                        0
                                                                                                        ∈ (ℕ3
                                                                                                          ⟶ |r|)))} ].
  (nonzero-cross-imp(r;eq;a;b) ∈ {l:{p:ℕ3 ⟶ |r|| ¬(p 0 ∈ (ℕ3 ⟶ |r|))} ((a l) 0 ∈ |r|) ∧ ((b l) 0 ∈ |r|))\000C} )

Lemma: cross-product-equal-0-iff
r:IntegDom{i}. ∀a,b:ℕ3 ⟶ |r|.
  ((∀x,y:|r|.  Dec(x y ∈ |r|))
   ((a b) 0 ∈ (ℕ3 ⟶ |r|)
     ⇐⇒ (a 0 ∈ (ℕ3 ⟶ |r|)) ∨ (b 0 ∈ (ℕ3 ⟶ |r|)) ∨ (∀l:ℕ3 ⟶ |r|. ((a l) 0 ∈ |r| ⇐⇒ (b l) 0 ∈ |r|))))

Lemma: triple-cross-product-zero
r:CRng. ∀a,p,q:ℕ3 ⟶ |r|.  (((p a) 0 ∈ |r|)  ((q a) 0 ∈ |r|)  ((a (p q)) 0 ∈ (ℕ3 ⟶ |r|)))

Definition: dual-plane-primitives
DualPlanePrimitives ==  "V":Type"S":self."V" ⟶ self."V" ⟶ ℙ"P":self."V" ⟶ self."V" ⟶ ℙ

Lemma: dual-plane-primitives_wf
DualPlanePrimitives ∈ 𝕌'

Definition: dp-vec
Vec ==  d."V"

Lemma: dp-vec_wf
[d:DualPlanePrimitives]. (Vec ∈ Type)

Definition: dp-sep
(x y) ==  d."S" y

Lemma: dp-sep_wf
[d:DualPlanePrimitives]. ∀[x,y:Vec].  ((x y) ∈ ℙ)

Definition: dp-perp
(x ⊥ y) ==  d."P" y

Lemma: dp-perp_wf
[d:DualPlanePrimitives]. ∀[x,y:Vec].  ((x ⊥ y) ∈ ℙ)

Definition: dual-plane-structure
DualPlaneStructure ==
  DualPlanePrimitives
  "Ssquashstable":∀x,y:Vec.  SqStable((x y))
  "Pstable":∀x,y:Vec.  Stable{(x ⊥ y)}
  "SepOr":∀x:Vec. ∀y:{y:Vec| (x y)} . ∀z:Vec.  ((z x) ∨ (z y))
  "cross":∀a:Vec. ∀b:{b:Vec| (a b)} .  (∃c:Vec [((a ⊥ c) ∧ (b ⊥ c))])
  "nontrivial":∀a:Vec. (∃c:Vec [((a ⊥ c) ∧ (a c))])

Lemma: dual-plane-structure_wf
DualPlaneStructure ∈ 𝕌'

Lemma: dual-plane-structure_subtype
DualPlaneStructure ⊆DualPlanePrimitives

Definition: mk-dp-prim
(vec=V, sep=S, perp=P) ==  λx.x["V" := V]["S" := S]["P" := P]

Lemma: mk-dp-prim_wf
[V:Type]. ∀[S,P:V ⟶ V ⟶ ℙ].  ((vec=V, sep=S, perp=P) ∈ DualPlanePrimitives)

Definition: mk-dp
mk-dp(p;sqs;st;sor;crs;nt) ==
  p["Ssquashstable" := sqs]["Pstable" := st]["SepOr" := sor]["cross" := crs]["nontrivial" := nt]

Lemma: mk-dp_wf
[self:DualPlanePrimitives]. ∀[sqs:∀x,y:Vec.  SqStable((x y))]. ∀[st:∀x,y:Vec.  Stable{(x ⊥ y)}].
[sor:∀x:Vec. ∀y:{y:Vec| (x y)} . ∀z:Vec.  ((z x) ∨ (z y))]. ∀[crs:∀a:Vec. ∀b:{b:Vec| (a b)} .
                                                                          (∃c:Vec [((a ⊥ c) ∧ (b ⊥ c))])].
[nt:∀a:Vec. (∃c:Vec [((a ⊥ c) ∧ (a c))])].
  (mk-dp(self;sqs;st;sor;crs;nt) ∈ DualPlaneStructure)

Definition: row-list-matrix
row-list-matrix(L) ==  matrix(L[x][y])

Lemma: row-list-matrix_wf
[n,m:ℕ]. ∀[r:RngSig]. ∀[L:|r| List List].
  (row-list-matrix(L) ∈ Matrix(n;m;r)) supposing ((∀i:ℕn. (m ≤ ||L[i]||)) and (n ≤ ||L||))

Lemma: scalar-triple-product-symmetry
[r:CRng]. ∀[a,b,c:ℕ3 ⟶ |r|].  (|a,b,c| |b,c,a| ∈ |r|)

Lemma: scalar-triple-product-as-det
[r:CRng]. ∀[a,b,c:ℕ3 ⟶ |r|].  (|a,b,c| i.[a; b; c][i]| ∈ |r|)

Lemma: scalar-triple-product-non-zero
[r:IntegDom{i}]. ∀[a,b,c:ℕ3 ⟶ |r|].
  ∀[u:ℕ3 ⟶ |r|]. (((a u) 0 ∈ |r|)  ((b u) 0 ∈ |r|)  ((c u) 0 ∈ |r|)  (u 0 ∈ (ℕ3 ⟶ |r|))) 
  supposing ¬(|a,b,c| 0 ∈ |r|)

Definition: Chio-condensation
Chio-condensation(r;n;A) ==  matrix((A[i,j] A[n 1,n 1]) +r (-r (A[i,n 1] A[n 1,j])))

Lemma: Chio-condensation_wf
[r:Rng]. ∀[n:ℕ]. ∀[A:Matrix(n;n;r)].  (Chio-condensation(r;n;A) ∈ Matrix(n 1;n 1;r))

Lemma: rng_lsum-partial-permutations
[r:CRng]. ∀[n:{2...}]. ∀[i:ℕn]. ∀[F:(ℕn ⟶ ℕn) ⟶ |r|].
  {r} p ∈ partial-permutations-list(n;i). F[p]
  = Σ{r} f ∈ permutations-list(n 1). F[(i, 1) extend-injection(n 1;f)]
  ∈ |r|)



Home Index