fix: mkAppM to typecheck at .default transparency (#7957)

This PR ensures that `mkAppM` can be used to construct terms that are
only type-correct at at default transparency, even if we are in
`withReducible` (e.g. in simp), so that simp does not stumble over
simplifying `let` expression with simplifiable type.reliable.

Here is a reproducer of the issue this solves:
```
example (a b : Nat) (h : a = b):
  (let _ : id Bool := true; a) = (let _ : Bool := true; b) := by
  simp -zeta -zetaDelta [h]
```

This fixes #7826.
This commit is contained in:
Joachim Breitner 2025-04-18 11:23:51 +02:00 committed by GitHub
parent e6343497a7
commit 02b206af9b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 43 additions and 1 deletions

View file

@ -304,7 +304,7 @@ private partial def mkAppMArgs (f : Expr) (fType : Expr) (xs : Array Expr) : Met
| _ =>
let x := xs[i]
let xType ← inferType x
if (← isDefEq d xType) then
if (← withAtLeastTransparency .default (isDefEq d xType)) then
loop b (i+1) j (args.push x) instMVars
else
throwAppTypeMismatch (mkAppN f args) x

View file

@ -0,0 +1,39 @@
axiom SparseSet : Nat → Type
def SparseSet.insert {n} (set : SparseSet n) (v : Fin n) : SparseSet n := sorry
inductive Node where
| epsilon (next : Nat)
structure NFA where
nodes : Array Node
def NFA.get (nfa : NFA) (i : Nat) (h : i < nfa.nodes.size) : Node :=
nfa.nodes[i]
structure Strategy' where
T : Type
-- set_option trace.Meta.appBuilder true
-- set_option trace.Meta.isDefEq true
def εClosure (σ : Strategy') (nfa : NFA) (states : SparseSet nfa.nodes.size) (stack : List (Fin nfa.nodes.size)) :
-- REPRO: using `σ.T` is necessary to reproduce.
Option σ.T :=
match stack with
| [] => .none
| state :: stack' =>
-- REPRO: removing this `if` fixes the error.
if true then
εClosure σ nfa states stack'
else
-- REPRO: this insert is necessary to reproduce.
let states' := states.insert state
match nfa.get state state.isLt with
| .epsilon state' =>
-- REPRO: this line is also necessary to reproduce.
have isLt : state' < nfa.nodes.size := sorry
sorry
-- REPRO: using well-founded recursion is necessary to reproduce.
-- NOTE: the original code uses well-founded recursion to take visited states (`states`) into account.
termination_by /-structural-/ stack

View file

@ -0,0 +1,3 @@
example (a b : Nat) (h : a = b):
(let _ : id Bool := true; a) = (let _ : Bool := true; b) := by
simp -zeta -zetaDelta [h]