module MatrixNormalization.FinProps where

open import Level using (Level; _⊔_) renaming (zero to lzero; suc to lsuc)
open import Function using (_$_)
open import Data.Nat as  using (; suc; z≤n; s≤s)
open import Data.Nat.Properties
open import Data.Fin
open import Data.Fin.Properties as F
open import Relation.Binary.PropositionalEquality

open import lbry

private variable
   ℓ₁ : Level
  n : 

record FinProps {ℓ₁} {ℓ₂} (A : Set ) (n : ) : Set (lsuc $   ℓ₁  ℓ₂) where
  field
    Pij : (i j : Fin (suc n)) .(i≤j : i  j) (a : A)  Set ℓ₁
    Pi : (i : Fin (suc n)) (a : A)  Set ℓ₁
    P : (a : A)  Set ℓ₁

    Pab :  (i j : Fin (suc n)) .(i≢j : i  j) (a b : A)  Set ℓ₂

    Pij→Pi :  (i : Fin (ℕ.suc n)) a (pij : Pij i (fromℕ _) (≤fromℕ _) a)  Pi i a
    Pi→P :  a (pi : Pi (fromℕ n) a)  P a
    Pi→Pii :  (i : Fin n) a (pi : Pi (inject₁ i) a)  Pij (suc i) (suc i) F.≤-refl a

    Ps :  i (j : Fin n) .(i≤j : i  j) a b
      (pij : Pij i (inject₁ j) (cong≤ʳ (sym (toℕ-inject₁ _)) i≤j) a)
      (pab : Pab i (suc j) (F.<⇒≢ (s≤s i≤j)) a b)  Pij i (suc j) (m≤n⇒m≤1+n i≤j) b

    P00 :  a  Pij zero zero ℕ.z≤n a

record FinPropsInv (A : Set ) (n : ) : Set (lsuc ) where
  field
    Pij : (i j : Fin (suc n)) .(i≥j : i  j) (a : A)  Set 
    Pi : (i : Fin (suc n)) (a : A)  Set 
    P : (a : A)  Set 

    Pab :  (i j : Fin (suc n)) .(i>j : i > j) (a b : A)  Set 

    Pij→Pi :  (i : Fin (ℕ.suc n)) a (pij : Pij i zero z≤n a)  Pi i a
    Pi→P :  a (pi : Pi zero a)  P a
    Pi→Pii :  (i : Fin n) a (pi : Pi (suc i) a)  Pij (inject₁ i) (inject₁ i) F.≤-refl a

    Ppred :  i (j : Fin n) .(i>j : i > j) a b
      (pij : Pij i (suc j) i>j a)
      (pab : Pab i (inject₁ j) (i>j→i>injJ i>j) a b)
       Pij i (inject₁ j) (i>j→i≥j i>j) b

    Pnn :  a  Pij (fromℕ _) (fromℕ _) F.≤-refl a