Zulip Chat Archive
Stream: lean4 dev
Topic: Catching mvars in `MVarId.apply`
Leni Aniva (Feb 09 2025 at 09:35):
I think the MVarId catching logic in MVarId.apply should get mvars from the actual expression assignment to the current goal:
let otherMVarIds ← getMVarsNoDelayed (mkAppN e newMVars)
as opposed to
let otherMVarIds ← getMVarsNoDelayed e
This is because the isDefEqApply in the go loop could potentially delay assign some mvars in newMVars, in which case the value of the delayed assignment would be lost since otherMVarIds only contain mvars from e.
I found a corner case in my project that suffers from this issue, but I don't know how to reliably reproduce this case.
Leni Aniva (Feb 11 2025 at 00:17):
Specifically when ctxApprox is true, isExprDefEq can cause mvars in newMVars to be assigned to another (unassigned) mvar with a smaller context, so there should be a way to catch them.
e.g.
let newMVars ← newMVars.filterM fun mvar => not <$> mvar.mvarId!.isAssigned
Instead of this, we could have
let newMVars ← newMVars.filterMapM fun mvar => do
match ← getExprMVarAssignment? mvar with
| .none => pure $ .some mvar
| .some (.mvar inner) => pure $ .some inner
| .some _ => pure .none
which will ensure ctxApprox'd mvars are accounted for.
Leni Aniva (Feb 13 2025 at 01:58):
I don't know how to reliably trigger ctxApprox. Otherwise I can write a MWE that showcases when .apply loses track of a mvar.
Last updated: May 02 2025 at 03:31 UTC