feat: Prograde tactics #83
|
@ -51,7 +51,7 @@ structure Variable where
|
||||||
/-- The name displayed to the user -/
|
/-- The name displayed to the user -/
|
||||||
userName: String
|
userName: String
|
||||||
/-- Does the name contain a dagger -/
|
/-- Does the name contain a dagger -/
|
||||||
isInaccessible?: Option Bool := .some false
|
isInaccessible: Bool := false
|
||||||
type?: Option Expression := .none
|
type?: Option Expression := .none
|
||||||
value?: Option Expression := .none
|
value?: Option Expression := .none
|
||||||
deriving Lean.ToJson
|
deriving Lean.ToJson
|
||||||
|
|
|
@ -215,13 +215,13 @@ def serializeGoal (options: @&Protocol.Options) (goal: MVarId) (mvarDecl: Metava
|
||||||
return {
|
return {
|
||||||
name := ofName fvarId.name,
|
name := ofName fvarId.name,
|
||||||
userName:= ofName userName.simpMacroScopes,
|
userName:= ofName userName.simpMacroScopes,
|
||||||
isInaccessible? := .some userName.isInaccessibleUserName
|
isInaccessible := userName.isInaccessibleUserName
|
||||||
}
|
}
|
||||||
| .ldecl _ fvarId userName _ _ _ _ => do
|
| .ldecl _ fvarId userName _ _ _ _ => do
|
||||||
return {
|
return {
|
||||||
name := ofName fvarId.name,
|
name := ofName fvarId.name,
|
||||||
userName := toString userName.simpMacroScopes,
|
userName := toString userName.simpMacroScopes,
|
||||||
isInaccessible? := .some userName.isInaccessibleUserName
|
isInaccessible := userName.isInaccessibleUserName
|
||||||
}
|
}
|
||||||
let ppVar (localDecl : LocalDecl) : MetaM Protocol.Variable := do
|
let ppVar (localDecl : LocalDecl) : MetaM Protocol.Variable := do
|
||||||
match localDecl with
|
match localDecl with
|
||||||
|
@ -231,7 +231,7 @@ def serializeGoal (options: @&Protocol.Options) (goal: MVarId) (mvarDecl: Metava
|
||||||
return {
|
return {
|
||||||
name := ofName fvarId.name,
|
name := ofName fvarId.name,
|
||||||
userName:= ofName userName,
|
userName:= ofName userName,
|
||||||
isInaccessible? := .some userName.isInaccessibleUserName
|
isInaccessible := userName.isInaccessibleUserName
|
||||||
type? := .some (← serializeExpression options type)
|
type? := .some (← serializeExpression options type)
|
||||||
}
|
}
|
||||||
| .ldecl _ fvarId userName type val _ _ => do
|
| .ldecl _ fvarId userName type val _ _ => do
|
||||||
|
@ -245,7 +245,7 @@ def serializeGoal (options: @&Protocol.Options) (goal: MVarId) (mvarDecl: Metava
|
||||||
return {
|
return {
|
||||||
name := ofName fvarId.name,
|
name := ofName fvarId.name,
|
||||||
userName:= ofName userName,
|
userName:= ofName userName,
|
||||||
isInaccessible? := .some userName.isInaccessibleUserName
|
isInaccessible := userName.isInaccessibleUserName
|
||||||
type? := .some (← serializeExpression options type)
|
type? := .some (← serializeExpression options type)
|
||||||
value? := value?
|
value? := value?
|
||||||
}
|
}
|
||||||
|
|
|
@ -138,7 +138,6 @@ def buildGoal (nameType: List (String × String)) (target: String) (userName?: O
|
||||||
vars := (nameType.map fun x => ({
|
vars := (nameType.map fun x => ({
|
||||||
userName := x.fst,
|
userName := x.fst,
|
||||||
type? := .some { pp? := .some x.snd },
|
type? := .some { pp? := .some x.snd },
|
||||||
isInaccessible? := .some false
|
|
||||||
})).toArray
|
})).toArray
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -85,14 +85,14 @@ def test_tactic : IO LSpec.TestSeq :=
|
||||||
let goal1: Protocol.Goal := {
|
let goal1: Protocol.Goal := {
|
||||||
name := "_uniq.11",
|
name := "_uniq.11",
|
||||||
target := { pp? := .some "∀ (q : Prop), x ∨ q → q ∨ x" },
|
target := { pp? := .some "∀ (q : Prop), x ∨ q → q ∨ x" },
|
||||||
vars := #[{ name := "_uniq.10", userName := "x", isInaccessible? := .some false, type? := .some { pp? := .some "Prop" }}],
|
vars := #[{ name := "_uniq.10", userName := "x", type? := .some { pp? := .some "Prop" }}],
|
||||||
}
|
}
|
||||||
let goal2: Protocol.Goal := {
|
let goal2: Protocol.Goal := {
|
||||||
name := "_uniq.17",
|
name := "_uniq.17",
|
||||||
target := { pp? := .some "x ∨ y → y ∨ x" },
|
target := { pp? := .some "x ∨ y → y ∨ x" },
|
||||||
vars := #[
|
vars := #[
|
||||||
{ name := "_uniq.10", userName := "x", isInaccessible? := .some false, type? := .some { pp? := .some "Prop" }},
|
{ name := "_uniq.10", userName := "x", type? := .some { pp? := .some "Prop" }},
|
||||||
{ name := "_uniq.16", userName := "y", isInaccessible? := .some false, type? := .some { pp? := .some "Prop" }}
|
{ name := "_uniq.16", userName := "y", type? := .some { pp? := .some "Prop" }}
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
subroutine_runner [
|
subroutine_runner [
|
||||||
|
|
|
@ -60,7 +60,6 @@ def buildGoal (nameType: List (String × String)) (target: String) (userName?: O
|
||||||
vars := (nameType.map fun x => ({
|
vars := (nameType.map fun x => ({
|
||||||
userName := x.fst,
|
userName := x.fst,
|
||||||
type? := .some { pp? := .some x.snd },
|
type? := .some { pp? := .some x.snd },
|
||||||
isInaccessible? := .some false
|
|
||||||
})).toArray
|
})).toArray
|
||||||
}
|
}
|
||||||
def proofRunner (env: Lean.Environment) (tests: TestM Unit): IO LSpec.TestSeq := do
|
def proofRunner (env: Lean.Environment) (tests: TestM Unit): IO LSpec.TestSeq := do
|
||||||
|
|
|
@ -58,7 +58,6 @@ def buildNamedGoal (name: String) (nameType: List (String × String)) (target: S
|
||||||
vars := (nameType.map fun x => ({
|
vars := (nameType.map fun x => ({
|
||||||
userName := x.fst,
|
userName := x.fst,
|
||||||
type? := .some { pp? := .some x.snd },
|
type? := .some { pp? := .some x.snd },
|
||||||
isInaccessible? := .some false
|
|
||||||
})).toArray
|
})).toArray
|
||||||
}
|
}
|
||||||
def buildGoal (nameType: List (String × String)) (target: String) (userName?: Option String := .none):
|
def buildGoal (nameType: List (String × String)) (target: String) (userName?: Option String := .none):
|
||||||
|
@ -69,7 +68,6 @@ def buildGoal (nameType: List (String × String)) (target: String) (userName?: O
|
||||||
vars := (nameType.map fun x => ({
|
vars := (nameType.map fun x => ({
|
||||||
userName := x.fst,
|
userName := x.fst,
|
||||||
type? := .some { pp? := .some x.snd },
|
type? := .some { pp? := .some x.snd },
|
||||||
isInaccessible? := .some false
|
|
||||||
})).toArray
|
})).toArray
|
||||||
}
|
}
|
||||||
def proofRunner (env: Lean.Environment) (tests: TestM Unit): IO LSpec.TestSeq := do
|
def proofRunner (env: Lean.Environment) (tests: TestM Unit): IO LSpec.TestSeq := do
|
||||||
|
@ -175,7 +173,6 @@ def test_delta_variable: TestM Unit := do
|
||||||
vars := (nameType.map fun x => ({
|
vars := (nameType.map fun x => ({
|
||||||
userName := x.fst,
|
userName := x.fst,
|
||||||
type? := x.snd.map (λ type => { pp? := type }),
|
type? := x.snd.map (λ type => { pp? := type }),
|
||||||
isInaccessible? := .some false,
|
|
||||||
})).toArray
|
})).toArray
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -256,9 +253,9 @@ def test_or_comm: TestM Unit := do
|
||||||
name := state1g0,
|
name := state1g0,
|
||||||
target := { pp? := .some "q ∨ p" },
|
target := { pp? := .some "q ∨ p" },
|
||||||
vars := #[
|
vars := #[
|
||||||
{ name := fvP, userName := "p", type? := .some { pp? := .some "Prop" }, isInaccessible? := .some false },
|
{ name := fvP, userName := "p", type? := .some { pp? := .some "Prop" } },
|
||||||
{ name := fvQ, userName := "q", type? := .some { pp? := .some "Prop" }, isInaccessible? := .some false },
|
{ name := fvQ, userName := "q", type? := .some { pp? := .some "Prop" } },
|
||||||
{ name := fvH, userName := "h", type? := .some { pp? := .some "p ∨ q" }, isInaccessible? := .some false }
|
{ name := fvH, userName := "h", type? := .some { pp? := .some "p ∨ q" } }
|
||||||
]
|
]
|
||||||
}])
|
}])
|
||||||
addTest $ LSpec.check "(1 parent)" state1.parentExpr?.isSome
|
addTest $ LSpec.check "(1 parent)" state1.parentExpr?.isSome
|
||||||
|
@ -351,9 +348,9 @@ def test_or_comm: TestM Unit := do
|
||||||
userName? := .some caseName,
|
userName? := .some caseName,
|
||||||
target := { pp? := .some "q ∨ p" },
|
target := { pp? := .some "q ∨ p" },
|
||||||
vars := #[
|
vars := #[
|
||||||
{ userName := "p", type? := .some typeProp, isInaccessible? := .some false },
|
{ userName := "p", type? := .some typeProp },
|
||||||
{ userName := "q", type? := .some typeProp, isInaccessible? := .some false },
|
{ userName := "q", type? := .some typeProp },
|
||||||
{ userName := "h✝", type? := .some { pp? := .some varName }, isInaccessible? := .some true }
|
{ userName := "h✝", type? := .some { pp? := .some varName }, isInaccessible := true }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -703,7 +700,6 @@ def test_nat_zero_add_alt: TestM Unit := do
|
||||||
name := fvN,
|
name := fvN,
|
||||||
userName := "n",
|
userName := "n",
|
||||||
type? := .some { pp? := .some "Nat", sexp? := .some "(:c Nat)" },
|
type? := .some { pp? := .some "Nat", sexp? := .some "(:c Nat)" },
|
||||||
isInaccessible? := .some false
|
|
||||||
}],
|
}],
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|
|
@ -82,13 +82,13 @@ def test_proof_eval : TestT Elab.TermElabM Unit := do
|
||||||
#[{
|
#[{
|
||||||
target := { pp? := .some "(p ∨ q) ∨ p ∨ q"},
|
target := { pp? := .some "(p ∨ q) ∨ p ∨ q"},
|
||||||
vars := #[
|
vars := #[
|
||||||
{ userName := "p", type? := .some { pp? := .some "Prop" }, isInaccessible? := .some false },
|
{ userName := "p", type? := .some { pp? := .some "Prop" } },
|
||||||
{ userName := "q", type? := .some { pp? := .some "Prop" }, isInaccessible? := .some false },
|
{ userName := "q", type? := .some { pp? := .some "Prop" } },
|
||||||
{ userName := "h", type? := .some { pp? := .some "p" }, isInaccessible? := .some false },
|
{ userName := "h", type? := .some { pp? := .some "p" } },
|
||||||
{ userName := "y",
|
{ userName := "y",
|
||||||
type? := .some { pp? := .some "p ∨ ?m.25" },
|
type? := .some { pp? := .some "p ∨ ?m.25" },
|
||||||
value? := .some { pp? := .some "Or.inl h" },
|
value? := .some { pp? := .some "Or.inl h" },
|
||||||
isInaccessible? := .some false }
|
}
|
||||||
]
|
]
|
||||||
}])
|
}])
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue