\begin{code}
open import Preliminaries
\end{code}\begin{code}
CH-UC : Type
CH-UC = (f : 𝟚ᴺ → ℕ) → Σ \(n : ℕ) → (α β : 𝟚ᴺ) → α ≡[ n ] β → f α ≡ f β
UC : Type
UC = (f : 𝟚ᴺ → ℕ) → ∥ (Σ \(n : ℕ) → (α β : 𝟚ᴺ) → α ≡[ n ] β → f α ≡ f β) ∥
\end{code}\begin{code}
Theorem[CH-UC→UC] : CH-UC → UC
Theorem[CH-UC→UC] chuc f = ∣ chuc f ∣
\end{code}\begin{code}
MainLemma : (A : ℕ → Type)
→ ((n : ℕ) → isProp (A n))
→ ((n : ℕ) → A n → (m : ℕ) → m ≤ n → A m + ¬ (A m))
→ ∥ (Σ \(n : ℕ) → A n) ∥ → Σ \(n : ℕ) → A n
MainLemma A pA dA h = claim₂ (claim₁ h)
where
claim₀ : (Σ \(n : ℕ) → A n) → Σ-min \(k : ℕ) → A k
claim₀ (n , an) = Lemma[Σ-min] A n an (dA n an)
claim₁ : ∥ (Σ \(n : ℕ) → A n) ∥ → Σ-min \(k : ℕ) → A k
claim₁ = ∥∥-elim (Σ-min-isProp A pA) claim₀
claim₂ : (Σ-min \(k : ℕ) → A k) → Σ \(n : ℕ) → A n
claim₂ (k , ak , _) = k , ak
\end{code}\begin{code}
Uc : (𝟚ᴺ → ℕ) → ℕ → Type
Uc f n = (α β : 𝟚ᴺ) → α ≡[ n ] β → f α ≡ f β
Uc-isProp : (f : 𝟚ᴺ → ℕ)
→ (n : ℕ) → isProp (Uc f n)
Uc-isProp f n p q = funext (λ α → funext (λ β → funext (λ en → ℕ-isSet (p α β en) (q α β en))))
Uc-≤-decidable : (f : 𝟚ᴺ → ℕ)
→ (n : ℕ) → Uc f n → (m : ℕ) → m ≤ n → Uc f m + ¬ (Uc f m)
Uc-≤-decidable f 0 u0 _ _ = inl (λ α β _ → u0 α β ≡[zero])
Uc-≤-decidable f (succ n) usn m r = case c₀ c₁ (Lemma[n≤m+1→n≤m∨n≡m+1] r)
where
c₀ : m ≤ n → Uc f m + ¬ (Uc f m)
c₀ r' = case sc₀ sc₁ ds
where
ds : ((s : 𝟚^ n) → f (s * 0ʷ) ≡ f (s * 1ʷ)) + ¬ ((s : 𝟚^ n) → f (s * 0ʷ) ≡ f (s * 1ʷ))
ds = Lemma[𝟚^-dec] n (λ _ → ℕ-discrete)
sc₀ : ((s : 𝟚^ n) → f (s * 0ʷ) ≡ f (s * 1ʷ)) → Uc f m + ¬ (Uc f m)
sc₀ ψ = Uc-≤-decidable f n un m r'
where
un : (α β : 𝟚ᴺ) → α ≡[ n ] β → f α ≡ f β
un α β en = case d₀ d₁ 𝟚-discrete
where
d₀ : α n ≡ β n → f α ≡ f β
d₀ e = usn α β (≡[succ]' en e)
d₁ : α n ≢ β n → f α ≡ f β
d₁ g = case sd₀ sd₁ 𝟚-discrete
where
s : 𝟚^ n
s = take n α
sd₀ : α n ≡ 𝟎 → f α ≡ f β
sd₀ eαn = trans claim₁ (trans (ψ s) (sym claim₃))
where
eβn : β n ≡ 𝟏
eβn = Lemma[b≢0→b≡1] (λ e → g (trans eαn (sym e)))
claim₀ : α ≡[ succ n ] (s * 0ʷ)
claim₀ = ≡[succ]' (Lemma[*-take-≡[]] n) (trans eαn (Lemma[*-take-0] n))
claim₁ : f α ≡ f (s * 0ʷ)
claim₁ = usn α (s * 0ʷ) claim₀
claim₂ : β ≡[ succ n ] (s * 1ʷ)
claim₂ = ≡[succ]' (Lemma[≡[]-*-take-≡[]] en) (trans eβn (Lemma[*-take-0] n))
claim₃ : f β ≡ f (s * 1ʷ)
claim₃ = usn β (s * 1ʷ) claim₂
sd₁ : α n ≢ 𝟎 → f α ≡ f β
sd₁ fαn = trans claim₁ (trans (sym (ψ s)) (sym claim₃))
where
eαn : α n ≡ 𝟏
eαn = Lemma[b≢0→b≡1] fαn
eβn : β n ≡ 𝟎
eβn = Lemma[b≢1→b≡0] (λ e → g (trans eαn (sym e)))
claim₀ : α ≡[ succ n ] (s * 1ʷ)
claim₀ = ≡[succ]' (Lemma[*-take-≡[]] n) (trans eαn (Lemma[*-take-0] n))
claim₁ : f α ≡ f (s * 1ʷ)
claim₁ = usn α (s * 1ʷ) claim₀
claim₂ : β ≡[ succ n ] (s * 0ʷ)
claim₂ = ≡[succ]' (Lemma[≡[]-*-take-≡[]] en) (trans eβn (Lemma[*-take-0] n))
claim₃ : f β ≡ f (s * 0ʷ)
claim₃ = usn β (s * 0ʷ) claim₂
sc₁ : ¬ ((s : 𝟚^ n) → f (s * 0ʷ) ≡ f (s * 1ʷ)) → Uc f m + ¬ (Uc f m)
sc₁ φ = inr goal
where
claim : (s : 𝟚^ n) → (s * 0ʷ) ≡[ m ] (s * 1ʷ)
claim s = Lemma[≡[]-≤] (Lemma[*-≡[]] s) r'
goal : ¬ ((α β : 𝟚ᴺ) → α ≡[ m ] β → f α ≡ f β)
goal um = φ (λ s → um (s * 0ʷ) (s * 1ʷ) (claim s))
c₁ : m ≡ succ n → Uc f m + ¬ (Uc f m)
c₁ e = inl (transport (Uc f) (sym e) usn)
Theorem[UC→CH-UC] : UC → CH-UC
Theorem[UC→CH-UC] uc f = MainLemma (Uc f) (Uc-isProp f) (Uc-≤-decidable f) (uc f)
\end{code}