This PR modifies the pretty printing of pi types. Now `∀` will be preferred over `→` for propositions if the domain is not a proposition. For example, `∀ (n : Nat), True` pretty prints as `∀ (n : Nat), True` rather than as `Nat → True`. There is also now an option `pp.foralls` (default true) that when false disables using `∀` at all, for pedagogical purposes. This PR also adjusts instance implicit binder pretty printing — nondependent pi types won't show the instance binder name. Closes #1834. The linked RFC also suggests using `_` for binder names in case of non-dependance. We're tabling that idea. Potentially it is useful for hygienic names; this could improve how `Nat → True` pretty prints as `∀ (a : Nat), True`, with this `a` that's chosen by implication notation elaboration. Relatedly, this PR exposes even further the issue where binder names are reused in a confusing way. Consider: `Nat → Nat → (a : Nat) → a = a` pretty prints as `∀ (a a a : Nat), a = a`.
30 lines
711 B
Text
30 lines
711 B
Text
id fun x => x : ?m → ?m
|
||
0 : Nat
|
||
f 1 fun x => x : Nat
|
||
0 : Nat
|
||
f 1 fun x => x : Nat
|
||
id.{u} {α : Sort u} (a : α) : α
|
||
precissues.lean:15:10-15:14: error: unexpected token 'have'; expected command
|
||
id.{u} {α : Sort u} (a : α) : α
|
||
precissues.lean:17:10-17:13: error: unexpected token 'let'; expected command
|
||
1 : Nat
|
||
id
|
||
(let_fun this := True.intro;
|
||
this) : True
|
||
0 =
|
||
let_fun this := 1;
|
||
this : Prop
|
||
0 =
|
||
let x := 0;
|
||
x : Prop
|
||
p ↔ ¬q : Prop
|
||
True = ¬False : Prop
|
||
p ∧ ¬q : Prop
|
||
¬p ∧ q : Prop
|
||
¬p ↔ q : Prop
|
||
¬p = q : Prop
|
||
¬p = q : Prop
|
||
id ¬p : Prop
|
||
∀ (a a : Nat), a = a : Prop
|
||
id.{u} {α : Sort u} (a : α) : α
|
||
precissues.lean:41:10-41:14: error: unexpected token 'foo!'; expected command
|