@@ -18,6 +18,22 @@ structure CasesEntry where
18
18
eager : Bool
19
19
deriving Inhabited
20
20
21
+ /--
22
+ `grind` always case-splits on the following types. Even when using `grind only`.
23
+ The goal is to reduce noise in the tactic generated by `grind?`
24
+ -/
25
+ private def builtinEagerCases : NameSet :=
26
+ RBTree.ofList [``And, ``Exists, ``True, ``False, ``Unit, ``Empty]
27
+
28
+ /--
29
+ Returns `true` if `declName` is the name of inductive type/predicate that
30
+ even `grind only` case splits on.
31
+ Remark: we added support for them to reduce the noise in the tactic generated by
32
+ `grind?`
33
+ -/
34
+ def isBuiltinEagerCases (declName : Name) : Bool :=
35
+ builtinEagerCases.contains declName
36
+
21
37
/-- Returns `true` if `s` contains a `declName`. -/
22
38
def CasesTypes.contains (s : CasesTypes) (declName : Name) : Bool :=
23
39
s.casesMap.contains declName
@@ -33,10 +49,10 @@ def CasesTypes.find? (s : CasesTypes) (declName : Name) : Option Bool :=
33
49
s.casesMap.find? declName
34
50
35
51
def CasesTypes.isEagerSplit (s : CasesTypes) (declName : Name) : Bool :=
36
- s.casesMap.find? declName |>.getD false
52
+ ( s.casesMap.find? declName |>.getD false ) || isBuiltinEagerCases declName
37
53
38
54
def CasesTypes.isSplit (s : CasesTypes) (declName : Name) : Bool :=
39
- s.casesMap.find? declName |>.isSome
55
+ ( s.casesMap.find? declName |>.isSome) || isBuiltinEagerCases declName
40
56
41
57
builtin_initialize casesExt : SimpleScopedEnvExtension CasesEntry CasesTypes ←
42
58
registerSimpleScopedEnvExtension {
@@ -80,7 +96,12 @@ def CasesTypes.eraseDecl (s : CasesTypes) (declName : Name) : CoreM CasesTypes :
80
96
else
81
97
throwError "`{declName}` is not marked with the `[grind]` attribute"
82
98
99
+ def ensureNotBuiltinCases (declName : Name) : CoreM Unit := do
100
+ if isBuiltinEagerCases declName then
101
+ throwError "`{declName}` is marked as a built-in case-split for `grind` and cannot be erased"
102
+
83
103
def eraseCasesAttr (declName : Name) : CoreM Unit := do
104
+ ensureNotBuiltinCases declName
84
105
let s := casesExt.getState (← getEnv)
85
106
let s ← s.eraseDecl declName
86
107
modifyEnv fun env => casesExt.modifyState env fun _ => s
0 commit comments