foundations.Fin.md.

Version of Sunday, January 22, 2023, 10:42 PM

Powered by agda version 2.6.2.2-442c76b and pandoc 2.14.0.3


Investigations on graph-theoretical constructions in Homotopy type theory

Jonathan Prieto-Cubides j.w.w. Håkon Robbestad Gylterud

Department of Informatics

University of Bergen, Norway

{-# OPTIONS --without-K --exact-split #-}

open import foundations.Core using (Level)
module foundations.Fin ( : Level)
  where
  open import foundations.Nat 
  open import foundations.Core
  open import foundations.NaturalsType
  open import foundations.TypesofMorphisms
  open import foundations.TruncationType
  Fin :   Type 
  Fin n = Σ[ m   ] (m < n)


  syntax Fin n =  n 

  bound-of :  {n : }  Fin n  
  bound-of {n = n} _ = n

  𝟘-≃-⟦0⟧ : 𝟘   Fin 0
  𝟘-≃-⟦0⟧ = qinv-≃  {()}) ((λ { (zero , ())
      ; (succ _ , ())}) ,  { (zero , ())
      ; (succ _ , ())}) , λ { ()})

  𝟙-≃-⟦1⟧ : 𝟙   Fin 1
  𝟙-≃-⟦1⟧ = qinv-≃  {   zero , }) ((λ _  ) ,
     { (zero , )  idp ; (succ n , p)  ⊥-elim (n<0 {} {n} p)}) , λ {   idp})
  π₁-fin
    :  {k : } {fm1 fm2 :  k  }
     fm1  fm2
     π₁ {A = }{B = λ a  a < k} fm1  π₁ fm2
  π₁-fin = ap π₁
  open dec-<

  _fin<_ :  {n : }   n    n   Type 
  (n , _) fin< (m , _)
    with n ?< m
  ... | yes _ =  
  ... | no _  =  

  _?fin<_ :  {n : }  Decidable {A =  n } (_fin<_ {n})
  (n , _) ?fin< (m , _)
    with n ?< m
  ... | yes p = yes 
  ... | no ¬p = no λ z  z
  fin-pred :  {k : }   k    k 
  fin-pred {zero}   (zero , ())
  fin-pred {succ n} (zero , )   = n , <-succ n
  fin-pred {succ k} (succ m , p) = m , n⁺<k→n<k {m}{succ k} p
  fin-pred-inj
    :  {k : }  {x y :  k }
     fin-pred x  fin-pred y
    -------------------------
     x  y
  fin-pred-inj {k} {n , n<} {m , m<} p with n ≟nat m
  fin-pred-inj {k} {n , n<} {.n , m<} p | yes idp rewrite <-prop {k}{n} n< m< = idp
  fin-pred-inj {zero} {zero , ()} {zero , m<} p | no ¬p
  fin-pred-inj {zero} {zero , n<} {succ m , ()} p | no ¬p
  fin-pred-inj {zero} {succ n , ()} {zero , m<} p | no ¬p
  fin-pred-inj {zero} {succ n , n<} {succ m , ()} p | no ¬p
  fin-pred-inj {succ k} {zero , } {zero , } p | no ¬p = idp
  fin-pred-inj {succ k} {zero , } {succ m , m<} p | no ¬p
    = ⊥-elim (<-=-→⊥ m< (! (π₁ (Σ-componentwise p))))
  fin-pred-inj {succ k} {succ n , n<} {zero , } p | no ¬p
    = ⊥-elim (<-=-→⊥ n< (π₁ (Σ-componentwise p)))
  fin-pred-inj {succ k} {succ n , n<} {succ m , m<} p | no ¬p
    = ⊥-elim (¬p (ap succ (π₁ (Σ-componentwise p))))
  pp
    :  {k : } {x : Fin (succ (succ (succ k)))}
     ((fin-pred (fin-pred x))  x)   

  pp {zero} {zero , π₄} ()
  pp {zero} {succ zero , } ()
  pp {zero} {succ (succ zero) , } ()
  pp {zero} {succ (succ (succ m)) , π₄} p = n<0 {n = m} π₄
  pp {succ k} {zero , } ()
  pp {succ k} {succ zero , } ()
  pp {succ k} {succ (succ zero) , } ()
  pp {succ k} {succ (succ (succ m)) , m<s} p =  kkk (π₁-fin p)
    where
      kkk :  {m : }  (succ m  succ (succ (succ m)))   
      kkk {zero} ()
      kkk {succ m} ()
  bot1  ⊥-from-fin-predx=y+x=fin-predy
    : {k : }  {x y : Fin (succ (succ (succ k)))}
     (fin-pred x  y)
     (x  fin-pred y)
      
  bot1 {k} {x} {y} p q = pp {x = x} ((ap fin-pred p) · ! q)
  ⊥-from-fin-predx=y+x=fin-predy = bot1
  module FinDecidable {n : } where

    _≟fin_ : Decidable {A =  n } _≡_
    (zero , a<n) ≟fin (zero , b<n) rewrite <-prop {n}{zero} a<n b<n = yes (pair= (idp , idp))
    (zero , a<n) ≟fin (succ b , b<n) = no  ())
    (succ a , a<n) ≟fin (zero , b<n) = no  ())
    (succ a , a<n) ≟fin (succ b , b<n) with a ≟nat b
    ... | yes idp rewrite <-prop {n}{succ a} a<n b<n = yes (pair= (idp , idp))
    ... | no ¬p = no  r  ⊥-elim (¬p (nat-succ-inj (π₁ (Σ-componentwise r)))))

  open FinDecidable public

  FinIsDec
    :  {k : }
     (n m :  k )
     (n  m) + ((n  m)   )

  FinIsDec {k} (n , p1) (m , p2) with n ≟nat m
  ... | yes idp rewrite <-prop {n = k}{m = n} p1 p2
              = inl (pair= (idp , idp))
  ... | no ¬p = inr  par  ⊥-elim (¬p (ap π₁ par)))
  Fin-is-decidable = FinIsDec
  FinIsSet :  {n : }  isSet ( n )
  FinIsSet   = hedberg FinIsDec
  Fin-is-set = FinIsSet

