Guest User

Untitled

a guest
May 23rd, 2023
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.31 KB | None | 0 0
  1. import Lean
  2.  
  3. structure Context where
  4. env: Lean.Environment
  5. coreContext : Lean.Core.Context := {
  6. currNamespace := Lean.Name.anonymous,
  7. openDecls := [], -- No 'open' directives needed
  8. fileName := "<onion>",
  9. fileMap := { source := "", positions := #[0], lines := #[1] }
  10. }
  11. elabContext : Lean.Elab.Term.Context := {
  12. declName? := some "Onion",
  13. errToSorry := false
  14. }
  15.  
  16. abbrev M (m: Type → Type) := ReaderT Context m
  17.  
  18. def parse_expr (env: Lean.Environment) (s: String): Lean.Elab.TermElabM Lean.Expr := do
  19. let syn := Lean.Parser.runParserCategory
  20. (env := env)
  21. (catName := `term)
  22. (input := s)
  23. (fileName := "<stdin>") |>.toOption |>.get!
  24. let expr ← Lean.Elab.Term.elabType syn
  25. -- Immediately synthesise all metavariables since we need to leave the elaboration context.
  26. -- See https://leanprover.zulipchat.com/#narrow/stream/270676-lean4/topic/Unknown.20universe.20metavariable/near/360130070
  27. Lean.Elab.Term.synthesizeSyntheticMVarsNoPostponing
  28. let expr ← Lean.instantiateMVars expr
  29. return expr
  30.  
  31. def start_tactic_state (expr: Lean.Expr): Lean.Elab.TermElabM Lean.Elab.Tactic.SavedState := do
  32. let mvar ← Lean.Meta.mkFreshExprMVar (some expr) (kind := Lean.MetavarKind.synthetic)
  33. let termState : Lean.Elab.Term.SavedState ← Lean.Elab.Term.saveState
  34. let tacticState : Lean.Elab.Tactic.SavedState := { term := termState, tactic := { goals := [mvar.mvarId!] }}
  35. IO.println "Tactic state started"
  36. return tacticState
  37.  
  38. def execute_tactic (env: Lean.Environment) (state: Lean.Elab.Tactic.SavedState) (tactic: String): Lean.Elab.TermElabM Lean.Elab.Tactic.SavedState := do
  39. let stx := Lean.Parser.runParserCategory
  40. (env := env)
  41. (catName := `tactic)
  42. (input := tactic)
  43. (fileName := "<stdin>") |>.toOption |>.get!
  44. state.term.restore
  45. let tac : Lean.Elab.Tactic.TacticM Unit := set state.tactic *> Lean.Elab.Tactic.evalTactic stx
  46. let mvarId := state.tactic.goals.get! 0
  47. Lean.Elab.Term.synthesizeSyntheticMVarsNoPostponing
  48. let unsolvedGoals ← Lean.Elab.Tactic.run mvarId tac
  49. if (← getThe Lean.Core.State).messages.hasErrors then
  50. let messages := (← getThe Lean.Core.State).messages |>.toList.toArray
  51. let errors ← (messages.map Lean.Message.data).mapM fun md => md.toString
  52. IO.println s!"{errors}"
  53. return state
  54. else
  55. unsolvedGoals.forM Lean.instantiateMVarDeclMVars
  56. let nextState : Lean.Elab.Tactic.SavedState := {
  57. term := (← Lean.Elab.Term.saveState),
  58. tactic := { goals := unsolvedGoals }
  59. }
  60. let goals ← unsolvedGoals.mapM fun g => do pure $ toString (← Lean.Meta.ppGoal g)
  61. IO.println s!"Tactic succeeded with goals {goals}"
  62. return nextState
  63.  
  64. def term_elab_layer (termElabM: Lean.Elab.TermElabM α): M IO (α × Lean.Core.State) := do
  65. let context ← read
  66. let metaM : Lean.MetaM α := termElabM.run' (ctx := context.elabContext)
  67. let coreM : Lean.CoreM α := metaM.run'
  68. let coreState : Lean.Core.State := { env := context.env }
  69. coreM.toIO context.coreContext coreState
  70. def meta_layer (metaM: Lean.MetaM α): M IO (α × Lean.Core.State) := do
  71. let context ← read
  72. let coreM : Lean.CoreM α := metaM.run'
  73. let coreState : Lean.Core.State := { env := context.env }
  74. coreM.toIO context.coreContext coreState
  75. def core_layer_2 (coreM: Lean.CoreM α): M IO (α × Lean.Core.State) := do
  76. let context ← read
  77. let coreState : Lean.Core.State := { env := context.env }
  78. let core := coreM.run context.coreContext coreState
  79. match (← core.toIO') with
  80. | .ok result => return result
  81. | .error e =>
  82. IO.println s!"Oh no {← e.toMessageData.toString}"
  83. sorry
  84.  
  85. def core_layer (coreM: Lean.CoreM α): M IO (α × Lean.Core.State) := do
  86. let context ← read
  87. let coreState : Lean.Core.State := { env := context.env }
  88. coreM.toIO context.coreContext coreState
  89.  
  90. def Context.to_meta (context: Context) (termElabM: Lean.Elab.TermElabM α): Lean.MetaM α :=
  91. termElabM.run' (ctx := context.elabContext)
  92. def Context.to_core (context: Context) (termElabM: Lean.Elab.TermElabM α): Lean.CoreM α :=
  93. context.to_meta termElabM |>.run'
  94. def Context.to_io_2 (context: Context) (termElabM: Lean.Elab.TermElabM α): IO α := do
  95. let coreState : Lean.Core.State := { env := context.env }
  96. let core := context.to_core termElabM |>.run context.coreContext coreState
  97. match (← core.toIO') with
  98. | .ok result => return result.fst
  99. | .error e =>
  100. IO.println s!"Oh no {← e.toMessageData.toString}"
  101. sorry
  102. def Context.to_io (context: Context) (termElabM: Lean.Elab.TermElabM α): IO α := do
  103. let coreState : Lean.Core.State := { env := context.env }
  104. let (ret, _) ← context.to_core termElabM |>.toIO context.coreContext coreState
  105. return ret
  106.  
  107.  
  108. def proof_term_elab: M IO Unit := do
  109. let context ← read
  110. let env := context.env
  111. let (_, _) ← term_elab_layer <| do
  112. let expr ← parse_expr env "∀ (p q: Prop), p ∨ q → q ∨ p"
  113. let state ← start_tactic_state expr
  114. let state ← execute_tactic env state "intro p q h"
  115. let state ← execute_tactic env state "cases h"
  116. let _ ← execute_tactic env state "apply Or.inr"
  117. IO.println "Completed"
  118. def proof_core: M IO Unit := do
  119. let context ← read
  120. let env := context.env
  121. let (_, _) ← core_layer <| do
  122. let expr ← context.to_core <| parse_expr env "∀ (p q: Prop), p ∨ q → q ∨ p"
  123. let state ← context.to_core <| start_tactic_state expr
  124. let state ← context.to_core <| execute_tactic env state "intro p q h"
  125. let state ← context.to_core <| execute_tactic env state "cases h"
  126. let _ ← context.to_core <| execute_tactic env state "apply Or.inr"
  127. IO.println "Completed"
  128. def proof_core_2: M IO Unit := do
  129. let context ← read
  130. let env := context.env
  131. let (_, _) ← core_layer_2 <| do
  132. let expr ← context.to_core <| parse_expr env "∀ (p q: Prop), p ∨ q → q ∨ p"
  133. let state ← context.to_core <| start_tactic_state expr
  134. let state ← context.to_core <| execute_tactic env state "intro p q h"
  135. let state ← context.to_core <| execute_tactic env state "cases h"
  136. let _ ← context.to_core <| execute_tactic env state "apply Or.inr"
  137. IO.println "Completed"
  138. def proof_io_2: M IO Unit := do
  139. let context ← read
  140. let env := context.env
  141. let expr ← context.to_io_2 <| parse_expr env "∀ (p q: Prop), p ∨ q → q ∨ p"
  142. let state ← context.to_io_2 <| start_tactic_state expr
  143. let state ← context.to_io_2 <| execute_tactic env state "intro p q h"
  144. let state ← context.to_io_2 <| execute_tactic env state "cases h"
  145. let _ ← context.to_io_2 <| execute_tactic env state "apply Or.inr"
  146. IO.println "Completed"
  147. def proof_io: M IO Unit := do
  148. let context ← read
  149. let env := context.env
  150. let expr ← context.to_io <| parse_expr env "∀ (p q: Prop), p ∨ q → q ∨ p"
  151. let state ← context.to_io <| start_tactic_state expr
  152. let state ← context.to_io <| execute_tactic env state "intro p q h"
  153. let state ← context.to_io <| execute_tactic env state "cases h"
  154. let _ ← context.to_io <| execute_tactic env state "apply Or.inr"
  155. IO.println "Completed"
  156.  
  157.  
  158. def main := do
  159. let env ← Lean.importModules
  160. (imports := [{ module := Lean.Name.str .anonymous "Init", runtimeOnly := false }])
  161. (opts := {})
  162. (trustLevel := 1)
  163. proof_term_elab |>.run { env := env }
  164.  
Add Comment
Please, Sign In to add comment