{-# OPTIONS --safe --warning=error --without-K #-} open import Agda.Primitive using (Level; lzero; lsuc; _⊔_) open import LogicalFormulae open import Functions open import Numbers.Naturals.Semiring open import Numbers.Naturals.Order open import Sets.FinSet 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 _