{-# OPTIONS --cubical --safe #-}
module Demos.Cantor where
open import Prelude
open import Data.Bool.Properties using (false≢true; true≢false)
Stream : Type a → Type a
Stream A = ℕ → A
_∈_ : ∀ {A : Type a} (x : A) → Stream A → Type a
x ∈ xs = ∃ i × (xs i ≡ x)
Countable : Type a → Type a
Countable A = Σ[ xs ⦂ Stream A ] × (∀ x → x ∈ xs)
x≢¬x : ∀ x → x ≢ not x
x≢¬x false = false≢true
x≢¬x true  = true≢false
cantor : ¬ (Countable (Stream Bool))
cantor (support , cover) =
  let p , ps = cover (λ i → not (support i i))
      q = cong (_$ p) ps
  in x≢¬x _ q