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`.
277 lines
17 KiB
Text
277 lines
17 KiB
Text
{ goals := #[{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.append
|
||
#[Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/0", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.append
|
||
#[Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/0/0/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "x"),
|
||
Lean.Widget.TaggedText.text " = ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/0/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "x")]),
|
||
Lean.Widget.TaggedText.text " → ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "True")]),
|
||
isInserted? := some false,
|
||
isRemoved? := none,
|
||
hyps := #[{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "Nat"),
|
||
names := #["x"],
|
||
isInserted? := some true,
|
||
isRemoved? := none }] }] }
|
||
|
||
{ goals := #[{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.append
|
||
#[Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/0", diffStatus? := some "willDelete" }
|
||
(Lean.Widget.TaggedText.append
|
||
#[Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/0/0/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "x"),
|
||
Lean.Widget.TaggedText.text " = ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/0/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "x")]),
|
||
Lean.Widget.TaggedText.text " → ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "True")]),
|
||
isInserted? := some false,
|
||
isRemoved? := none,
|
||
hyps := #[{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "Nat"),
|
||
names := #["x"],
|
||
isInserted? := none,
|
||
isRemoved? := none }] }] }
|
||
|
||
{ goals := #[{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.append
|
||
#[Lean.Widget.TaggedText.text "∀ (",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "x"),
|
||
Lean.Widget.TaggedText.text " : ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/0", diffStatus? := some "willDelete" }
|
||
(Lean.Widget.TaggedText.text "Nat"),
|
||
Lean.Widget.TaggedText.text "), ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.append
|
||
#[Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1/0", diffStatus? := some "willDelete" }
|
||
(Lean.Widget.TaggedText.append
|
||
#[Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1/0/0/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "x"),
|
||
Lean.Widget.TaggedText.text " = ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1/0/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "x")]),
|
||
Lean.Widget.TaggedText.text " → ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "True")])]),
|
||
isInserted? := some false,
|
||
isRemoved? := none,
|
||
hyps := #[] }] }
|
||
|
||
{ goals := #[{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "True"),
|
||
isInserted? := some false,
|
||
isRemoved? := none,
|
||
hyps := #[{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "Sort u_1"),
|
||
names := #["α"],
|
||
isInserted? := none,
|
||
isRemoved? := none },
|
||
{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "Nat"),
|
||
names := #["x", "y"],
|
||
isInserted? := none,
|
||
isRemoved? := none },
|
||
{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.append
|
||
#[Lean.Widget.TaggedText.text "∀ (",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "a"),
|
||
Lean.Widget.TaggedText.text " : ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/0", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "α"),
|
||
Lean.Widget.TaggedText.text "), ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.append
|
||
#[Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1/0/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "x"),
|
||
Lean.Widget.TaggedText.text " = ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1/1", diffStatus? := some "willChange" }
|
||
(Lean.Widget.TaggedText.text "y")])]),
|
||
names := #["f"],
|
||
isInserted? := none,
|
||
isRemoved? := none },
|
||
{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.append
|
||
#[Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/0/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "y"),
|
||
Lean.Widget.TaggedText.text " = ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "x")]),
|
||
names := #["h"],
|
||
isInserted? := none,
|
||
isRemoved? := none }] }] }
|
||
|
||
{ goals := #[{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "True"),
|
||
isInserted? := some false,
|
||
isRemoved? := none,
|
||
hyps := #[{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "Sort u_1"),
|
||
names := #["α"],
|
||
isInserted? := none,
|
||
isRemoved? := none },
|
||
{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "Nat"),
|
||
names := #["x", "y"],
|
||
isInserted? := none,
|
||
isRemoved? := none },
|
||
{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.append
|
||
#[Lean.Widget.TaggedText.text "∀ (",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "a"),
|
||
Lean.Widget.TaggedText.text " : ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/0", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "α"),
|
||
Lean.Widget.TaggedText.text "), ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.append
|
||
#[Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1/0/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "x"),
|
||
Lean.Widget.TaggedText.text " = ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1/1", diffStatus? := some "wasChanged" }
|
||
(Lean.Widget.TaggedText.text "x")])]),
|
||
names := #["f"],
|
||
isInserted? := none,
|
||
isRemoved? := none },
|
||
{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.append
|
||
#[Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/0/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "y"),
|
||
Lean.Widget.TaggedText.text " = ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "x")]),
|
||
names := #["h"],
|
||
isInserted? := none,
|
||
isRemoved? := none }] }] }
|
||
|
||
{ goals := #[{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := some "willChange" }
|
||
(Lean.Widget.TaggedText.append
|
||
#[Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/0/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "True"),
|
||
Lean.Widget.TaggedText.text " ∧ ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "True")]),
|
||
isInserted? := some false,
|
||
isRemoved? := none,
|
||
hyps := #[] }] }
|
||
|
||
{ goals := #[{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "True"),
|
||
isInserted? := none,
|
||
isRemoved? := some true,
|
||
hyps := #[] },
|
||
{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "True"),
|
||
isInserted? := none,
|
||
isRemoved? := none,
|
||
hyps := #[] }] }
|
||
|
||
{ goals := #[{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "True"),
|
||
isInserted? := none,
|
||
isRemoved? := some true,
|
||
hyps := #[] }] }
|
||
|
||
{ goals := #[{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.append
|
||
#[Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/0/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.append
|
||
#[Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/0/1/0/1", diffStatus? := some "willChange" }
|
||
(Lean.Widget.TaggedText.text "x"),
|
||
Lean.Widget.TaggedText.text " + ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/0/1/1", diffStatus? := some "willChange" }
|
||
(Lean.Widget.TaggedText.text "z")]),
|
||
Lean.Widget.TaggedText.text " = ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.append
|
||
#[Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1/0/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "z"),
|
||
Lean.Widget.TaggedText.text " + ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "y")])]),
|
||
isInserted? := some false,
|
||
isRemoved? := none,
|
||
hyps := #[{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "Nat"),
|
||
names := #["x", "y", "z"],
|
||
isInserted? := none,
|
||
isRemoved? := none },
|
||
{ type := Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.append
|
||
#[Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/0/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "y"),
|
||
Lean.Widget.TaggedText.text " = ",
|
||
Lean.Widget.TaggedText.tag
|
||
{ subexprPos := "/1", diffStatus? := none }
|
||
(Lean.Widget.TaggedText.text "x")]),
|
||
names := #["h"],
|
||
isInserted? := none,
|
||
isRemoved? := none }] }] }
|
||
|