{-# OPTIONS --safe --warning=error --without-K #-} open import Agda.Primitive using (Level; lzero; lsuc; _⊔_) open import LogicalFormulae open import Functions open import Numbers.Naturals.Naturals open import Sets.FinSet open import Semirings.Definition open import Orders open import WellFoundedInduction open import Sets.CantorBijection.Order module Sets.CantorBijection.Proofs where open Sets.CantorBijection.Order using (order ; totalOrder ; orderWellfounded) cantorInverseLemma : (ℕ && ℕ) → (ℕ && ℕ) cantorInverseLemma (0 ,, s) = (succ s) ,, 0 cantorInverseLemma (succ r ,, 0) = r ,, 1 cantorInverseLemma (succ r ,, succ s) = (r ,, succ (succ s)) cantorInverse : ℕ → (ℕ && ℕ) cantorInverse zero = (0 ,, 0) cantorInverse (succ z) = cantorInverseLemma (cantorInverse z) cantorInverseLemmaInjective : (a b : ℕ && ℕ) → cantorInverseLemma a ≡ cantorInverseLemma b → a ≡ b cantorInverseLemmaInjective (zero ,, b) (zero ,, .b) refl = refl cantorInverseLemmaInjective (zero ,, b) (succ c ,, zero) () cantorInverseLemmaInjective (zero ,, b) (succ c ,, succ d) () cantorInverseLemmaInjective (succ a ,, zero) (zero ,, d) () cantorInverseLemmaInjective (succ a ,, succ b) (zero ,, d) () cantorInverseLemmaInjective (succ a ,, zero) (succ .a ,, zero) refl = refl cantorInverseLemmaInjective (succ a ,, succ b) (succ .a ,, succ .b) refl = refl cantorInverseLemmaSurjective : (a : ℕ && ℕ) → (a ≡ (0 ,, 0)) || (Sg (ℕ && ℕ) (λ b → cantorInverseLemma b ≡ a)) cantorInverseLemmaSurjective (zero ,, zero) = inl refl cantorInverseLemmaSurjective (zero ,, succ zero) = inr ((1 ,, 0) , refl) cantorInverseLemmaSurjective (zero ,, succ (succ b)) = inr ((1 ,, succ b) , refl) cantorInverseLemmaSurjective (succ a ,, zero) = inr ((0 ,, a) , refl) cantorInverseLemmaSurjective (succ a ,, succ zero) = inr ((succ (succ a) ,, 0) , refl) cantorInverseLemmaSurjective (succ a ,, succ (succ b)) = inr ((succ (succ a) ,, succ b) , refl) cantorInverseLemmaNotZero : (a : ℕ && ℕ) → (cantorInverseLemma a ≡ (0 ,, 0)) → False cantorInverseLemmaNotZero (succ a ,, zero) () cantorInverseLemmaNotZero (succ a ,, succ b) () cantorInverseLemmaIncreases : (x : ℕ && ℕ) → order x (cantorInverseLemma x) cantorInverseLemmaIncreases (zero ,, b) = inl (identityOfIndiscernablesRight _