Zulip Chat Archive
Stream: lean4
Topic: parenthesizer backtrack errors?
Daniel Selsam (Apr 14 2021 at 02:22):
I see a bunch of "HACK" warnings in https://github.com/leanprover/lean4/blob/master/src/Lean/PrettyPrinter/Parenthesizer.lean Are errors @ https://github.com/leanprover/lean4/blob/master/src/Lean/PrettyPrinter/Parenthesizer.lean#L539 expected? Here is a short example that triggers it:
import Lean
open Lean Lean.PrettyPrinter.Delaborator
axiom Nat.mul2plus (n : Nat) : 2 * n = n + n
theorem foo (n : Nat) (h : 2 * n = n + n) : n + n = n + n := by
simp only [Nat.mul2plus] at h
exact h
@[delab app.Eq.mp]
def delabSimpHyp : Delab := do
let arg := (← getExpr).appArg!
let h := mkIdent (← Meta.getFVarLocalDecl arg).userName
let lemmas := #[`Nat.mul2plus].map mkIdent
`(by simp only [$[$lemmas:term],*] at $h)
#print foo -- parenthesizer backtracking exception
Sebastian Ullrich (Apr 14 2021 at 07:23):
Yes, these are expected/unavoidable if the syntax tree is malformed. In this case, it should be $h:ident
.
Daniel Selsam (Apr 14 2021 at 13:21):
@Sebastian Ullrich Thanks, indeed $h:ident
fixes it. Any suggestions for how I might have diagnosed/debugged that on my own?
Sebastian Ullrich (Apr 14 2021 at 18:11):
My line of reasoning basically was "I hope it's not a bug in the parenthesizer... so let's assume the syntax tree is malformed. $lemmas:term
looks good, it is actually fed a term. So maybe $h
is underspecified? Oh yeah, at
also takes other arguments like *
, so let's try :ident
."
Sebastian Ullrich (Apr 14 2021 at 18:14):
But using quotations correctly in non-trivial syntax is simply tough right now. Ideally the original code should fail to typecheck because mkIdent
should return some TSyntax `ident
while $h
would expect some TSyntax `location
(or maybe the former even automatically coerces into the latter in the right way), but that would be a pretty fundamental and extensive change.
Last updated: Dec 20 2023 at 11:08 UTC