37 lines
1.4 KiB
Text
37 lines
1.4 KiB
Text
/-
|
||
Copyright (c) 2019 Microsoft Corporation. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Leonardo de Moura
|
||
-/
|
||
prelude
|
||
import Init.Lean.AuxRecursor
|
||
import Init.Lean.WHNF
|
||
import Init.Lean.Meta.Basic
|
||
|
||
namespace Lean
|
||
namespace Meta
|
||
|
||
private def isAuxDef? (constName : Name) : MetaM Bool :=
|
||
do env ← getEnv; pure (isAuxRecursor env constName || isNoConfusion env constName)
|
||
|
||
@[specialize] partial def unfoldDefinitionAux {α}
|
||
(whnf : Expr → MetaM Expr)
|
||
(inferType : Expr → MetaM Expr)
|
||
(isDefEq : Expr → Expr → MetaM Bool)
|
||
(synthesizePending : Expr → MetaM Bool)
|
||
(e : Expr)
|
||
(failK : MetaM α) (successK : Expr → MetaM α) : MetaM α :=
|
||
Lean.unfoldDefinitionAux getConstNoEx isAuxDef? whnf inferType isDefEq synthesizePending getLocalDecl
|
||
getExprMVarAssignment e (fun _ => failK) successK
|
||
|
||
@[specialize] partial def whnfAux
|
||
(inferType : Expr → MetaM Expr)
|
||
(isDefEq : Expr → Expr → MetaM Bool)
|
||
(synthesizePending : Expr → MetaM Bool)
|
||
: Expr → MetaM Expr
|
||
| e => whnfEasyCases getLocalDecl getExprMVarAssignment e $ fun e => do
|
||
e ← whnfCore getConstNoEx isAuxDef? whnfAux inferType isDefEq getLocalDecl getExprMVarAssignment e;
|
||
unfoldDefinitionAux whnfAux inferType isDefEq synthesizePending e (pure e) whnfAux
|
||
|
||
end Meta
|
||
end Lean
|