{-# OPTIONS --cubical-compatible #-}
module Padova2025.Explorations.Uncountability.Impossible.Toy where
open import Padova2025.ProgrammingBasics.Booleans
open import Padova2025.ProgrammingBasics.Naturals.Base
open import Padova2025.ProgrammingBasics.Lists
open import Padova2025.ProgrammingBasics.HigherOrder
open import Padova2025.ProvingBasics.Termination.Gas
open import Padova2025.ProvingBasics.Equality.Base
open import Padova2025.ProvingBasics.Equality.General
open import Padova2025.ProvingBasics.Negation
open import Padova2025.ProvingBasics.Connectives.Disjunction
open import Padova2025.ProvingBasics.Connectives.Existential
open import Padova2025.Explorations.Uncountability.Applications
_β_ : Bool β Cantor β Cantor
x β xs = Ξ» { zero β x ; (succ n) β xs n }
{-# NON_TERMINATING #-}
Ξ΅ : (Cantor β Bool) β Cantor
Ξ΅ P = x β Ξ΅ (P β (x β_))
where
x : Bool
x = P (false β Ξ΅ (P β (false β_)))
has-root? : (Cantor β Bool) β Bool
has-root? P = not (P (Ξ΅ P))
root : (Cantor β Bool) β Maybe (List Bool)
root P with P (Ξ΅ P)
... | false = just (map (Ξ΅ P) (zero β· one β· two β· three β· four β· []))
... | true = nothing
xor : Bool β Bool β Bool
xor false false = false
xor false true = true
xor true false = true
xor true true = false
_β?_ : (Cantor β Bool) β (Cantor β Bool) β Bool
P β? Q = not (has-root? (Ξ» xs β not (xor (P xs) (Q xs))))
private
{-# NON_TERMINATING #-}
trust-β‘ : (a b : Bool) β a β‘ b
trust-β‘ false false = refl
trust-β‘ true true = refl
trust-β‘ false true = trust-β‘ false true
trust-β‘ true false = trust-β‘ true false
{-# NON_TERMINATING #-}
trust-β’ : {A : Set} {x y : A} β x β’ y
trust-β’ eq = trust-β’ eq
_β!?_ : (P Q : Cantor β Bool) β ((xs : Cantor) β P xs β‘ Q xs) β (Ξ£[ xs β Cantor ] P xs β’ Q xs)
P β!? Q with P β? Q
... | true = left (Ξ» xs β trust-β‘ (P xs) (Q xs))
... | false = right (Ξ΅ (Ξ» xs β not (xor (P xs) (Q xs))) , trust-β’)