42 lines
1.4 KiB
Text
42 lines
1.4 KiB
Text
/-
|
||
Copyright (c) 2022 Microsoft Corporation. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Leonardo de Moura
|
||
-/
|
||
import Lean.Meta.Reduce
|
||
import Lean.Meta.Tactic.Util
|
||
|
||
namespace Lean.Meta
|
||
|
||
private def useKernel (lhs rhs : Expr) : MetaM Bool := do
|
||
if lhs.hasFVar || lhs.hasMVar || rhs.hasFVar || rhs.hasMVar then
|
||
return false
|
||
else
|
||
return (← getTransparency) matches TransparencyMode.default | TransparencyMode.all
|
||
|
||
/--
|
||
Close given goal using `Eq.refl`.
|
||
-/
|
||
def _root_.Lean.MVarId.refl (mvarId : MVarId) : MetaM Unit := do
|
||
mvarId.withContext do
|
||
mvarId.checkNotAssigned `refl
|
||
let targetType ← mvarId.getType'
|
||
unless targetType.isAppOfArity ``Eq 3 do
|
||
throwTacticEx `rfl mvarId m!"equality expected{indentExpr targetType}"
|
||
let lhs ← instantiateMVars targetType.appFn!.appArg!
|
||
let rhs ← instantiateMVars targetType.appArg!
|
||
let success ← if (← useKernel lhs rhs) then
|
||
pure (Kernel.isDefEq (← getEnv) {} lhs rhs)
|
||
else
|
||
isDefEq lhs rhs
|
||
unless success do
|
||
throwTacticEx `rfl mvarId m!"equality lhs{indentExpr lhs}\nis not definitionally equal to rhs{indentExpr rhs}"
|
||
let us := targetType.getAppFn.constLevels!
|
||
let α := targetType.appFn!.appFn!.appArg!
|
||
mvarId.assign (mkApp2 (mkConst ``Eq.refl us) α lhs)
|
||
|
||
@[deprecated MVarId.refl]
|
||
def refl (mvarId : MVarId) : MetaM Unit := do
|
||
mvarId.refl
|
||
|
||
end Lean.Meta
|