{-# OPTIONS --safe --warning=error --without-K #-} open import LogicalFormulae open import Numbers.Naturals.Semiring open import Numbers.Naturals.Order open import Semirings.Definition open import Sets.CantorBijection.Order open import Orders.Total.Definition open import Orders.WellFounded.Induction 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 _