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
{-# OPTIONS --without-K --exact-split #-} open import foundations.BasicTypes using (Level) module foundations.Nat (ℓ : Level) where open import foundations.Core open import foundations.NaturalsTypeOrdering
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 = {!!} -}
(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