\begin{code}
open import Agda.Primitive
infixr 10 _,_
record Σ {i j : Level} {A : Set i} (B : A → Set j) : Set (i ⊔ j) where
constructor _,_
field
pr₁ : A
pr₂ : B pr₁
open Σ public
infix 1 _≡_
data _≡_ {i : Level} {A : Set i} (a : A) : A → Set i where
refl : a ≡ a
transport : {i j : Level} {A : Set i} (P : A → Set j) {x y : A}
→ x ≡ y → P x → P y
transport P refl p = p
ap : {i j : Level} {A : Set i} {B : Set j}
→ (f : A → B) {x y : A} → x ≡ y → f x ≡ f y
ap f refl = refl
infixr 5 _∙_
_∙_ : {i : Level} {A : Set i} {x y z : A}
→ x ≡ y → y ≡ z → x ≡ z
refl ∙ refl = refl
data ℕ : Set where
zero : ℕ
succ : ℕ → ℕ
{-# BUILTIN NATURAL ℕ #-}
_ᴺ : Set → Set
A ᴺ = ℕ → A
ℕᴺ : Set
ℕᴺ = ℕ ᴺ
head : {A : Set} → A ᴺ → A
head α = α 0
tail : {A : Set} → A ᴺ → A ᴺ
tail α = λ i → α (succ i)
data _≡[_]_ {A : Set} : A ᴺ → ℕ → A ᴺ → Set where
≡[zero] : {α β : A ᴺ} → α ≡[ 0 ] β
≡[succ] : {α β : A ᴺ} {n : ℕ} → head α ≡ head β → tail α ≡[ n ] tail β → α ≡[ succ n ] β
≡[pred] : {A : Set} {α β : A ᴺ} (n : ℕ)
→ α ≡[ succ n ] β → α ≡[ n ] β
≡[pred] 0 _ = ≡[zero]
≡[pred] (succ n) (≡[succ] r e) = ≡[succ] r (≡[pred] n e)
\end{code}\begin{code}
CH-Cont : Set
CH-Cont = (f : ℕᴺ → ℕ) (α : ℕᴺ) → Σ \(n : ℕ) → (β : ℕᴺ) → α ≡[ n ] β → f α ≡ f β
module CH-Cont where
infixr 10 _+_
_+_ : ℕ → ℕ → ℕ
n + zero = n
n + succ m = succ (n + m)
0ʷ : ℕᴺ
0ʷ = λ i → 0
_zeros-and-then_ : ℕ → ℕ → ℕᴺ
(0 zeros-and-then k) i = k
(succ n zeros-and-then k) 0 = 0
(succ n zeros-and-then k) (succ i) = (n zeros-and-then k) i
zeros-and-then-spec₀ : ∀ n {k} → (n zeros-and-then k) n ≡ k
zeros-and-then-spec₀ 0 = refl
zeros-and-then-spec₀ (succ n) = zeros-and-then-spec₀ n
zeros-and-then-spec₁ : ∀ n {k} → 0ʷ ≡[ n ] (n zeros-and-then k)
zeros-and-then-spec₁ 0 = ≡[zero]
zeros-and-then-spec₁ (succ n) = ≡[succ] refl (zeros-and-then-spec₁ n)
Thm : CH-Cont → 0 ≡ 1
Thm cont = goal
where
M : (ℕᴺ → ℕ) → ℕ
M f = pr₁ (cont f 0ʷ)
m : ℕ
m = M (λ α → 0)
f : ℕᴺ → ℕ
f β = M (λ α → β (α m))
claim₀ : f 0ʷ ≡ m
claim₀ = refl
claim₁ : (β : ℕᴺ) → 0ʷ ≡[ M f ] β → m ≡ f β
claim₁ = pr₂ (cont f 0ʷ)
β : ℕᴺ
β = (M f + 1) zeros-and-then 1
claim₂ : 0ʷ ≡[ M f ] β
claim₂ = ≡[pred] (M f) (zeros-and-then-spec₁ (M f + 1))
claim₃ : m ≡ f β
claim₃ = claim₁ β claim₂
claim₄ : (α : ℕᴺ) → 0ʷ ≡[ m ] α → β 0 ≡ β (α m)
claim₄ α em = pr₂ (cont (λ α → β (α m)) 0ʷ) α em'
where
em' : 0ʷ ≡[ f β ] α
em' = transport (λ x → 0ʷ ≡[ x ] α) claim₃ em
α : ℕᴺ
α = m zeros-and-then (M f + 1)
claim₅ : 0ʷ ≡[ m ] α
claim₅ = zeros-and-then-spec₁ m
goal : 0 ≡ 1
goal = e₀ ∙ e₁ ∙ e₂
where
e₀ : 0 ≡ β (α m)
e₀ = claim₄ α claim₅
e₁ : β (α m) ≡ β (M f + 1)
e₁ = ap β (zeros-and-then-spec₀ m)
e₂ : β (M f + 1) ≡ 1
e₂ = zeros-and-then-spec₀ (M f + 1)
\end{code}\begin{code}
Type₁ : Set₂
Type₁ = Set₁
Type : Type₁
Type = Set
isProp : Type → Type
isProp P = (x y : P) → x ≡ y
postulate
∥_∥ : Type → Type
∣_∣ : {A : Type} → A → ∥ A ∥
∥∥-isProp : {A : Type} → isProp ∥ A ∥
∥∥-elim : {A P : Type} → isProp P → (A → P) → ∥ A ∥ → P
∥∥-comp : {A P : Type} (p : isProp P) (f : A → P)
→ (x : A) → f x ≡ ∥∥-elim p f ∣ x ∣
funext : {A : Type} {B : A → Type} {f g : (x : A) → B x} → (∀ x → f x ≡ g x) → f ≡ g
\end{code}\begin{code}
module PropLogic where
ℙ : Type₁
ℙ = Σ \(P : Type) → isProp P
Prf : ℙ → Type
Prf = pr₁
data 𝟙 : Type where
⋆ : 𝟙
𝟙isProp : isProp 𝟙
𝟙isProp ⋆ ⋆ = refl
⊤ : ℙ
⊤ = 𝟙 , 𝟙isProp
data 𝟘 : Type where
𝟘isProp : isProp 𝟘
𝟘isProp ()
⊥ : ℙ
⊥ = 𝟘 , 𝟘isProp
infixr 20 _×_
infixr 20 _∧_
_×_ : Type → Type → Type
A × B = Σ \(_ : A) → B
pair⁼ : {A B : Type} {a a' : A} {b b' : B}
→ a ≡ a' → b ≡ b' → (a , b) ≡ (a' , b')
pair⁼ refl refl = refl
×-preserves-prop : {A B : Type} → isProp A → isProp B → isProp (A × B)
×-preserves-prop pA pB (a , b) (a' , b') = pair⁼ (pA a a') (pB b b')
_∧_ : ℙ → ℙ → ℙ
(A , pA) ∧ (B , pB) = (A × B) , ×-preserves-prop pA pB
infixr 19 _+_
infixr 19 _∨_
data _+_ (A B : Type) : Type where
inl : A → A + B
inr : B → A + B
_∨_ : ℙ → ℙ → ℙ
(A , pA) ∨ (B , pB) = ∥ A + B ∥ , ∥∥-isProp
∨-inl : {A B : ℙ} → Prf A → Prf (A ∨ B)
∨-inl a = ∣ inl a ∣
∨-inr : {A B : ℙ} → Prf B → Prf (A ∨ B)
∨-inr b = ∣ inr b ∣
infixr 18 _⇒_
→-preserves-prop : {A B : Type} → isProp B → isProp (A → B)
→-preserves-prop pB f g = funext (λ x → pB (f x) (g x))
_⇒_ : ℙ → ℙ → ℙ
(A , pA) ⇒ (B , pB) = (A → B) , →-preserves-prop pB
Π-preserves-prop : {A : Type} {B : A → Type} → (∀ x → isProp (B x)) → isProp ((x : A) → B x)
Π-preserves-prop pB f g = funext (λ x → pB x (f x) (g x))
∀ᴾ : {X : Type} → (X → ℙ) → ℙ
∀ᴾ {X} A = Φ , ΦisProp
where
Φ : Type
Φ = (x : X) → pr₁ (A x)
ΦisProp : isProp Φ
ΦisProp = Π-preserves-prop (λ x → pr₂ (A x))
∃ᴾ : {X : Type} → (X → ℙ) → ℙ
∃ᴾ {X} A = Φ , ∥∥-isProp
where
Φ : Type
Φ = ∥ (Σ \x → pr₁ (A x)) ∥
∨-introᴸ : (A B : ℙ)
→ Prf A → Prf (A ∨ B)
∨-introᴸ _ _ a = ∣ inl a ∣
∨-introᴿ : (A B : ℙ)
→ Prf B → Prf (A ∨ B)
∨-introᴿ _ _ b = ∣ inr b ∣
∨-elim : (A B C : ℙ)
→ Prf (A ⇒ C) → Prf (B ⇒ C) → Prf (A ∨ B) → Prf C
∨-elim (A , pA) (B , pB) (C , pC) f g = ∥∥-elim pC claim
where
claim : A + B → C
claim (inl a) = f a
claim (inr b) = g b
∃ᴾ-intro : (X : Type) (A : X → ℙ)
→ (x : X) → Prf (A x) → Prf (∃ᴾ \x → A x)
∃ᴾ-intro _ _ x p = ∣ (x , p) ∣
∃ᴾ-elim : (X : Type) (A : X → ℙ) (B : ℙ)
→ Prf (∀ᴾ \x → (A x ⇒ B)) → Prf ((∃ᴾ \x → A x) ⇒ B)
∃ᴾ-elim X A (B , pB) f = ∥∥-elim pB claim
where
claim : (Σ \x → pr₁ (A x)) → B
claim (x , p) = f x p
\end{code}\begin{code}
AC : Type₁
AC = (A : Type) (P : A → Type)
→ ((x : A) → ∥ P x ∥) → ∥ ((x : A) → P x) ∥
AC' : Type₁
AC' = (A B : Type) (P : A → B → Type)
→ ((x : A) → ∥ (Σ \(y : B) → P x y) ∥) → ∥ (Σ \(f : A → B) → (x : A) → P x (f x)) ∥
AC→AC' : AC → AC'
AC→AC' ac A B P φ = ∥∥-elim ∥∥-isProp claim₀ claim₁
where
Q : A → Type
Q x = Σ \(y : B) → P x y
claim₀ : ((x : A) → Q x) → ∥ (Σ \(f : A → B) → (x : A) → P x (f x)) ∥
claim₀ f = ∣ (λ x → pr₁ (f x)) , (λ x → pr₂ (f x)) ∣
claim₁ : ∥ ((x : A) → Q x) ∥
claim₁ = ac A Q φ
AC'→AC : AC' → AC
AC'→AC ac' A P ψ = ∥∥-elim ∥∥-isProp claim₀ claim₂
where
Q : A → A → Type
Q x _ = P x
claim₀ : (Σ \(f : A → A) → (x : A) → P x) → ∥ ((x : A) → P x) ∥
claim₀ (_ , h) = ∣ h ∣
claim₁ : (x : A) → ∥ (Σ \(_ : A) → P x) ∥
claim₁ x = ∥∥-elim ∥∥-isProp (λ p → ∣ x , p ∣) (ψ x)
claim₂ : ∥ (Σ \(f : A → A) → (x : A) → Q x (f x)) ∥
claim₂ = ac' A A Q claim₁
\end{code}\begin{code}
Cont : Type
Cont = (f : ℕᴺ → ℕ) (α : ℕᴺ) → ∥ (Σ \(n : ℕ) → (β : ℕᴺ) → α ≡[ n ] β → f α ≡ f β) ∥
\end{code}