From cf174280014dcfa3533e15b85a455bd2146e2951 Mon Sep 17 00:00:00 2001 From: Leni Aniva Date: Wed, 15 May 2024 21:34:15 -0700 Subject: [PATCH] fix: Panic in partial instantiation --- Pantograph/Expr.lean | 10 ++++++++-- Test/Integration.lean | 4 ++-- Test/Proofs.lean | 6 +++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Pantograph/Expr.lean b/Pantograph/Expr.lean index 7e691d5..85c7f35 100644 --- a/Pantograph/Expr.lean +++ b/Pantograph/Expr.lean @@ -14,18 +14,24 @@ def instantiatePartialDelayedMVars (e: Expr): MetaM Expr := do Meta.transform e (pre := fun e => e.withApp fun f args => do if let .mvar mvarId := f then + if ← mvarId.isAssigned then + return .visit <| (← instantiateMVars e) if let some decl ← getDelayedMVarAssignment? mvarId then if args.size ≥ decl.fvars.size then + -- Do not use instantiateMVars here. Only one step of instantiation should happen. let pending ← instantiateMVars (.mvar decl.mvarIdPending) if !pending.isMVar then - return .visit <| (← Meta.mkLambdaFVars decl.fvars pending).beta args + let pending := pending.abstract decl.fvars + let pending := pending.instantiateRevRange 0 decl.fvars.size args + let pending := mkAppRange pending decl.fvars.size args.size args + return .visit <| pending return .continue) @[export pantograph_instantiate_all_meta_m] def instantiateAll (e: Expr): MetaM Expr := do let e ← instantiateMVars e + let e ← instantiatePartialDelayedMVars e let e ← unfoldAuxLemmas e - --let e ← instantiatePartialDelayedMVars e return e structure DelayedMVarInvocation where diff --git a/Test/Integration.lean b/Test/Integration.lean index 9bd5db6..66b3637 100644 --- a/Test/Integration.lean +++ b/Test/Integration.lean @@ -88,11 +88,11 @@ def test_tactic : IO LSpec.TestSeq := vars := #[{ name := "_uniq.10", userName := "x", isInaccessible? := .some false, type? := .some { pp? := .some "Prop" }}], } let goal2: Protocol.Goal := { - name := "_uniq.14", + name := "_uniq.17", target := { pp? := .some "x ∨ y → y ∨ x" }, vars := #[ { name := "_uniq.10", userName := "x", isInaccessible? := .some false, type? := .some { pp? := .some "Prop" }}, - { name := "_uniq.13", userName := "y", isInaccessible? := .some false, type? := .some { pp? := .some "Prop" }} + { name := "_uniq.16", userName := "y", isInaccessible? := .some false, type? := .some { pp? := .some "Prop" }} ], } subroutine_runner [ diff --git a/Test/Proofs.lean b/Test/Proofs.lean index b09e403..ea6ff11 100644 --- a/Test/Proofs.lean +++ b/Test/Proofs.lean @@ -771,7 +771,7 @@ def test_nat_zero_add_alt: TestM Unit := do | other => do addTest $ assertUnreachable $ other.toString return () - let (eqL, eqR, eqT) := ("_uniq.85", "_uniq.86", "_uniq.84") + let (eqL, eqR, eqT) := ("_uniq.88", "_uniq.89", "_uniq.87") addTest $ LSpec.check tactic $ state3m2.goals.map (·.name.toString) = [eqL, eqR, eqT] let [_motive, _major, _step, conduit] := state2.goals | panic! "Goals conflict" let state2b ← match state3m2.resume [conduit] with @@ -789,8 +789,8 @@ def test_nat_zero_add_alt: TestM Unit := do name := "_uniq.70", userName? := .some "conduit", target := { - pp? := .some "?m.79 ?m.68 = (n + 0 = n)", - sexp? := .some s!"((:c Eq) (:sort 0) (:subst ((:c Eq) (:mv {eqT}) (:mv {eqL}) (:mv {eqR})) (:fv {fvN}) (:mv {major})) ((:c Eq) (:c Nat) ({cNatAdd} (:fv {fvN}) {cNat0}) (:fv {fvN})))", + pp? := .some "(?motive.a = ?motive.a) = (n + 0 = n)", + sexp? := .some s!"((:c Eq) (:sort 0) ((:c Eq) (:mv {eqT}) (:mv {eqL}) (:mv {eqR})) ((:c Eq) (:c Nat) ({cNatAdd} (:fv {fvN}) {cNat0}) (:fv {fvN})))", }, vars := #[{ name := fvN,