@@ -16,59 +16,46 @@ open <-Reasoning
1616open import Cubical.Tactics.NatSolver
1717open import Cubical.Data.Nat.Bijections.IncreasingFunction
1818
19- double : ℕ → ℕ
20- double n = n + n
21-
2219private
23- 2Sn=2n+2 : {n : ℕ} → double (suc n) ≡ double n + 2
24- 2Sn=2n+2 = solveℕ!
20+ 2Sn=2n+2 : {n : ℕ} → doubleℕ (suc n) ≡ doubleℕ n + 2
21+ 2Sn=2n+2 = +-comm 2 (doubleℕ _)
2522
26- doubleGrows : (n : ℕ) → double n < double (suc n)
27- doubleGrows n = double n
28- ≡<⟨ refl ⟩
29- n + n
30- <≡⟨ <SumLeft ⟩
31- n + n + 2
32- ≡⟨ sym 2Sn=2n+2 ⟩
33- double (suc n) ∎
23+ doubleGrows : (n : ℕ) → doubleℕ n < doubleℕ (suc n)
24+ doubleGrows n = <-trans <-suc <-suc
3425
35- ¬2n+2+k<2n : (n : ℕ) → (k : ℕ) → ¬ ( suc (suc k) + double n < double (suc n))
26+ ¬2n+2+k<2n : (n : ℕ) → (k : ℕ) → ¬ ( suc (suc k) + doubleℕ n < doubleℕ (suc n))
3627 ¬2n+2+k<2n n k p = ex-falso (¬-<-zero k<0) where
37- 2n+k+2<2n+2 : double n + suc (suc k) < double n + 2
38- 2n+k+2<2n+2 = double n + suc (suc k)
39- ≡<⟨ +-comm (n + n) (suc (suc k)) ⟩
40- suc (suc k) + double n
28+ 2n+k+2<2n+2 : doubleℕ n + suc (suc k) < doubleℕ n + 2
29+ 2n+k+2<2n+2 = doubleℕ n + suc (suc k)
30+ ≡<⟨ +-comm (doubleℕ n) (suc (suc k)) ⟩
31+ suc (suc k) + doubleℕ n
4132 <≡⟨ p ⟩
42- double (suc n)
33+ doubleℕ (suc n)
4334 ≡⟨ 2Sn=2n+2 ⟩
44- double n + 2 ∎
35+ doubleℕ n + 2 ∎
4536 k+2<2 : suc (suc k) < suc (suc 0 )
4637 k+2<2 = <-k+-cancel 2n+k+2<2n+2
4738 k<0 : k < 0
4839 k<0 = pred-≤-pred (pred-≤-pred k+2<2)
4940
50- doubleInc : isStrictlyIncreasing double
51- doubleInc = sucIncreasing→StrictlyIncreasing double doubleGrows
41+ doubleInc : isStrictlyIncreasing doubleℕ
42+ doubleInc = sucIncreasing→StrictlyIncreasing doubleℕ doubleGrows
5243
5344private
54- partitionDouble≅ℕ⊎ℕ : Iso (partition double refl doubleInc) (ℕ ⊎ ℕ)
55- Iso.fun partitionDouble≅ℕ⊎ℕ (n , zero , p) = inl n
56- Iso.fun partitionDouble≅ℕ⊎ℕ (n , suc zero , p) = inr n
57- Iso.fun partitionDouble≅ℕ⊎ℕ (n , suc (suc k) , p) = ex-falso (¬2n+2+k<2n n k p)
58- Iso.inv partitionDouble≅ℕ⊎ℕ (inl n) = n , zero , doubleGrows n
59- Iso.inv partitionDouble≅ℕ⊎ℕ (inr n) = n , 1 , (
60- 1 + n + n <≡⟨ <SumRight {k = 0 } ⟩
61- 2 + n + n ≡⟨ +-comm 2 (n + n) ⟩
62- n + n + 2 ≡⟨ sym 2Sn=2n+2 ⟩
63- double (suc n) ∎ )
64- Iso.rightInv partitionDouble≅ℕ⊎ℕ (inl n) = refl
65- Iso.rightInv partitionDouble≅ℕ⊎ℕ (inr n) = refl
66- Iso.leftInv partitionDouble≅ℕ⊎ℕ (k , zero , p) = ΣPathP (refl , ΣPathPProp (λ a → isProp≤) refl)
67- Iso.leftInv partitionDouble≅ℕ⊎ℕ (k , suc zero , p) = ΣPathP (refl , ΣPathPProp (λ a → isProp≤) refl)
68- Iso.leftInv partitionDouble≅ℕ⊎ℕ (k , suc (suc i) , p) = ex-falso $ ¬2n+2+k<2n k i p
69-
70- partitionDouble≅ℕ : Iso (partition double refl doubleInc) ℕ
71- partitionDouble≅ℕ = partition≅ℕ double refl doubleInc
45+ partitionDoubleℕ≅ℕ⊎ℕ : Iso (partition doubleℕ refl doubleInc) (ℕ ⊎ ℕ)
46+ Iso.fun partitionDoubleℕ≅ℕ⊎ℕ (n , zero , p) = inl n
47+ Iso.fun partitionDoubleℕ≅ℕ⊎ℕ (n , suc zero , p) = inr n
48+ Iso.fun partitionDoubleℕ≅ℕ⊎ℕ (n , suc (suc k) , p) = ex-falso (¬2n+2+k<2n n k p)
49+ Iso.inv partitionDoubleℕ≅ℕ⊎ℕ (inl n) = n , zero , doubleGrows n
50+ Iso.inv partitionDoubleℕ≅ℕ⊎ℕ (inr n) = n , 1 , <-suc
51+ Iso.rightInv partitionDoubleℕ≅ℕ⊎ℕ (inl n) = refl
52+ Iso.rightInv partitionDoubleℕ≅ℕ⊎ℕ (inr n) = refl
53+ Iso.leftInv partitionDoubleℕ≅ℕ⊎ℕ (k , zero , p) = ΣPathP (refl , ΣPathPProp (λ a → isProp≤) refl)
54+ Iso.leftInv partitionDoubleℕ≅ℕ⊎ℕ (k , suc zero , p) = ΣPathP (refl , ΣPathPProp (λ a → isProp≤) refl)
55+ Iso.leftInv partitionDoubleℕ≅ℕ⊎ℕ (k , suc (suc i) , p) = ex-falso $ ¬2n+2+k<2n k i p
56+
57+ partitionDoubleℕ≅ℕ : Iso (partition doubleℕ refl doubleInc) ℕ
58+ partitionDoubleℕ≅ℕ = partition≅ℕ doubleℕ refl doubleInc
7259
7360ℕ⊎ℕ≅ℕ : Iso (ℕ ⊎ ℕ) ℕ
74- ℕ⊎ℕ≅ℕ = compIso (invIso partitionDouble ≅ℕ⊎ℕ) partitionDouble ≅ℕ
61+ ℕ⊎ℕ≅ℕ = compIso (invIso partitionDoubleℕ ≅ℕ⊎ℕ) partitionDoubleℕ ≅ℕ
0 commit comments