@@ -336,6 +336,8 @@ structure MetavarContext where
336
336
For more information about delayed abstraction, see the docstring for `DelayedMetavarAssignment`. -/
337
337
dAssignment : PersistentHashMap MVarId DelayedMetavarAssignment := {}
338
338
339
+ instance : Inhabited MetavarContext := ⟨{}⟩
340
+
339
341
/-- A monad with a stateful metavariable context, defining `getMCtx` and `modifyMCtx`. -/
340
342
class MonadMCtx (m : Type → Type ) where
341
343
getMCtx : m MetavarContext
@@ -358,15 +360,27 @@ abbrev setMCtx [MonadMCtx m] (mctx : MetavarContext) : m Unit :=
358
360
abbrev getLevelMVarAssignment? [Monad m] [MonadMCtx m] (mvarId : LMVarId) : m (Option Level) :=
359
361
return (← getMCtx).lAssignment.find? mvarId
360
362
363
+ @[export lean_get_lmvar_assignment]
364
+ def getLevelMVarAssignmentExp (m : MetavarContext) (mvarId : LMVarId) : Option Level :=
365
+ m.lAssignment.find? mvarId
366
+
361
367
def MetavarContext.getExprAssignmentCore? (m : MetavarContext) (mvarId : MVarId) : Option Expr :=
362
368
m.eAssignment.find? mvarId
363
369
370
+ @[export lean_get_mvar_assignment]
371
+ def MetavarContext.getExprAssignmentExp (m : MetavarContext) (mvarId : MVarId) : Option Expr :=
372
+ m.eAssignment.find? mvarId
373
+
364
374
def getExprMVarAssignment? [Monad m] [MonadMCtx m] (mvarId : MVarId) : m (Option Expr) :=
365
375
return (← getMCtx).getExprAssignmentCore? mvarId
366
376
367
377
def MetavarContext.getDelayedMVarAssignmentCore? (mctx : MetavarContext) (mvarId : MVarId) : Option DelayedMetavarAssignment :=
368
378
mctx.dAssignment.find? mvarId
369
379
380
+ @[export lean_get_delayed_mvar_assignment]
381
+ def MetavarContext.getDelayedMVarAssignmentExp (mctx : MetavarContext) (mvarId : MVarId) : Option DelayedMetavarAssignment :=
382
+ mctx.dAssignment.find? mvarId
383
+
370
384
def getDelayedMVarAssignment? [Monad m] [MonadMCtx m] (mvarId : MVarId) : m (Option DelayedMetavarAssignment) :=
371
385
return (← getMCtx).getDelayedMVarAssignmentCore? mvarId
372
386
@@ -478,6 +492,10 @@ def hasAssignableMVar [Monad m] [MonadMCtx m] : Expr → m Bool
478
492
def assignLevelMVar [MonadMCtx m] (mvarId : LMVarId) (val : Level) : m Unit :=
479
493
modifyMCtx fun m => { m with lAssignment := m.lAssignment.insert mvarId val }
480
494
495
+ @[export lean_assign_lmvar]
496
+ def assignLevelMVarExp (m : MetavarContext) (mvarId : LMVarId) (val : Level) : MetavarContext :=
497
+ { m with lAssignment := m.lAssignment.insert mvarId val }
498
+
481
499
/--
482
500
Add `mvarId := x` to the metavariable assignment.
483
501
This method does not check whether `mvarId` is already assigned, nor it checks whether
@@ -487,6 +505,10 @@ This is a low-level API, and it is safer to use `isDefEq (mkMVar mvarId) x`.
487
505
def _root_.Lean.MVarId.assign [MonadMCtx m] (mvarId : MVarId) (val : Expr) : m Unit :=
488
506
modifyMCtx fun m => { m with eAssignment := m.eAssignment.insert mvarId val }
489
507
508
+ @[export lean_assign_mvar]
509
+ def assignExp (m : MetavarContext) (mvarId : MVarId) (val : Expr) : MetavarContext :=
510
+ { m with eAssignment := m.eAssignment.insert mvarId val }
511
+
490
512
/--
491
513
Add a delayed assignment for the given metavariable. You must make sure that
492
514
the metavariable is not already assigned or delayed-assigned.
@@ -516,6 +538,9 @@ To avoid this term eta-expanded term, we apply beta-reduction when instantiating
516
538
This operation is performed at `instantiateExprMVars`, `elimMVarDeps`, and `levelMVarToParam`.
517
539
-/
518
540
541
+ @[extern "lean_instantiate_level_mvars"]
542
+ opaque instantiateLevelMVarsImp (mctx : MetavarContext) (l : Level) : MetavarContext × Level
543
+
519
544
partial def instantiateLevelMVars [Monad m] [MonadMCtx m] : Level → m Level
520
545
| lvl@(Level.succ lvl₁) => return Level.updateSucc! lvl (← instantiateLevelMVars lvl₁)
521
546
| lvl@(Level.max lvl₁ lvl₂) => return Level.updateMax! lvl (← instantiateLevelMVars lvl₁) (← instantiateLevelMVars lvl₂)
@@ -531,6 +556,9 @@ partial def instantiateLevelMVars [Monad m] [MonadMCtx m] : Level → m Level
531
556
| none => pure lvl
532
557
| lvl => pure lvl
533
558
559
+ @[extern "lean_instantiate_expr_mvars"]
560
+ opaque instantiateExprMVarsImp (mctx : MetavarContext) (e : Expr) : MetavarContext × Expr
561
+
534
562
/-- instantiateExprMVars main function -/
535
563
partial def instantiateExprMVars [Monad m] [MonadMCtx m] [STWorld ω m] [MonadLiftT (ST ω) m] (e : Expr) : MonadCacheT ExprStructEq Expr m Expr :=
536
564
if !e.hasMVar then
@@ -792,8 +820,6 @@ def localDeclDependsOnPred [Monad m] [MonadMCtx m] (localDecl : LocalDecl) (pf :
792
820
793
821
namespace MetavarContext
794
822
795
- instance : Inhabited MetavarContext := ⟨{}⟩
796
-
797
823
@[export lean_mk_metavar_ctx]
798
824
def mkMetavarContext : Unit → MetavarContext := fun _ => {}
799
825
0 commit comments