Skip to content

Commit bc62baa

Browse files
committed
refactor: generate equational theorems uniformly
This PR follows upon #10606 and creates equational theorems uniformly from the unfold theorem, removing the `registerGetEqnsFn` hook.
1 parent c32a57e commit bc62baa

File tree

6 files changed

+5
-29
lines changed

6 files changed

+5
-29
lines changed

src/Lean/Elab/PreDefinition/Eqns.lean

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -403,9 +403,6 @@ Generate equations for `declName`.
403403
This unfolds the function application on the LHS (using an unfold theorem, if present, or else by
404404
delta-reduction), calculates the types for the equational theorems using `mkEqnTypes`, and then
405405
proves them using `mkEqnProof`.
406-
407-
This is currently used for non-recursive functions, well-founded recursion and partial_fixpoint,
408-
but not for structural recursion.
409406
-/
410407
public def mkEqns (declName : Name) (declNames : Array Name) (tryRefl := true): MetaM (Array Name) := do
411408
trace[Elab.definition.eqns] "mkEqns: {.ofConstName declName}"

src/Lean/Elab/PreDefinition/Nonrec/Eqns.lean

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ where
4242

4343
def getEqnsFor? (declName : Name) : MetaM (Option (Array Name)) := do
4444
if (← isRecursiveDefinition declName) then
45-
return none
45+
let some (.defnInfo info) := (← getEnv).find? declName |
46+
throwError "internal error: recursive definition `{declName}` is not a definition"
47+
let n ← mkEqns declName info.all.toArray
48+
return some n
4649
if (← getEnv).contains declName then
4750
if backward.eqns.nonrecursive.get (← getOptions) then
4851
mkEqns declName #[]

src/Lean/Elab/PreDefinition/PartialFixpoint/Eqns.lean

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -118,14 +118,7 @@ def getUnfoldFor? (declName : Name) : MetaM (Option Name) := do
118118
let some info := eqnInfoExt.find? env declName | return none
119119
return some (← mkUnfoldEq declName info)
120120

121-
def getEqnsFor? (declName : Name) : MetaM (Option (Array Name)) := do
122-
if let some info := eqnInfoExt.find? (← getEnv) declName then
123-
mkEqns declName info.declNames (tryRefl := false)
124-
else
125-
return none
126-
127121
builtin_initialize
128-
registerGetEqnsFn getEqnsFor?
129122
registerGetUnfoldEqnFn getUnfoldFor?
130123

131124
end Lean.Elab.PartialFixpoint

src/Lean/Elab/PreDefinition/Structural/Eqns.lean

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -151,12 +151,6 @@ public def registerEqnsInfo (preDef : PreDefinition) (declNames : Array Name) (r
151151
modifyEnv fun env => eqnInfoExt.insert env preDef.declName
152152
{ preDef with recArgPos, declNames, fixedParamPerms }
153153

154-
def getEqnsFor? (declName : Name) : MetaM (Option (Array Name)) := do
155-
if let some info := eqnInfoExt.find? (← getEnv) declName then
156-
mkEqns declName info.declNames
157-
else
158-
return none
159-
160154
/-- Generate the "unfold" lemma for `declName`. -/
161155
def mkUnfoldEq (declName : Name) (info : EqnInfo) : MetaM Name := do
162156
let name := mkEqLikeNameFor (← getEnv) info.declName unfoldThmSuffix
@@ -190,7 +184,6 @@ def getStructuralRecArgPosImp? (declName : Name) : CoreM (Option Nat) := do
190184

191185

192186
builtin_initialize
193-
registerGetEqnsFn getEqnsFor?
194187
registerGetUnfoldEqnFn getUnfoldFor?
195188
registerTraceClass `Elab.definition.structural.eqns
196189

src/Lean/Elab/PreDefinition/WF/Eqns.lean

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,6 @@ public def registerEqnsInfo (preDefs : Array PreDefinition) (declNameNonRec : Na
4646
eqnInfoExt.insert env preDef.declName { preDef with
4747
declNames, declNameNonRec, argsPacker, fixedParamPerms }
4848

49-
def getEqnsFor? (declName : Name) : MetaM (Option (Array Name)) := do
50-
if let some info := eqnInfoExt.find? (← getEnv) declName then
51-
mkEqns declName info.declNames (tryRefl := false)
52-
else
53-
return none
54-
55-
builtin_initialize
56-
registerGetEqnsFn getEqnsFor?
57-
58-
5949
/--
6050
This is a hack to fix fallout from #8519, where a non-exposed wfrec definition `foo`
6151
in a module would cause `foo.eq_def` to be defined eagerly and privately,

tests/lean/run/partial_fixpoint.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ partial_fixpoint
1313

1414
/--
1515
info: equations:
16-
theorem loop.eq_1 : ∀ (x : Nat), loop x = loop (x + 1)
16+
@[defeq] theorem loop.eq_1 : ∀ (x : Nat), loop x = loop (x + 1)
1717
-/
1818
#guard_msgs in
1919
#print equations loop

0 commit comments

Comments
 (0)