Zulip Chat Archive
Stream: general
Topic: Priorities of × and ≃
Yury G. Kudryashov (Jul 05 2019 at 20:23):
Hi, currently α × β ≃ γ is parsed as α × (β ≃ γ) while it seems more natural to interpret it as (α × β) ≃ γ.
Mario Carneiro (Jul 05 2019 at 20:33):
I realize this looks odd, but type constructors deliberately have low precedence. The × symbol has approximately the same precedence as ∧, because they are used to put together basic types. This is below =, which is near ≃, and * lies above that
Mario Carneiro (Jul 05 2019 at 20:34):
Consider also α → β ≃ γ
Scott Morrison (Jul 05 2019 at 20:35):
That one is just clearly ambiguous and needs parentheses.
Scott Morrison (Jul 05 2019 at 20:35):
(because neither interpretation would be "dumb")
Yury G. Kudryashov (Jul 05 2019 at 20:35):
For → this order makes sense because it is often used in the sense "implies".
Mario Carneiro (Jul 05 2019 at 20:36):
α × (β ≃ γ) also makes sense if you want to produce two things
Scott Morrison (Jul 05 2019 at 20:36):
then you should have defined a structure with named fields, so people didn't need to listen to .1 and .2 :-)
Yury G. Kudryashov (Jul 05 2019 at 20:36):
/me wonders if it's possible to require explicit parentheses in some cases.
Mario Carneiro (Jul 05 2019 at 20:37):
Sadly no
Mario Carneiro (Jul 05 2019 at 20:37):
although we can certainly try to impose a convention
Yury G. Kudryashov (Jul 05 2019 at 20:49):
Conventions don't help newbies.
Floris van Doorn (Jul 08 2019 at 18:58):
There is no reason that ≃ has a precedence near =.
≃ only acts on types, so it makes sense for it to have lower precedence than (some) type formers. This is not the case for =, which should (almost) never be used on types, so it should have a precedence higher than all type formers.
Floris van Doorn (Jul 08 2019 at 19:01):
In the Lean 2 HoTT library the precedence of ≃ was 25, compared to × having 35 and = having 50.
https://github.com/leanprover/lean2/blob/master/hott/init/equiv.hlean#L304
https://github.com/leanprover/lean2/blob/master/hott/init/reserved_notation.hlean#L145-L208
This results in some nice statements, like
definition prod_equiv_prod [constructor] (f : A ≃ A') (g : B ≃ B') : A × B ≃ A' × B'
https://github.com/leanprover/lean2/blob/master/hott/types/prod.hlean#L215
I do not recall ever running into issues/confusion because of these conventions.
Floris van Doorn (Jul 08 2019 at 19:05):
Note: → did (and should) have a lower precedence than ≃, and you still require parentheses for them. This can cause confusion, but that's no reason to have the (in my opinion) wrong order for × and ≃. Example :
definition arrow_equiv_arrow_right' [constructor] (f1 : A → (B ≃ B')) : (A → B) ≃ (A → B')
(the parentheses in the type of f1 are only for readability)
https://github.com/leanprover/lean2/blob/master/hott/types/arrow.hlean#L51
Floris van Doorn (Jul 08 2019 at 19:09):
I think we should change the precedence of ≃ to 25. I have also run against this issue before (maybe with two different tokens). This is only a mathlib change, not a core change.
Mario Carneiro (Jul 08 2019 at 19:25):
Oh, if it's a mathlib-only change then go ahead. I agree that the precedence in equiv.lean feels consistently the wrong way around
Last updated: May 02 2025 at 03:31 UTC