foundations.Nat.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.BasicTypes using (Level)

module foundations.Nat (ℓ : Level)
  where
  open import foundations.Core
  open import foundations.NaturalsType
Ordering
  module dec-< where
    open ℕ-ordering ℓ
    _?<_ : (Decidable {A = ℕ}{B = ℕ} _<_)
    zero ?< zero     = no (λ z → z)
    zero ?< succ b   = yes ∗
    succ a ?< zero   = no (λ z → z)
    succ a ?< succ b = a ?< b

  open ℕ-ordering ℓ public
  <-succ
    : (k : ℕ)
    → k < succ k

  <-succ zero     = unit
  <-succ (succ k) = <-succ k

  <-inj
    : ∀ {n m : ℕ}
    → (succ m < n)
    → m < n
  <-inj {zero} {zero} p = p
  <-inj {zero} {succ m} p = p
  <-inj {succ n} {zero} p = ★
  <-inj {succ n} {succ m} p = <-inj {n}{m} p
  positive-is-suc-of
    : ∀ (n : ℕ)
    → n > 0
    → ∑[ k ∶ ℕ ] (succ k ≡ n)
  positive-is-suc-of zero ()
  positive-is-suc-of (succ k) ∗ = k , idp
  mono-succ
    : ∀ {n m : ℕ}
    → n < m
    → succ n < succ m
  mono-succ {n}{m} x = x
  succ-<-remove
    : ∀ {n m}
    → succ n < succ m
    → n < m
  succ-<-remove {0} {succ m} ∗ = ∗
  succ-<-remove {succ n} {succ m} p
   = mono-succ {n}{m} (succ-<-remove {n}{m} p)
  <-trans
    : ∀ {x y z : ℕ}
    → x < y → y < z
    → x < z
  <-trans {zero} {succ y} {succ z} x<y y<z = ∗
  <-trans {succ x} {succ y} {succ z} x<y y<z
    = mono-succ {x}{z} (<-trans {x}{y}{z} (succ-<-remove {x}{y} x<y) (succ-<-remove {y}{z} y<z))
  +>0
    : ∀ {x y : ℕ}
    → 0 < x
    → 0 < (x +ₙ y)
  +>0 {succ x} {zero} 0<x = ∗
  +>0 {succ x} {succ y} 0<x = ∗
  n⁺<k→n<k
    : ∀ {n k : ℕ}
    → succ n < k
    → n < k
  n⁺<k→n<k {zero} {zero} m = m
  n⁺<k→n<k {zero} {succ k} m = ★
  n⁺<k→n<k {succ n} {zero} ()
  n⁺<k→n<k {succ n} {succ k} m = n⁺<k→n<k {n}{k} m
  <-prop
    : {n m : ℕ}
    → (p1 p2 : m < n)
    → p1 ≡ p2
  <-prop {zero} {zero} () p2
  <-prop {zero} {succ m} () p2
  <-prop {succ n} {zero} unit unit = idp
  <-prop {succ n} {succ m} p1 p2 = <-prop {n}{m} p1 p2
  n=m-is-prop
    : {n m : ℕ}
    → isProp (n ≡ m)
  n=m-is-prop {n}{m} p q = nat-is-set n m p q
  n=m-is-set
    : {n m : ℕ}
    → isSet (n ≡ m)
  n=m-is-set = prop-is-set n=m-is-prop
  pre : ℕ → ℕ
  pre zero     = zero
  pre (succ n) = n
  <and=→⊥
    : ∀ {m : ℕ}
    → zero < m
    → (zero ≡ m)
    → ⊥ ℓ
  <and=→⊥ {zero} ()
  <and=→⊥ {succ m} x ()
  succ-n>0
    : {n : ℕ}
    → 0 < succ n
  succ-n>0 {0}     = unit
  succ-n>0 {succ n} = unit
  n<0
    : ∀ {ℓ} → {n : ℕ}
    → (n < 0) → ⊥ ℓ
  n<0 {ℓ = ℓ} {zero} ()
  n<0 {ℓ = ℓ} {succ n} ()
  n≠0
    : ∀ {n : ℕ}
    → ¬ (n ≡ 0)
    → 0 < n
  n≠0 {zero} p = ⊥-elim (p idp)
  n≠0 {succ n} p = unit
  trichotomy
    : (x y : ℕ)
    → ((x ≡ y) + (x < y)) + (y < x)
  trichotomy zero zero = inl (inl idp)
  trichotomy zero (succ y) = inl (inr unit)
  trichotomy (succ x) zero = inr unit
  trichotomy (succ x) (succ y) with trichotomy x y
  ... | inl (inl p) = inl (inl (ap succ p))
  ... | inl (inr p) = inl (inr (mono-succ {x}{y} p))
  ... | inr p = inr $ mono-succ {y}{x} p
  n<n→⊥
    : ∀ {n : ℕ}
    → ¬ (n < n)
  n<n→⊥ {succ n} p = n<n→⊥ {n} (succ-<-remove {n}{n} p)
  k<1→k≡0
    : ∀ {k : ℕ}
    → k < 1
    → k ≡ 0
  k<1→k≡0 {0} p = idp
  k<1→k≡0 {succ 0} p = ⊥-elim $ n<n→⊥ {n = 1} p
  k<1→k≡0 {succ (succ k)} p = ⊥-elim (n<0 {lzero} {n = 0} (succ-<-remove {n = succ k}{m = 0} p))
  <s-to-<=
    : ∀ p q → p < succ q
    → (p ≡ q) + (p < q)
  <s-to-<= zero zero ∗ = inl idp
  <s-to-<= zero (succ q) ∗ = inr ∗
  <s-to-<= (succ p) zero p<q+ = inl (k<1→k≡0 p<q+)
  <s-to-<= (succ p) (succ q) p<q+
    with <s-to-<= p q (succ-<-remove {n = p} p<q+)
  ... | inl idp = inl idp
  ... | inr x = inr x
  <-=-→⊥
    : ∀ {k n : ℕ}
    → k < n
    → k ≡ n
    → ⊥ ℓ
  <-=-→⊥ {0} {.0} () idp
  <-=-→⊥ {succ k} {.(succ k)} p idp = <-=-→⊥ {k = k}{n = k} p idp

  module NatDecidable where
    nat-succ-inj
      : ∀ {n m : ℕ}
      → succ n ≡ succ m
      → n ≡ m
    nat-succ-inj {zero} {zero} = λ _ → idp
    nat-succ-inj {0} {succ m} ()
    nat-succ-inj {succ n} {zero} ()
    nat-succ-inj {succ n} {succ .n} idp = idp
    _≟nat_ : Decidable {A = ℕ} _≡_
    zero ≟nat zero = yes idp
    zero ≟nat succ b = no (λ ())
    succ a ≟nat zero = no (λ ())
    succ a ≟nat succ b with a ≟nat b
    (succ a ≟nat succ b) | yes p = yes (ap succ p)
    (succ a ≟nat succ b) | no ¬p = no λ r → (¬p (nat-succ-inj r))
  open NatDecidable public
  <-suc-suc<
    : ∀ {ℓ}{n k : ℕ}
    → n < k
    → ((k ≡ succ n) → ⊥ ℓ)
    → succ n < k
  <-suc-suc<  {ℓ = ℓ} {zero} {succ zero} ★ ¬p = ⊥-elim (¬p idp)
  <-suc-suc<  {ℓ = ℓ}{zero} {succ (succ k)} ★ ¬p = ★
  <-suc-suc< {ℓ = ℓ} {succ n} {succ k} n<k ¬p = <-suc-suc< {ℓ}{n}{k} n<k λ q → ¬p (ap succ q)
  k≠0-k>0
      : ∀ {ℓ}{k : ℕ}
      →  ((k ≡ 0) → ⊥ ℓ)
      → 0 < k
  k≠0-k>0 {ℓ = ℓ}{zero} ¬p = ⊥-elim (¬p idp)
  k≠0-k>0 {ℓ = ℓ} {succ p} ¬p = ★
  the-obvious
    : {n : ℕ}
    → succ n ≡ n → ⊥ ℓ
  the-obvious {0} ()
  the-obvious {succ n} ()
  n⁺⁺≠n
    : {n : ℕ}
    → succ (succ n) ≡ n → ⊥ ℓ
  n⁺⁺≠n {0} ()
  n⁺⁺≠n {succ n} ()
  n+1≡n⁺
    : {n : ℕ}
    → n +ₙ 1 ≡ succ n
  n+1≡n⁺ {0} = idp
  n+1≡n⁺ {succ n} = ap succ (n+1≡n⁺{n})
  n+1≡m→m=n⁺
    : {n m : ℕ}
    → (n +ₙ 1) ≡ m
    → m ≡ succ n
  n+1≡m→m=n⁺ {n} {.(plus n 1)} idp = n+1≡n⁺{n}
  n+1+1≡n→⊥
    : {n : ℕ}
    → ((n +ₙ 1) +ₙ 1 ≡ n) → ⊥ ℓ
  n+1+1≡n→⊥ {succ n} q rewrite n+1≡n⁺{n} | ! (n+1≡n⁺ {n}) = n⁺⁺≠n {plus n 1} q
  n+1≡mANDn≡m+1→⊥
    : {n m : ℕ}
    → (n +ₙ 1 ≡ m)
    → (n ≡ m +ₙ 1)
    → ⊥ ℓ
  n+1≡mANDn≡m+1→⊥ {n} {.(plus n 1)} idp q = n+1+1≡n→⊥ {n} (sym q)
  _≠ℕ_ : ∀ (n m : ℕ) → Type ℓ
  n ≠ℕ m = (n ≡ m) → ⊥ ℓ
  <k→<k⁺
    : ∀ {n k : ℕ}
    → n < k
    → n < succ k
  <k→<k⁺ {zero} {succ k} x = ★
  <k→<k⁺ {succ n} {succ k} x = <k→<k⁺ {n}{k} x

  ≤-to-<
    : {p q : ℕ}
    → p ≤ q
    → p < succ q
  ≤-to-< {p = p} (inl p<q) = <k→<k⁺ {n = p} p<q
  ≤-to-< {p = p} (inr idp) = <-succ p
  minus : (n k : ℕ) → (k < n) → ℕ
  minus 0 0 ()
  minus 0 (succ k) ()
  minus (succ n) 0 k< = succ n
  minus (succ n) (succ k) k< = succ (minus n k k<)
  +≡-to-<
    : ∀ {k n : ℕ}
    → (sol : ∑ ℕ (\x → k +ₙ x ≡ n))
    → (0 < π₁ sol) → k < n
  +≡-to-< {0} {succ n} (succ x , p) ∗ = ∗
  +≡-to-< {succ k} {succ n} (succ x , p) ∗ = mono-succ {k}{n} IH
    where
    IH : k < n
    IH = +≡-to-< {k}{n} (succ x , succ-inj p) ∗
  to-reach>0
    : ∀ {k x n : ℕ}
    → k < n
    → k +ₙ x ≡ n
    → 0 < x
  to-reach>0 {zero} {succ x} {succ n} k<n k+x≡n = ∗
  to-reach>0 {succ k} {zero} {succ n} k<n k+x≡n
    = ⊥-elim (<-=-→⊥ k<n (! plus-runit (succ k) · k+x≡n))
  to-reach>0 {succ k} {succ x} {succ n} k<n k+x≡n = ∗
  find-x-to-<
    : ∀ {k n : ℕ}
    → k < n
    → ∑ ℕ (\x → (k +ₙ x ≡ n) × (0 < x))
  find-x-to-< {0} {succ n} ∗ = succ n , (idp , ∗)
  find-x-to-< {succ k} {succ n} k<
    with find-x-to-< {k = k}{n = succ n} (<-inj {n = succ n}{m = k} k<)
  ... | 0 , p , 0<sol    rewrite plus-runit k
      = ⊥-elim (<-=-→⊥ (<k→<k⁺ {n = k} k<)  p)
  ... | succ x , p , 0<sol rewrite ! p | plus-comm k (succ x)
      = x , (ap succ (plus-comm k x) , to-reach>0 {k}{x}{n}  k< (succ-inj (ap succ (plus-comm k x) · p)))
  unique-solution-find-x-to-<
    : ∀ {k n : ℕ}
    → k < n
    → (x : ℕ) → (k +ₙ x ≡ n)
    → (x' : ℕ) → (k +ₙ x' ≡ n)
    → x ≡ x'
  unique-solution-find-x-to-< {k = k} k< x p1 x' p2 = +-inj k (p1 · ! p2)
  {-
  _^-ℕ_ : ℕ → ℕ → ℕ
  0 ^-ℕ 0      = 1
  succ a ^-ℕ 0 = 1
  zero ^-ℕ succ b = 0
  succ a ^-ℕ succ b = {!!}
  -}

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