feat: Elementarized tactics with motives, congruence, and absurdity #72
|
@ -0,0 +1,52 @@
|
||||||
|
import Lean
|
||||||
|
|
||||||
|
open Lean
|
||||||
|
|
||||||
|
namespace Pantograph
|
||||||
|
|
||||||
|
def _root_.Lean.Name.isAuxLemma (n : Lean.Name) : Bool := n matches .num (.str _ "_auxLemma") _
|
||||||
|
|
||||||
|
/-- Unfold all lemmas created by `Lean.Meta.mkAuxLemma`. These end in `_auxLemma.nn` where `nn` is a number. -/
|
||||||
|
def unfoldAuxLemmas (e : Expr) : CoreM Expr := do
|
||||||
|
Lean.Meta.deltaExpand e Lean.Name.isAuxLemma
|
||||||
|
|
||||||
|
def instantiatePartialDelayedMVars (e: Expr): MetaM Expr := do
|
||||||
|
Meta.transform e
|
||||||
|
(pre := fun e => e.withApp fun f args => do
|
||||||
|
if let .mvar mvarId := f then
|
||||||
|
if let some decl ← getDelayedMVarAssignment? mvarId then
|
||||||
|
if args.size ≥ decl.fvars.size then
|
||||||
|
let pending ← instantiateMVars (.mvar decl.mvarIdPending)
|
||||||
|
if !pending.isMVar then
|
||||||
|
return .visit <| (← Meta.mkLambdaFVars decl.fvars pending).beta args
|
||||||
|
return .continue)
|
||||||
|
|
||||||
|
@[export pantograph_instantiate_all_meta_m]
|
||||||
|
def instantiateAll (e: Expr): MetaM Expr := do
|
||||||
|
let e ← instantiateMVars e
|
||||||
|
let e ← unfoldAuxLemmas e
|
||||||
|
--let e ← instantiatePartialDelayedMVars e
|
||||||
|
return e
|
||||||
|
|
||||||
|
structure DelayedMVarInvocation where
|
||||||
|
mvarIdPending: MVarId
|
||||||
|
args: Array (FVarId × Expr)
|
||||||
|
tail: Array Expr
|
||||||
|
|
||||||
|
@[export pantograph_to_delayed_mvar_invocation_meta_m]
|
||||||
|
def toDelayedMVarInvocation (e: Expr): MetaM (Option DelayedMVarInvocation) := do
|
||||||
|
let .mvar mvarId := e.getAppFn | return .none
|
||||||
|
let .some decl ← getDelayedMVarAssignment? mvarId | return .none
|
||||||
|
let mvarIdPending := decl.mvarIdPending
|
||||||
|
-- Print the function application e. See Lean's `withOverApp`
|
||||||
|
let args := e.getAppArgs
|
||||||
|
|
||||||
|
assert! args.size >= decl.fvars.size
|
||||||
|
|
||||||
|
return .some {
|
||||||
|
mvarIdPending,
|
||||||
|
args := decl.fvars.map (·.fvarId!) |>.zip args,
|
||||||
|
tail := args.toList.drop decl.fvars.size |>.toArray,
|
||||||
|
}
|
||||||
|
|
||||||
|
end Pantograph
|
|
@ -78,6 +78,10 @@ def createCoreState (imports: Array String): IO Lean.Core.State := do
|
||||||
(trustLevel := 1)
|
(trustLevel := 1)
|
||||||
return { env := env }
|
return { env := env }
|
||||||
|
|
||||||
|
@[export pantograph_create_meta_context]
|
||||||
|
def createMetaContext: IO Lean.Meta.Context := do
|
||||||
|
return {}
|
||||||
|
|
||||||
@[export pantograph_env_catalog_m]
|
@[export pantograph_env_catalog_m]
|
||||||
def envCatalog: Lean.CoreM Protocol.EnvCatalogResult :=
|
def envCatalog: Lean.CoreM Protocol.EnvCatalogResult :=
|
||||||
Environment.catalog ({}: Protocol.EnvCatalog)
|
Environment.catalog ({}: Protocol.EnvCatalog)
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
All serialisation functions
|
All serialisation functions
|
||||||
-/
|
-/
|
||||||
import Lean
|
import Lean
|
||||||
|
import Pantograph.Expr
|
||||||
|
|
||||||
import Pantograph.Protocol
|
import Pantograph.Protocol
|
||||||
import Pantograph.Goal
|
import Pantograph.Goal
|
||||||
|
@ -10,30 +11,8 @@ open Lean
|
||||||
|
|
||||||
-- Symbol processing functions --
|
-- Symbol processing functions --
|
||||||
|
|
||||||
def Lean.Name.isAuxLemma (n : Lean.Name) : Bool := n matches .num (.str _ "_auxLemma") _
|
|
||||||
|
|
||||||
namespace Pantograph
|
namespace Pantograph
|
||||||
|
|
||||||
/-- Unfold all lemmas created by `Lean.Meta.mkAuxLemma`. These end in `_auxLemma.nn` where `nn` is a number. -/
|
|
||||||
def unfoldAuxLemmas (e : Expr) : CoreM Expr := do
|
|
||||||
Lean.Meta.deltaExpand e Lean.Name.isAuxLemma
|
|
||||||
|
|
||||||
def instantiatePartialDelayedMVars (e: Expr): MetaM Expr := do
|
|
||||||
Meta.transform e
|
|
||||||
(pre := fun e => e.withApp fun f args => do
|
|
||||||
if let .mvar mvarId := f then
|
|
||||||
if let some decl ← getDelayedMVarAssignment? mvarId then
|
|
||||||
if args.size ≥ decl.fvars.size then
|
|
||||||
let pending ← instantiateMVars (.mvar decl.mvarIdPending)
|
|
||||||
if !pending.isMVar then
|
|
||||||
return .visit <| (← Meta.mkLambdaFVars decl.fvars pending).beta args
|
|
||||||
return .continue)
|
|
||||||
|
|
||||||
def instantiateAll (e: Expr): MetaM Expr := do
|
|
||||||
let e ← instantiateMVars e
|
|
||||||
let e ← unfoldAuxLemmas e
|
|
||||||
--let e ← instantiatePartialDelayedMVars e
|
|
||||||
return e
|
|
||||||
|
|
||||||
--- Input Functions ---
|
--- Input Functions ---
|
||||||
|
|
||||||
|
@ -101,26 +80,6 @@ partial def serializeSortLevel (level: Level) (sanitize: Bool): String :=
|
||||||
| _, .zero => s!"{k}"
|
| _, .zero => s!"{k}"
|
||||||
| _, _ => s!"(+ {u_str} {k})"
|
| _, _ => s!"(+ {u_str} {k})"
|
||||||
|
|
||||||
structure DelayedMVarInvocation where
|
|
||||||
mvarIdPending: MVarId
|
|
||||||
args: Array (FVarId × Expr)
|
|
||||||
tail: Array Expr
|
|
||||||
|
|
||||||
def toDelayedMVarInvocation (e: Expr): MetaM (Option DelayedMVarInvocation) := do
|
|
||||||
let .mvar mvarId := e.getAppFn | return .none
|
|
||||||
let .some decl ← getDelayedMVarAssignment? mvarId | return .none
|
|
||||||
let mvarIdPending := decl.mvarIdPending
|
|
||||||
-- Print the function application e. See Lean's `withOverApp`
|
|
||||||
let args := e.getAppArgs
|
|
||||||
|
|
||||||
assert! args.size >= decl.fvars.size
|
|
||||||
|
|
||||||
return .some {
|
|
||||||
mvarIdPending,
|
|
||||||
args := decl.fvars.map (·.fvarId!) |>.zip args,
|
|
||||||
tail := args.toList.drop decl.fvars.size |>.toArray,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/--
|
/--
|
||||||
Completely serializes an expression tree. Json not used due to compactness
|
Completely serializes an expression tree. Json not used due to compactness
|
||||||
|
|
Loading…
Reference in New Issue