35 lines
1 KiB
Text
35 lines
1 KiB
Text
/-
|
|
Copyright (c) 2020 Microsoft Corporation. All rights reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
Authors: Leonardo de Moura
|
|
-/
|
|
import Lean.Util.ReplaceExpr
|
|
|
|
namespace Lean.Meta
|
|
|
|
/- A mapping from MVarId to MVarId -/
|
|
structure MVarRenaming where
|
|
map : NameMap MVarId := {}
|
|
|
|
def MVarRenaming.isEmpty (s : MVarRenaming) : Bool :=
|
|
s.map.isEmpty
|
|
|
|
def MVarRenaming.find? (s : MVarRenaming) (mvarId : MVarId) : Option MVarId :=
|
|
s.map.find? mvarId
|
|
|
|
def MVarRenaming.find! (s : MVarRenaming) (mvarId : MVarId) : MVarId :=
|
|
(s.find? mvarId).get!
|
|
|
|
def MVarRenaming.insert (s : MVarRenaming) (mvarId mvarId' : MVarId) : MVarRenaming :=
|
|
{ s with map := s.map.insert mvarId mvarId' }
|
|
|
|
def MVarRenaming.apply (s : MVarRenaming) (e : Expr) : Expr :=
|
|
if !e.hasMVar then e
|
|
else if s.map.isEmpty then e
|
|
else e.replace $ fun e => match e with
|
|
| Expr.mvar mvarId _ => match s.map.find? mvarId with
|
|
| none => e
|
|
| some newMVarId => mkMVar newMVarId
|
|
| _ => none
|
|
|
|
end Lean.Meta
|