feat(frontends/lean/pp): use forall notation for all pi types from a Type to a Prop#770
feat(frontends/lean/pp): use forall notation for all pi types from a Type to a Prop#770
Conversation
|
I had wondered about this behavior of the pretty printer before, and this Zulip thread led me to check how hard it would be to make the change. If it's unwanted, that's fine. One one hand, it's an improvement because you can tell immediately whether a pi type with a binding domain in Type is a Prop since it will always show forall notation. On the other you can't immediately tell whether a forall is dependent or not. I think it's still on the balance an improvement that helps align Lean with common practice mathematics at little cost. |
|
To an experienced user, I'd argue being able to spot a non-dependent binder at a glance is more valuable than matching pen and paper mathematics, but I understand the pedagogical appeal. Do you think using underscores for the variable names in non-dependent binders is a good idea? I think that would remove the downside regarding dependent types. |
I like this idea @eric-wieser. I added a mild hack to get this to work -- anonymous names can't round-trip anyway, so I made the binder pp routine print anonymous names as I generalized this to also apply to non-dependent pi types with non-explicit binders. For example, |
|
I created some conflicts in my other PR; some tests might need fixing yet. |
|
@eric-wieser I just noticed your other PRs and was in the process of getting my dev environment set up for lean to merge and test (I'm at Orsay for the year, by the way). Edit: Your merge looks good to me, thanks! The tests all pass locally too. |
This PR makes two modifications to the pretty printer for pi types: (1) if
αis a Type andpis a Prop thenα → ppretty prints as∀ (_ : α), p, and (2) non-dependent pi types with non-explicit binders such asΠ {x : α}, βpretty print asΠ {_ : α}, β, with a special case that instance implicits pretty print asΠ [foo α], βrather thanΠ [_ : foo α], β.Rationale: Recall that if
A : Sort uandB : A → Sort vwe have thatΠ (a : A), B a : Sort (imax u v), and in particular whenvis zero then∀ (a : A), B a : Prop. Currently, whenq : Propthen the non-dependent∀ (a : A), qpretty prints asA → q : Prop. This tends to be surprising whenAis a Type, since the implicationA → qis a proposition butAis not. By instead pretty printing such a case as∀ (_ : A), q, then, in addition to reducing surprise, we get strictly more information since we can tell from the_that this is non-dependent and from the∀thatAis not a Prop. Since knowing when a pi type is non-dependent is useful, we go ahead and generalize this_feature to all pi types with non-explicit binders -- the ones with explicit binders already hide the binder name since they pretty print usingA → Bnotation.