@@ -166,7 +166,7 @@ it is a free variable, a type (or type former), or `lcErased`.
166166
167167`Check.lean` contains a substitution validator.
168168-/
169- abbrev FVarSubst := Std.HashMap FVarId Expr
169+ abbrev FVarSubst := Std.HashMap FVarId Arg
170170
171171/--
172172Replace the free variables in `e` using the given substitution.
@@ -191,7 +191,9 @@ where
191191 if e.hasFVar then
192192 match e with
193193 | .fvar fvarId => match s[fvarId]? with
194- | some e => if translator then e else go e
194+ | some (.fvar fvarId') => if translator then .fvar fvarId' else go (.fvar fvarId')
195+ | some (.type e) => if translator then e else go e
196+ | some .erased => erasedExpr
195197 | none => e
196198 | .lit .. | .const .. | .sort .. | .mvar .. | .bvar .. => e
197199 | .app f a => e.updateApp! (goApp f) (go a) |>.headBeta
@@ -230,11 +232,9 @@ private partial def normFVarImp (s : FVarSubst) (fvarId : FVarId) (translator :
230232 .fvar fvarId'
231233 else
232234 normFVarImp s fvarId' translator
233- | some e =>
234- if e.isErased then
235- .erased
236- else
237- panic! s! "invalid LCNF substitution of free variable with expression { e} "
235+ -- Types and type formers are only preserved as hints and
236+ -- are erased in computationally relevant contexts.
237+ | some .erased | some (.type _) => .erased
238238 | none => .fvar fvarId
239239
240240/--
@@ -247,10 +247,9 @@ private partial def normArgImp (s : FVarSubst) (arg : Arg) (translator : Bool) :
247247 | .erased => arg
248248 | .fvar fvarId =>
249249 match s[fvarId]? with
250- | some (.fvar fvarId') =>
251- let arg' := .fvar fvarId'
250+ | some (arg'@(.fvar _)) =>
252251 if translator then arg' else normArgImp s arg' translator
253- | some e => if e.isErased then . erased else .type e
252+ | some (arg'@. erased) | some (arg'@( .type _)) => arg'
254253 | none => arg
255254 | .type e => arg.updateType! (normExprImp s e translator)
256255
@@ -293,19 +292,18 @@ instance (m n) [MonadLift m n] [MonadFVarSubstState m] : MonadFVarSubstState n w
293292 modifySubst f := liftM (modifySubst f : m _)
294293
295294/--
296- Add the entry `fvarId ↦ fvarId'` to the free variable substitution.
295+ Add the substitution `fvarId ↦ e`, `e` must be a valid LCNF `Arg`.
296+
297+ See `Check.lean` for the free variable substitution checker.
297298-/
298- @[inline] def addFVarSubst [MonadFVarSubstState m] (fvarId : FVarId) (fvarId' : FVarId ) : m Unit :=
299- modifySubst fun s => s.insert fvarId (.fvar fvarId')
299+ @[inline] def addSubst [MonadFVarSubstState m] (fvarId : FVarId) (arg : Arg ) : m Unit :=
300+ modifySubst fun s => s.insert fvarId arg
300301
301302/--
302- Add the substitution `fvarId ↦ e`, `e` must be a valid LCNF argument.
303- That is, it must be a free variable, type (or type former), or `lcErased`.
304-
305- See `Check.lean` for the free variable substitution checker.
303+ Add the entry `fvarId ↦ fvarId'` to the free variable substitution.
306304-/
307- @[inline] def addSubst [MonadFVarSubstState m] (fvarId : FVarId) (e : Expr ) : m Unit :=
308- modifySubst fun s => s.insert fvarId e
305+ @[inline] def addFVarSubst [MonadFVarSubstState m] (fvarId : FVarId) (fvarId' : FVarId ) : m Unit :=
306+ modifySubst fun s => s.insert fvarId (.fvar fvarId')
309307
310308@[inline, inherit_doc normFVarImp] def normFVar [MonadFVarSubst m t] [Monad m] (fvarId : FVarId) : m NormFVarResult :=
311309 return normFVarImp (← getSubst) fvarId t
0 commit comments