Zulip Chat Archive
Stream: maths
Topic: Weak univalence implies choice
Chris Hughes (Jul 13 2019 at 16:33):
Today I proved that weak_univalence {α β : Sort*} : α ≃ β → α = β
and quot.sound
imply choice as stated in Lean. You can get a weaker version of choice without quot.sound
; this requires decidable equality on the type you're choosing from.
https://gist.github.com/ChrisHughes24/c7b8bcb3e50b2531be94f11ba2c23e3c
Curiously, Lean didn't ask me to mark the definition as noncomputable since I only used propositional axioms.
I copied the version of em
from the HoTT book for part of this. It's much easier to understand than the Lean proof.
Floris van Doorn (Jul 13 2019 at 21:56):
That is surprising, since choice
as stated in Lean is inconsistent with full univalence.
Floris van Doorn (Jul 13 2019 at 21:57):
How much do you rely on definitional proof irrelevance?
Chris Hughes (Jul 13 2019 at 22:18):
The main non-HoTT-valid thing I do is unique choice on {β : Type u // option β = plift α}
Floris van Doorn (Jul 13 2019 at 23:17):
Interesting. In HoTT that type is indeed not a proposition (subsingleton), while here it is. There is a weird interplay between proof irrelevance and "weak univalence".
Some remarks (probably not new to Chris):
- Unique Choice is provable in HoTT, but the proof Chris gave is looks a little weird from a HoTT perspective, since it relies on the fact that
=
is a proposition. - The proof that
option
is injective also works in HoTT.unit + A ≃ unit + B → A ≃ B
is proven here in Lean 2 HoTT. It is not an "embedding" though (which would be necessary to do the rest of the argument in HoTT). - The proof structure is interesting (weird): you first prove decidable choice, then you prove LEM from that, and then you use that to show that the decidability condition in choice is superfluous.
Floris van Doorn (Jul 13 2019 at 23:20):
Although your proof heavily relies on proof irrelevance, I don't think you ever need it to be definitional.
Kenny Lau (Jul 14 2019 at 05:04):
definition unit_sum_equiv_cancel_map : A → B := begin intro a, cases sum.mem_cases (H (inr a)) with u b, rotate 1, exact b.1, cases u with u Hu, cases sum.mem_cases (H (inl ⋆)) with u' b, rotate 1, exact b.1, cases u' with u' Hu', exfalso, apply empty_of_inl_eq_inr, calc inl ⋆ = H⁻¹ (H (inl ⋆)) : (to_left_inv H (inl ⋆))⁻¹ ... = H⁻¹ (inl u') : {Hu'} ... = H⁻¹ (inl u) : is_prop.elim ... = H⁻¹ (H (inr a)) : {Hu⁻¹} ... = inr a : to_left_inv H (inr a) end
Kenny Lau (Jul 14 2019 at 05:04):
https://github.com/leanprover/lean2/blob/master/hott/types/sum.hlean#L218
Kenny Lau (Jul 14 2019 at 05:04):
I cannot understand this at all
Floris van Doorn (Jul 14 2019 at 10:08):
The proof is not readable at all, and also not intended as such. The idea is, given f : unit + A ≃ unit + B
we define a function g : A → B
such that
- if
f(inr a) = inr b
theng(a) = b
- if
f(inr a) = inl star
thenf (inl star) = inr b'
for someb'
and we defineg(a) = b'
- Everything after the
exfalso
is a (longer than necessary) proof thatf(inr a) = inl star
andf (inl star) = inl star
is impossible.
Kenny Lau (Jul 14 2019 at 10:42):
oh I understand it now, I thought it was some HoTT-specific thing that didn't hold in real maths
Kenny Lau (Jul 14 2019 at 10:42):
thanks
Last updated: Dec 20 2023 at 11:08 UTC