We can show FinisDec is a proposition. In doing so, we only need to take care of the final coproduct because of the nested pi-types. Now, being a propostion for a coproduct implies we must prove that we can find inhabitants for each type but not for both, that’s the goal below.

  FinIsDec-is-prop
    :  {k : }  isProp ((n m : Fin k)  (n  m) + (n  m   ))

  FinIsDec-is-prop = pi-is-prop  a 
    pi-is-prop  b  +-prop (Fin-is-set _ _)
    (pi-is-prop  p  ⊥-is-prop))
    λ { (a≡b , ¬a≡b)  ¬a≡b a≡b}))
    where
    open HLevelLemmas
  _≠Fin_ :  {k : } (n m :  k )  Type 
  n ≠Fin m = (n  m)   
  fin-pred-sur
    :  {k : }
     (y :  k )
     Σ[ x   k  ] (fin-pred x  y)
  fin-pred-sur {zero}  (0 , ())
  fin-pred-sur {zero}  (succ n , ())
  fin-pred-sur {succ k} (n , p) with k ≟nat n
  fin-pred-sur {succ k} (.k , p)     | yes idp rewrite <-prop {succ k}{k} p (<-succ k) = (zero , ) , idp
  fin-pred-sur {succ k} (0 , unit)   | no ¬p = (1 , k≠0-k>0 ¬p) , idp
  fin-pred-sur {succ k} (succ n , p) | no ¬p rewrite <-prop {succ k}{succ n} p (n⁺<k→n<k {n}{k} (<-suc-suc< p ¬p)) = (succ (succ n) , <-suc-suc< p ¬p) , idp
  fin-pred-IsSurjection
    :  {n : }  isSurjection (fin-pred {n})
  fin-pred-IsSurjection b =  (fin-pred-sur b) 
  fin-pred-equiv fin-pred-≃ :  {n : }   n    n 
  fin-pred-equiv {n}
    = Bijection (FinIsSet {n}) (FinIsSet {n}) fin-pred (fin-pred-inj , fin-pred-IsSurjection)
  fin-pred-≃ = fin-pred-equiv
  fin-pred⁻¹  fin-suc : {n : }   n    n 
  fin-pred⁻¹ = remap fin-pred-equiv
  fin-suc = fin-pred⁻¹
  fin-pred∘inverse-of-fin-pred
    :  {n : }
     (x :  n )
     fin-pred (fin-pred⁻¹ x)  x
  fin-pred∘inverse-of-fin-pred {n} x = (∙→∘∙← fin-pred-equiv) {b = x}
  inverse-of-fin-pred∘fin-pred
    : {n : }
     (x :  n )
     (fin-pred⁻¹ (fin-pred x))  x
  inverse-of-fin-pred∘fin-pred {n} x = (∙←∘∙→ fin-pred-equiv) {a = x}
  fin-pred-is-fin-pred
    : (n : )
     (fin-pred-equiv {n = succ (succ (succ n))} )  fin-pred
  fin-pred-is-fin-pred n = idp
  fin-suc︔fin-pred∼id
    :  {n : }  (fin-pred {n}  fin-suc {n})  id
  fin-suc︔fin-pred∼id {n} = lrmap-inverse-h (fin-pred-≃ {n})
  fin-pred︔fin-suc∼id
    :  {k : }  (fin-suc {k}  fin-pred {k})  id
  fin-pred︔fin-suc∼id {k} = rlmap-inverse-h (fin-pred-≃ {k})
  fin-suc-is-equiv :  {n : }    n     n 
  fin-suc-is-equiv
    = qinv-≃ fin-suc
      (fin-pred ,  _  inverse-of-fin-pred∘fin-pred _)
      , λ _  fin-pred∘inverse-of-fin-pred _)


  fin-suc-inj
    :  {k : }  {x y :  k }
     fin-suc x  fin-suc y
    -------------------------
     x  y

  fin-suc-inj {x = x}{y} p
    = ! (lrmap-inverse-h fin-pred-equiv x) · q ·  lrmap-inverse-h fin-pred-equiv y
    where
    q : fin-pred (fin-suc x)  fin-pred (fin-suc y)
    q = ap fin-pred p
  abstract
    fin-suc^-to-fin-pred^
      :  {n : }
       (k k' :  n )
       (x : )
       (fin-suc {n} ^ x) k  k'
       k  (fin-pred ^ x) k'

    fin-suc^-to-fin-pred^ k k' 0 p = p
    fin-suc^-to-fin-pred^ k k' (succ x) p = IH · ! app-comm fin-pred x _
      where
      IH : k  (fin-pred ^ x) (fin-pred k')
      IH = fin-suc^-to-fin-pred^ k (fin-pred k') x
            ((! fin-pred∘inverse-of-fin-pred _  ) · ap fin-pred p)
  abstract
    fin-pred^-to-fin-suc^
      :  {n : }
       (k k' :  n )
       (x : )
       (fin-pred {n} ^ x) k  k'
       k  (fin-suc ^ x) k'

    fin-pred^-to-fin-suc^ {n} k k' 0 p = p
    fin-pred^-to-fin-suc^ {n} k k' (succ x) p = IH · ! app-comm fin-suc x _
      where
      IH : k  (fin-suc ^ x) (fin-suc k')
      IH = fin-pred^-to-fin-suc^ k (fin-suc k') x
            ((! inverse-of-fin-pred∘fin-pred _  ) · ap fin-suc p)
  abstract
    +ₙ-to-fin-suc
      :  {n : }
       (k k' :  n )
       (e : )  (e < n)
       (π₁ k) +ₙ e  (π₁ k')
       (fin-suc ^ e) k  k'

    +ₙ-to-fin-suc {succ n} (zero , ) (zero , ) zero = λ _ _  idp
    +ₙ-to-fin-suc {succ n} (zero , ) (succ k' , p') zero p ()
    +ₙ-to-fin-suc {succ n} (succ k , p) (zero , ) zero = λ _ ()
    +ₙ-to-fin-suc {succ n} (succ k , p) (succ .(plus k 0) , p') zero  idp
      rewrite plus-runit k = pair= (idp , <-prop {n = n}{m = k} p p') --FIXME: replace this rewrite

    +ₙ-to-fin-suc {succ n} (zero , ) (zero , ) (succ pa) = λ _ ()
    +ₙ-to-fin-suc {succ n} (succ k , p) (zero , ) (succ pa) q ()

    +ₙ-to-fin-suc {n@(succ _)} k@(zero , ) (succ k' , p) (succ x) x<n q
      --FIXME: this is totally a copy of the next proof-step, it's really awful.
      = fin-pred-inj
        $ begin
        fin-pred (fin-suc ((fin-suc ^ x) k))
        ≡⟨ fin-suc︔fin-pred∼id _ 
        (fin-suc {n} ^ x) k
        ≡⟨ +ₙ-to-fin-suc k (k' , o) x o' p1 
        (k' , n⁺<k→n<k {k'}{n} p )
        ≡⟨ p2 
        fin-pred  (succ k' , p)
        
        where
        -- n = bound-of k
        o : k' < n
        o = n⁺<k→n<k {k'}{n} p

        o' : x < n
        o' = (n⁺<k→n<k {x} {n} x<n)

        p1 : (π₁ k) +ₙ x  k'
        p1 = succ-inj q
          where open import foundations.NaturalsType

        p2
          :  {k' n : }{p}
           (k' , n⁺<k→n<k {k'}{n} p)  fin-pred {n} (succ k' , p)
        p2 {zero} {succ n} {p} = idp
        p2 {succ k'} {succ n} {p} = idp
    +ₙ-to-fin-suc {n@(succ _)} k@(succ _ , _) K'@(succ k' , p) (succ x) x<n q
      = fin-pred-inj
      $ begin
        fin-pred (fin-suc ((fin-suc ^ x) k))
          ≡⟨ fin-suc︔fin-pred∼id _ 
        (fin-suc {n} ^ x) k
          ≡⟨ +ₙ-to-fin-suc k (k' , o) x o' p1 
        (k' , n⁺<k→n<k {k'}{n} p )
          ≡⟨ p2 
        fin-pred  (succ k' , p)
        
      where
      -- n = bound-of k
      o : k' < n
      o = n⁺<k→n<k {k'}{n} p

      o' : x < n
      o' = (n⁺<k→n<k {x} {n} x<n)

      p1 : (π₁ k) +ₙ x  k'
      p1 rewrite ! plus-succ (π₁ k) x = succ-inj q
        where open import foundations.NaturalsType

      p2
        :  {k' n : }{p}
         (k' , n⁺<k→n<k {k'}{n} p)  fin-pred {n} (succ k' , p)
      p2 {zero} {succ n} {p} = idp
      p2 {succ k'} {succ n} {p} = idp
  abstract
    +ₙ-to-fin-pred
      :  {n : }
       (k k' :  n )
       (x : )  (x < n)
       (π₁ k) +ₙ x  (π₁ k')
       k  (fin-pred {n} ^ x) k'
    +ₙ-to-fin-pred k k' x x<n p
      = fin-suc^-to-fin-pred^ k k' x (+ₙ-to-fin-suc k k' x x<n p)
  abstract
    succ-pred-comm' :  {n l : }   x
       (fin-pred {n}) ((fin-suc ^ (succ l)) x)
       (fin-suc ^ (succ l)) (fin-pred x)
    succ-pred-comm' {l = l} x =
      begin
      (fin-pred) ((fin-suc ^ (succ l)) x)
        ≡⟨ fin-suc︔fin-pred∼id _ 
      (fin-suc ^ l) x
        ≡⟨ ap ((fin-suc) ^ l) (! (fin-pred︔fin-suc∼id x)) 
      (fin-suc ^ l) (fin-suc (fin-pred x))
        ≡⟨ ! (app-comm fin-suc l _) 
      (fin-suc ^ (succ l)) (fin-pred x)
      
  abstract
    succ-pred-comm''
      :  {n m : }   x
       (fin-suc {n}) ((fin-pred ^ m) x)
       (fin-pred ^ m) (fin-suc x)
    succ-pred-comm'' {m = zero} x = idp
    succ-pred-comm'' {m = succ l} x =
      begin
      (fin-suc) ((fin-pred ^ (succ l)) x)
        ≡⟨ fin-pred︔fin-suc∼id _ 
      (fin-pred ^ l) x
        ≡⟨ ap ((fin-pred) ^ l) (! (fin-suc︔fin-pred∼id x)) 
      (fin-pred ^ l) (fin-pred (fin-suc x))
        ≡⟨ ! (app-comm fin-pred l _) 
      (fin-pred ^ (succ l)) (fin-suc x)
      
  abstract
    succ-pred-comm
      :  {n : }{k l : }
       k < n  l < n
        x
       (fin-pred {n} ^ k) ((fin-suc ^ l) x)
       (fin-suc ^ l) ((fin-pred ^ k) x)

    succ-pred-comm {succ n} {zero} {zero} k<n l<n x = idp
    succ-pred-comm {succ n} {zero} {succ l} k<n l<n x = idp
    succ-pred-comm {succ n} {succ k} {zero} k<n l<n x = idp
    succ-pred-comm {succ n} {succ k} {succ l} k<n l<n x =
      begin
      (fin-pred ^ (succ k)) ((fin-suc ^ (succ l)) x)
        ≡⟨ ap fin-pred IH₁ 
      (fin-pred $ (fin-suc ^ (succ l)) ((fin-pred ^ k) x))
        ≡⟨ succ-pred-comm' {n = succ n }{l = l} _ 
      (fin-suc ^ succ l) (fin-pred ((fin-pred ^ k) x))
        ≡⟨⟩
      (fin-suc ^ (succ l)) ((fin-pred ^ (succ k)) x)
      
      where
      IH₁ : (fin-pred {succ n} ^ k) ((fin-suc ^ (succ l)) x)
         (fin-suc ^ (succ l)) ((fin-pred ^ k) x)

      IH₁ = succ-pred-comm {succ n}{k}{succ l} (n⁺<k→n<k {k}{succ n} k<n)
        (l<n) x
  abstract
    unique-exp-fin-pred
      :  {n : }
       (k : )   (k < n)
       (k' : )  (k' < n)
       (fin-pred ^ k)  (fin-pred {n} ^ k')
      --------------------------------------
       k  k'

    unique-exp-fin-pred 0 _ 0 _ _ = idp
    unique-exp-fin-pred {0} 0 _ (succ k') k'< _ = ⊥-elim (n<0 {}{n = succ k'} k'<)
    unique-exp-fin-pred {(succ n)} 0 q (succ k') k'< p = ap proj₁
          (begin
            (0 , q)
              ≡⟨ !  happly o (0 , q) 
            (fin-suc ^ (succ k')) (0 , q)
              ≡⟨ +ₙ-to-fin-suc {(succ n)} _ _ (succ k') k'< idp 
            (succ k' , k'<)
      )
      where
      open import foundations.FunExtAxiom
      o : fin-suc {succ n} ^ (succ k')   id
      o = funext  z  ! fin-pred^-to-fin-suc^ z z (succ k') (happly (! p) z))
    -- -- The following is symmetric case of the aboe.
    unique-exp-fin-pred {succ n} (succ k) k+< 0 p q
      = ! ap proj₁
          (begin
            (0 , p)
              ≡⟨ !  happly o (0 , p) 
            (fin-suc ^ (succ k)) (0 , p)
              ≡⟨ +ₙ-to-fin-suc  _ _ (succ k) k+< idp 
            (succ k , k+<)
      )
      where
      open import foundations.FunExtAxiom
      o : fin-suc {succ n} ^ (succ k)   id
      o = funext  z  ! fin-pred^-to-fin-suc^ z z (succ k) (happly q z))

    unique-exp-fin-pred {succ n} (succ k) k+< (succ k') k'+<  p
      = ap succ IH
      where
      n' : 
      n' = bound {k = succ k} k+<

      open import foundations.FunExtAxiom
      IH : k  k'
      IH = unique-exp-fin-pred  k
        (n⁺<k→n<k {n = k}{k = n'} k+<) k'
        (n⁺<k→n<k {n = k'}{k = n'} k'+<)
        (funext  a  fin-pred-inj $ happly p a))
  abstract
    change-point-fin-pred'
      :  {n k : }
       k < n
       (fin-pred {n} ^ k)  id
       k  0
    change-point-fin-pred' {zero} {k} k< p   = ⊥-elim (n<0 {} {n = k} k<)
    change-point-fin-pred' {succ n} {k} k< p = unique-exp-fin-pred k k< 0  p
    change-point-fin-pred
      :  {n k : } {x :  n }
       k < n
       (fin-pred ^ k) x  x
       k  0
    change-point-fin-pred {succ n} {zero}  p = idp
    change-point-fin-pred {succ n} {k@(succ _)} {(x , x<n)} k<n p
      = change-point-fin-pred' k<n (funext o)
      where
      open import foundations.FunExtAxiom

      o :  y  (fin-pred {succ n} ^ k) y  y
      o (y , y<)
        with trichotomy x y
      ... | inl (inl x≡y) rewrite ! x≡y | <-prop {succ n}{x} y< x<n = p
      ... | inl (inr x<y) =
        begin
        (fin-pred ^ k) (y , y<)
          ≡⟨ ap (fin-pred ^ k) (! s^lx≡y) 
        (fin-pred ^ k) ((fin-suc  ^ l) (x , x<n))
          ≡⟨ succ-pred-comm {n = succ n}{k = k}{l = l} k<n l<sucn (x , x<n) 
        (fin-suc ^ l) ((fin-pred  ^ k) (x , x<n))
          ≡⟨ ap (fin-suc ^ l) p 
        (fin-suc ^ l) (x , x<n)
          ≡⟨ s^lx≡y 
        (y , y<)
        
        where
        find-l :   (\l  (x +ₙ l  y) × (0 < l))
        find-l = find-x-to-< x<y

        l : 
        l = proj₁ find-l
        l≡ : x +ₙ l  y
        l≡ = proj₁ (proj₂  find-l)

        sol-2 :   (\o  ((x +ₙ l) +ₙ o  succ n) × (0 < o))
        sol-2 rewrite l≡ = find-x-to-< y<

        sol : 
        sol = proj₁ sol-2
        sol≡ : (x +ₙ l) +ₙ sol  (succ n)
        sol≡ = (proj₂  proj₁) sol-2
        sol>0 : 0 < sol
        sol>0 = proj₂ (proj₂ sol-2)

        x+sol : l +ₙ (x +ₙ sol)  succ n
        x+sol = (plus-assoc l x sol) · ap (_+ₙ sol) (plus-comm l x) · sol≡

        x+sol>0 : (x +ₙ sol) > 0
        x+sol>0 rewrite plus-comm x sol = +>0 {sol}{x} sol>0

        l<sucn : l < succ n
        l<sucn = +≡-to-< {l}{succ n} ((x +ₙ sol) , x+sol) x+sol>0

        s^lx≡y : (fin-suc ^ l) ((x , x<n))  (y , y<)
        s^lx≡y = (+ₙ-to-fin-suc (x , x<n) (y , y<) l l<sucn l≡)

      ... | inr y<x =
        begin
          (fin-pred ^ k) (y , y<)
            ≡⟨ ap (fin-pred ^ k) y≡p^lx 
          (fin-pred ^ k) ((fin-pred ^ l) ((x , x<n)))
          ≡⟨ app-comm₃ fin-pred k l _ 
          (fin-pred ^ l) ((fin-pred ^ k) (x , x<n))
          ≡⟨ ap (fin-pred ^ l) p 
          (fin-pred ^ l) (x , x<n)
          ≡⟨ ! y≡p^lx 
          (y , y<)
        
        where
        find-l :   (\l  (y +ₙ l  x) × ((0 < l)))
        find-l =  find-x-to-< y<x
        l : 
        l = proj₁ find-l

        l≡ : y +ₙ l  x
        l≡ = proj₁ (proj₂  find-l)

        sol-2 :   (\o  ((y +ₙ l) +ₙ o  succ n) × (0 < o))
        sol-2 rewrite l≡ = find-x-to-< x<n

        sol : 
        sol = proj₁ sol-2
        sol≡ : ((y +ₙ l) +ₙ sol  succ n)
        sol≡ = (proj₂  proj₁) sol-2

        sol>0 : 0 < sol
        sol>0 = proj₂ (proj₂ sol-2)

        y+sol : l +ₙ (y +ₙ sol)  succ n
        y+sol = (plus-assoc l y sol) · ap (_+ₙ sol) (plus-comm l y) · sol≡

        y+sol>0 : (y +ₙ sol) > 0
        y+sol>0 rewrite plus-comm y sol = +>0 {sol}{y} sol>0

        l<sucn : l < succ n
        l<sucn = +≡-to-< {l}{succ n} ((y +ₙ sol) , y+sol) y+sol>0

        y≡p^lx :  (y , y<)   (fin-pred ^ l) ((x , x<n))
        y≡p^lx =  (+ₙ-to-fin-pred (y , y<) ((x , x<n)) l l<sucn l≡)
    change-base
      :  {n : }{k m :  n }
       π₁ k  π₁ m
       (a x :  n )
       (fin-pred {n} ^ (π₁ k)) a  a
       (fin-pred {n} ^ (π₁ m)) x  x


    change-base {n}{k}{m} idp a x p
      rewrite change-point-fin-pred {n}{π₁ k} {x = a} (π₂ k) p = idp
    unique-exp-pred
      :  {n : }
       (k : )   (k < n)
       (k' : )  (k' < n)
       (x :  n )
       (fin-pred ^ k) x  (fin-pred {n} ^ k') x
      --------------------------------------
       k  k'
    unique-exp-pred 0 _ 0 _ _ _ = idp
    unique-exp-pred {0} 0 _ (succ k') k'< _ _  = ⊥-elim (n<0 {} {n = succ k'} k'<)
    unique-exp-pred {(succ n)} 0 q (succ k') k'< x f
      = ap proj₁
          (begin
            (0 , q)
              ≡⟨ fin-pred^-to-fin-suc^ (zero , ) (zero , ) (succ k') aux 
            (fin-suc ^ (succ k')) (0 , q)
              ≡⟨ +ₙ-to-fin-suc {(succ n)} _ _ (succ k') k'< idp 
            (succ k' , k'<)
      )
      where
      aux : (fin-pred {succ n} ^ (succ k')) (zero , )  (zero , )
      aux = change-base {succ n}{succ k' , k'<}{succ k' , k'<} idp x (zero , ) (! f)

    unique-exp-pred {succ n} (succ k) k+< 0 p q f
      =  ! ap proj₁
          (begin
            (0 , p)
              ≡⟨ fin-pred^-to-fin-suc^ (zero , ) (zero , ) (succ k) aux 
            (fin-suc ^ (succ k)) (0 , p)
              ≡⟨ +ₙ-to-fin-suc {(succ n)} _ _ (succ k) k+< idp 
            (succ k , k+<)
      )
      where
      aux : (fin-pred {succ n} ^ (succ k)) (zero , )  (zero , )
      aux = change-base {succ n}{succ k , k+<}{succ k , k+<} idp q (zero , ) f

    unique-exp-pred {succ n} (succ k) k+< (succ k') k'+< x p =
      ap succ
        (unique-exp-pred {succ n} k ((n⁺<k→n<k {n = k}{k = succ n} k+<))
                        k' ((n⁺<k→n<k {n = k'} k'+<)) x (fin-pred-inj p))

    fin-exp-is-unique
      :  {n : }
       (k k' :  n )
       (x :  n )
       (fin-pred ^ (π₁ k)) x  (fin-pred {n} ^ (π₁ k')) x
       k  k'
    fin-exp-is-unique {n} (k , k<n) (k' , k'<n) x p
      =  pair= (k≡k' , oo k≡k')
      where
      k≡k' : k  k'
      k≡k' = unique-exp-pred {n} k k<n k' k'<n x p

      oo :   (o : k  k')  k<n  k'<n [  m  m < n) / o ]
      oo idp =  <-prop {n}{k} k<n k'<n


    fin-is-unique-fin-pred^
      :  {n : }
       (k k'  :  n )
       fin-pred ^ (π₁ k)  fin-pred {n} ^ (π₁ k')
       k  k'
    fin-is-unique-fin-pred^ {n} k k' p
      = pair= (o , oo o)
      where
      o : π₁ k  π₁ k'
      o = (unique-exp-fin-pred (π₁ k) (π₂ k) (π₁ k') (π₂ k') p)

      oo :  (o :  π₁ k  π₁ k')   π₂ k  π₂ k' [  m  m < n) / o ]
      oo idp = <-prop {n}{π₁ k} (π₂ k) (π₂ k')
    p^a-on-a≡0
      :  {n : }{a : }
       (a< : a < succ n)
       (fin-pred {succ n} ^ a) (a , a<)  (0 , unit )


    p^a-on-a≡0 {zero} {zero} a<n = idp
    p^a-on-a≡0 {zero} {succ zero} a<n = idp
    p^a-on-a≡0 {zero} {succ (succ a)} ()
    p^a-on-a≡0 {succ n} {zero}  = idp
    p^a-on-a≡0 {succ n} {succ a} a+<n+
      = begin fin-pred ((fin-pred ^ a) (succ a , a+<n+))
      ≡⟨ app-comm fin-pred a (succ a , a+<n+) 
      (fin-pred ^ a) (fin-pred (succ a , a+<n+))
      ≡⟨ ap (fin-pred ^ a) idp 
      (fin-pred ^ a) (a , a+<n)
      ≡⟨ p^a-on-a≡0 {succ n}{a} a+<n 
      (0 , unit) 
      where
      a+<n : a <  succ (succ n)
      a+<n = n⁺<k→n<k {a}{succ (succ n)} a+<n+
    p^l0≡b
      :  {n l b : }
       b +ₙ l  succ n
       (b<n+ : b < succ n)
       (fin-pred {succ n} ^ l) (0 , unit)  (b , b<n+)


    p^l0≡b {zero} {zero} {succ b} p b<n+
      rewrite (plus-runit (succ b))
      = ⊥-elim {}{} (n<0 {n = b} b<n+)
    p^l0≡b {zero} {succ .0} {zero} idp  = idp
    p^l0≡b {zero} {succ l} {succ b} p b<n+ = ⊥-elim {ℓ₁ = }{} (n<0 {n = b} b<n+)
    p^l0≡b {succ n} {zero} {succ b} p b<n+
        = ⊥-elim (<-=-→⊥ {succ b}{succ (succ n)} b<n+
                ((! (plus-runit (succ b))) · (p)))
    p^l0≡b {succ n} {succ .(succ n)} {zero} idp  =
      begin
      fin-pred ((fin-pred ^ (succ n)) (0 , ))
      ≡⟨ ap fin-pred (p^l0≡b {l = succ n}{b = 1} idp ) 
      fin-pred (fin-suc (zero , unit))
      ≡⟨ fin-suc︔fin-pred∼id _ 
      (zero , unit) 
    p^l0≡b {succ n} {succ l} {succ b} p b<n+
      =
      fin-pred ((fin-pred ^ l) (0 , ))
      ≡⟨ app-comm fin-pred l (zero , ) 
      (fin-pred ^ (l)) (fin-pred (0 , unit))
      ≡⟨ ap (fin-pred ^ l) idp 
      (fin-pred ^ (l)) (succ n , <-succ n)
      ≡⟨ ! +ₙ-to-fin-pred {succ (succ n)} (succ b , b<n+) (succ n , <-succ n) l
      oo o 
      succ b , b<n+ 
        where
        o : (succ b) +ₙ l  succ n
        o = succ-inj (plus-succ (succ b) l · p)

        oo : l < succ (succ n)
        oo = <-trans {l}{succ l}{succ (succ n)}(<-succ l)
          (+≡-to-< {succ l}{succ (succ n)}
          (succ b , (plus-comm (succ l) (succ b) · p)) )
  unique-sol-if-exists-with-pred
    : {n : }
     (x :  n )
     (y :  n )    (x  fin-pred y)
     (y' :  n )   (x  fin-pred y')
     (y  y')
  unique-sol-if-exists-with-pred x y x≡y y' x≡y' = fin-pred-inj $ ! x≡y · x≡y'


  unique-sol-if-exists-with-suc
    : {n : }
     (x :  n )
     (y :  n )    (x  fin-suc y)
     (y' :  n )   (x  fin-suc y')
     (y  y')
  unique-sol-if-exists-with-suc x y x≡y y' x≡y' =  fin-suc-inj $ ! x≡y · x≡y'
  𝟚-≃-⟦2⟧
    : 𝟚    2 
  𝟚-≃-⟦2⟧ = qinv-≃ f (g ,
     { (zero , π₄)  idp ; (succ zero , )  idp ; (succ (succ π₃) , π₄)  ⊥-elim (n<0 {}{n = π₃} π₄)})
    , λ { 𝟘₂  idp ; 𝟙₂  idp})
    where
    f = λ { 𝟘₂  (0 , ) ; 𝟙₂  (1 , )}
    g = λ { (zero , )  𝟘₂ ; (succ _ , _)  𝟙₂}

I need to use the pingeon hole principle, but that lemma uses another definition.

  module _ where
    Fin₁ = Fin

    Fin₂ = ⟦_⟧₂ {}
    ⟦_⟧' = ⟦_⟧₂ {}

    Fin₁→Fin₂
      : {n : }
       Fin₁ n  Fin₂ n
    Fin₁→Fin₂ {n = succ n} (zero , p) = inl 
    Fin₁→Fin₂ {n = succ n} (succ m , sm<sn) = inr (Fin₁→Fin₂ {n} (m , sm<sn))

    Fin₂→Fin₁
      : {n : }
       Fin₂ n  Fin₁ n
    Fin₂→Fin₁ {succ n} (inl ) = (zero , )
    Fin₂→Fin₁ {succ n} (inr i') = succ (proj₁ i) , proj₂ i
      where
      i =  (Fin₂→Fin₁ i')

    private
      h1 :  n   (x :  succ n ⟧₂)
         Fin₁→Fin₂ (Fin₂→Fin₁ x)  x
      h1 n (inl ) = idp
      h1 (succ n) (inr x) = ap inr (ap Fin₁→Fin₂ uic · h1 n x)
        where
        uic : (π₁ (Fin₂→Fin₁ x) , π₂ (Fin₂→Fin₁ x))  (Fin₂→Fin₁ x)
        uic = idp

      h2 :  n  (x : Fin₁ n)  Fin₂→Fin₁ (Fin₁→Fin₂ x)  x
      h2 (succ n) (zero , ) = idp
      h2 (succ n) (succ m , p)
        = pair= ((ap succ (ap proj₁ helper) , <-prop {n = n}{m} _ p))
        where
        helper : Fin₂→Fin₁ (Fin₁→Fin₂ (m , p))  (m , p)
        helper = h2 n (m , p)

    Fin₁≃Fin₂
      : (n : )
      --------------------
       (Fin₁ n)  (Fin₂ n)

    Fin₁≃Fin₂  zero = qinv-≃   {(zero , ()) ; (succ _ , ())})
                                      (  {()}) ,  {()}) , λ {(zero , ()) ; (succ _ , ())})
    Fin₁≃Fin₂  (succ n) = qinv-≃ (Fin₁→Fin₂ {n = succ n}) (Fin₂→Fin₁ , h1 n , h2 (succ n))



    module palomar-principle where
      _─_  :  { : Level}  (A : Type ) (x : A)  Type 
      _─_  {} A x  =  A  a  ((a  x)   ))

      e→ :  n  (x :  succ n ⟧')
        --------------------------
          n ⟧'   succ n ⟧'  x

      e→ (succ n) (inl _) y = inr y , λ ()
      e→ (succ n) (inr x) (inl _) = inl _ , λ ()
      e→ (succ n) (inr x) (inr y)
        = (inr (π₁ (e→ n x y))) , λ p  π₂ (e→ n x y) (inr-is-injective p)

      e←
        :  (n : )  (x :  succ n ⟧')
          ----------------------------
         ( succ n ⟧'  x)   n ⟧'

      e← 0 (inl ) (inl  , b) =  ⊥-elim (b idp)
      e← (succ n) (inl _) (inl _ , b) = inl _
      e← (succ n) (inr x) (inl _ , π₄) = inl _
      e← (succ n) (inl x) (inr y , b) = y
      e← (succ n) (inr x) (inr y , inry≠inrx) = inr (e← n x (y , λ y≡x  inry≠inrx (ap inr y≡x)))

      e←:>e→
          :  (n : )  (x :  succ n ⟧')
           (e← n  x) :> (e→ n x)  id
      e←:>e→ 0 (inl ) (inl  , π₄) = ⊥-elim $ π₄ (ap inl idp)
      e←:>e→ (succ n) (inl _) (inl _ , π₄) = ⊥-elim (π₄ (ap inl idp))
      e←:>e→ (succ n) (inl _) (inr x₁ , π₄) = pair= (idp , pi-is-prop  a x ())  ()) π₄)
      e←:>e→ (succ n) (inr (inl _)) (inl _ , π₄) =  pair= (idp , pi-is-prop  a x ())  ()) π₄)
      e←:>e→ (succ n) (inr (inl x)) (inr y , inry≠inrx)
        = pair= ((ap inr (ap π₁ helper) , pi-is-prop  a  ⊥-is-prop) _ inry≠inrx))
        where
        helper : _
        helper = e←:>e→ n (inl x) (y , λ y≡inlx  inry≠inrx (ap inr y≡inlx))

      e←:>e→ (succ n) (inr (inr x)) (inl _ , π₄) = pair= (idp , pi-is-prop  a x ())  ()) π₄)
      e←:>e→ (succ n) (inr (inr x)) (inr y , inry≠inrx) = pair= (ap inr (ap π₁ helper)
        , pi-is-prop  a  ⊥-is-prop) _ inry≠inrx)
        where
        helper : _
        helper = e←:>e→ n (inr x) (y , λ y≡inlx  inry≠inrx (ap inr y≡inlx))

      e→:>e←
          :  (n : )  (x :  succ n ⟧')
           (e→ n  x) :> (e← n x)  id

      e→:>e← (succ n) (inl ) _ = idp
      e→:>e← (succ n) (inr x) (inl x₁) = idp
      e→:>e← (succ n) (inr x) (inr y)
        = ap inr (ap (e← n x) (pair= (idp , pi-is-prop  _  ⊥-is-prop) _ _)) · helper)
        where
        helper : _
        helper = e→:>e← n x y

      e
        :  (n : )  (x :  succ n ⟧')
        --------------------------
          n ⟧'  ( succ n ⟧'  x)

      e 0 (inl x) = qinv-≃ (λ{()}) ((λ { (inl  , π₄)  ⊥-elim (π₄ idp)} )
          ,  {(inl * , π₄)  ⊥-elim (π₄ idp)}) , λ {()})
      e (succ n) x = qinv-≃ (e→ (succ n) x) ((e← (succ n) x )
              , (e←:>e→ (succ n) x , e→:>e← (succ n) x))


      e-is-bijection
        :  (n : )  (x :  succ n ⟧')
         isBijection (apply $ e n x)
          ⟦⟧₂-is-set
          (∑-set ⟦⟧₂-is-set
           p  pi-is-set  _  𝟘-is-set)))

      e-is-bijection n x
        = ≃-to-bijection ⟦⟧₂-is-set (∑-set ⟦⟧₂-is-set
                          p  pi-is-set  _  𝟘-is-set))) (e n x)


      inv-e-is-bijection
        :  (n : )  (x :  succ n ⟧')
         isBijection (apply $ ≃-sym $ e n x)
          (∑-set ⟦⟧₂-is-set  p  pi-is-set  _  𝟘-is-set))) ⟦⟧₂-is-set

      inv-e-is-bijection n x
        = ≃-to-bijection (∑-set ⟦⟧₂-is-set  p  pi-is-set  _  𝟘-is-set))) ⟦⟧₂-is-set (≃-sym $ e n x)

      palomar'
        :  (n : )   (f :  succ n ⟧'   n ⟧' )
        ----------------------------------------
         ¬ (isInjective f)

      palomar' 0 f _ = f (inl unit)
      palomar' (succ n) f f-is-inj  = palomar' n g g-is-injective
        where
        h : ( succ (succ n) ⟧'  inl unit)  ( succ n ⟧'  (f (inl unit)))
        h w@(a , b) = (f a , λ b  π₂ w $ f-is-inj b)

        h-is-inj : isInjective h
        h-is-inj {a₁ , b₁} {(a₂ , b₂)} p
          = pair=
            (f-is-inj (ap π₁ p) ,
            pi-is-prop  a x ()) (tr _ (f-is-inj (ap π₁ p)) b₁) b₂)

        g :  succ n ⟧'   n ⟧'
        g = lemap (e (succ n) (inl )) :> (h :> remap (e n (f (inl ))))

        g-is-injective : isInjective g
        g-is-injective = ∘-injectives-is-injective _ (π₁ $ e-is-bijection _ _) _
                   (∘-injectives-is-injective _ h-is-inj  _ (π₁ $ inv-e-is-bijection _ _))


      pigeon-theorem
        :  (n m : )
         (m < n)  (f :  n ⟧'   m ⟧')
         ¬ (isInjective f)

      pigeon-theorem (succ n) 0        f f-is-inj = f (inl )
      pigeon-theorem (succ n) (succ m) p f f-is-inj
        = pigeon-theorem n m (succ-<-inj {n = m} p) g g-is-injective
       where
       h : ( succ n ⟧'  inl unit)  ( succ m ⟧'  (f (inl unit)))
       h w@(a , b) = (f a , λ b  π₂ w $ f-is-inj b)

       h-is-inj : isInjective h
       h-is-inj {a₁ , b₁} {(a₂ , b₂)} p
         = pair= (f-is-inj (ap π₁ p)
                 , pi-is-prop  a x ()) (tr _ (f-is-inj (ap π₁ p)) b₁) b₂)

       g :  n ⟧'   m ⟧'
       g = lemap (e n (inl )) :> h :> remap (e m (f (inl )))

       g-is-injective : isInjective g
       g-is-injective =
         ∘-injectives-is-injective _ (π₁ $ e-is-bijection _ _) _
           (∘-injectives-is-injective _ h-is-inj  _
             (π₁ $ inv-e-is-bijection _ _))

    Fin-inj-aux-≃ :  {n m : }  n < m   m ⟧'   n ⟧'   
    Fin-inj-aux-≃ {n = n}{m} n<m f-≃ = pigeon-theorem m n n<m (apply f-≃) (proj₁ f-is-bij)
      where
      open palomar-principle
      f = apply f-≃
      f-is-bij : isBijection f ⟦⟧₂-is-set ⟦⟧₂-is-set
      f-is-bij = rapply (isBijection-≃-isEquiv {A =  m ⟧'}{ n ⟧'}
                          ⟦⟧₂-is-set ⟦⟧₂-is-set f) (proj₂ f-≃)


    Fin-inj-aux :  {n m : }  n < m   m ⟧'   n ⟧'   
    Fin-inj-aux {n = n}{m} n<m f-≡ = Fin-inj-aux-≃ n<m (idtoeqv f-≡)
      where
      open import foundations.UnivalenceAxiom using (idtoeqv)

    Fin₂-is-inj-≃
      :  (n m : )
        n ⟧'   m ⟧'
      -----------------
       n  m

    Fin₂-is-inj-≃  n m e
        with trichotomy n m
    ... | inl (inl idp) = idp
    ... | inl (inr n<m) = ⊥-elim (Fin-inj-aux-≃ n<m (≃-sym e))
    ... | inr m<n = ⊥-elim (Fin-inj-aux-≃ m<n e)


    Fin₂-is-inj
      :  (n m : )
        n ⟧'   m ⟧'
      -----------------
       n  m

    Fin₂-is-inj n m p = Fin₂-is-inj-≃ n m (idtoeqv p)
      where
      open import foundations.UnivalenceAxiom using (idtoeqv)

    Fin₁-is-inj-≃
      :  (n m : )
        n    m 
       n  m
    Fin₁-is-inj-≃ n m e = Fin₂-is-inj-≃ n m
      (≃-trans (≃-sym (Fin₁≃Fin₂ n))
        (≃-trans e (Fin₁≃Fin₂ m)))

    Fin₁-is-inj
      :  (n m : )
        n    m 
      ---------------
       n  m
    Fin₁-is-inj n m p = Fin₁-is-inj-≃ n m (idtoeqv p)
      where
      open import foundations.UnivalenceAxiom using (idtoeqv)

Latest changes

(2022-12-28)(57c278b4) Last updated: 2021-09-16 15:00:00 by jonathan.cubides
(2022-07-06)(d3a4a8cf) minors by jonathan.cubides
(2022-01-26)(4aef326b) [ reports ] added some revisions by jonathan.cubides
(2021-12-20)(049db6a8) Added code of cubical experiments. by jonathan.cubides
(2021-12-20)(961730c9) [ html ] regular update by jonathan.cubides
(2021-12-20)(e0ef9faa) Fixed compilation and format, remove hidden parts by jonathan.cubides
(2021-12-20)(5120e5d1) Added cubical experiment to the master by jonathan.cubides
(2021-12-17)(828fdd0a) More revisions added for CPP by jonathan.cubides
(2021-12-15)(0d6a99d8) Fixed some broken links and descriptions by jonathan.cubides
(2021-12-15)(662a1f2d) [ .gitignore ] add by jonathan.cubides
(2021-12-15)(0630ce66) Minor fixes by jonathan.cubides
(2021-12-13)(04f10eba) Fixed a lot of details by jonathan.cubides
(2021-12-10)(24195c9f) [ .gitignore ] ignore .zip and arxiv related files by jonathan.cubides
(2021-12-09)(538d2859) minor fixes before dinner by jonathan.cubides
(2021-12-09)(36a1a69f) [ planar.pdf ] w.i.p revisions to share on arxiv first by jonathan.cubides