leanprover/lean4

Timeout on large pattern matches against Nat

Opened this issue · 0 comments

Prerequisites

  • Put an X between the brackets on this line if you have done all of the following:
    • Check that your issue is not already filed.
    • Reduce the issue to a minimal, self-contained, reproducible test case. Avoid dependencies to mathlib4 or std4.

Description

A pattern match with 300 or more cases against Nat seems to cause (deterministic) timeout at 'whnf', maximum number of heartbeats (200000) has been reached (use 'set_option maxHeartbeats <num>' to set the limit)

Context

Discussion here: https://leanprover.zulipchat.com/#narrow/stream/270676-lean4/topic/Timeout.20on.20large.20pattern.20match

Steps to Reproduce

For example:

def mwe : Nat → Nat
  | 0 => 0
  | 1 => 1
  | 2 => 2
  | 3 => 3
  | 4 => 4
  | 5 => 5
  | 6 => 6
  | 7 => 7
  | 8 => 8
  | 9 => 9
  | 10 => 10
  | 11 => 11
  | 12 => 12
  | 13 => 13
  | 14 => 14
  | 15 => 15
  | 16 => 16
  | 17 => 17
  | 18 => 18
  | 19 => 19
  | 20 => 20
  | 21 => 21
  | 22 => 22
  | 23 => 23
  | 24 => 24
  | 25 => 25
  | 26 => 26
  | 27 => 27
  | 28 => 28
  | 29 => 29
  | 30 => 30
  | 31 => 31
  | 32 => 32
  | 33 => 33
  | 34 => 34
  | 35 => 35
  | 36 => 36
  | 37 => 37
  | 38 => 38
  | 39 => 39
  | 40 => 40
  | 41 => 41
  | 42 => 42
  | 43 => 43
  | 44 => 44
  | 45 => 45
  | 46 => 46
  | 47 => 47
  | 48 => 48
  | 49 => 49
  | 50 => 50
  | 51 => 51
  | 52 => 52
  | 53 => 53
  | 54 => 54
  | 55 => 55
  | 56 => 56
  | 57 => 57
  | 58 => 58
  | 59 => 59
  | 60 => 60
  | 61 => 61
  | 62 => 62
  | 63 => 63
  | 64 => 64
  | 65 => 65
  | 66 => 66
  | 67 => 67
  | 68 => 68
  | 69 => 69
  | 70 => 70
  | 71 => 71
  | 72 => 72
  | 73 => 73
  | 74 => 74
  | 75 => 75
  | 76 => 76
  | 77 => 77
  | 78 => 78
  | 79 => 79
  | 80 => 80
  | 81 => 81
  | 82 => 82
  | 83 => 83
  | 84 => 84
  | 85 => 85
  | 86 => 86
  | 87 => 87
  | 88 => 88
  | 89 => 89
  | 90 => 90
  | 91 => 91
  | 92 => 92
  | 93 => 93
  | 94 => 94
  | 95 => 95
  | 96 => 96
  | 97 => 97
  | 98 => 98
  | 99 => 99
  | 100 => 100
  | 101 => 101
  | 102 => 102
  | 103 => 103
  | 104 => 104
  | 105 => 105
  | 106 => 106
  | 107 => 107
  | 108 => 108
  | 109 => 109
  | 110 => 110
  | 111 => 111
  | 112 => 112
  | 113 => 113
  | 114 => 114
  | 115 => 115
  | 116 => 116
  | 117 => 117
  | 118 => 118
  | 119 => 119
  | 120 => 120
  | 121 => 121
  | 122 => 122
  | 123 => 123
  | 124 => 124
  | 125 => 125
  | 126 => 126
  | 127 => 127
  | 128 => 128
  | 129 => 129
  | 130 => 130
  | 131 => 131
  | 132 => 132
  | 133 => 133
  | 134 => 134
  | 135 => 135
  | 136 => 136
  | 137 => 137
  | 138 => 138
  | 139 => 139
  | 140 => 140
  | 141 => 141
  | 142 => 142
  | 143 => 143
  | 144 => 144
  | 145 => 145
  | 146 => 146
  | 147 => 147
  | 148 => 148
  | 149 => 149
  | 150 => 150
  | 151 => 151
  | 152 => 152
  | 153 => 153
  | 154 => 154
  | 155 => 155
  | 156 => 156
  | 157 => 157
  | 158 => 158
  | 159 => 159
  | 160 => 160
  | 161 => 161
  | 162 => 162
  | 163 => 163
  | 164 => 164
  | 165 => 165
  | 166 => 166
  | 167 => 167
  | 168 => 168
  | 169 => 169
  | 170 => 170
  | 171 => 171
  | 172 => 172
  | 173 => 173
  | 174 => 174
  | 175 => 175
  | 176 => 176
  | 177 => 177
  | 178 => 178
  | 179 => 179
  | 180 => 180
  | 181 => 181
  | 182 => 182
  | 183 => 183
  | 184 => 184
  | 185 => 185
  | 186 => 186
  | 187 => 187
  | 188 => 188
  | 189 => 189
  | 190 => 190
  | 191 => 191
  | 192 => 192
  | 193 => 193
  | 194 => 194
  | 195 => 195
  | 196 => 196
  | 197 => 197
  | 198 => 198
  | 199 => 199
  | 200 => 200
  | 201 => 201
  | 202 => 202
  | 203 => 203
  | 204 => 204
  | 205 => 205
  | 206 => 206
  | 207 => 207
  | 208 => 208
  | 209 => 209
  | 210 => 210
  | 211 => 211
  | 212 => 212
  | 213 => 213
  | 214 => 214
  | 215 => 215
  | 216 => 216
  | 217 => 217
  | 218 => 218
  | 219 => 219
  | 220 => 220
  | 221 => 221
  | 222 => 222
  | 223 => 223
  | 224 => 224
  | 225 => 225
  | 226 => 226
  | 227 => 227
  | 228 => 228
  | 229 => 229
  | 230 => 230
  | 231 => 231
  | 232 => 232
  | 233 => 233
  | 234 => 234
  | 235 => 235
  | 236 => 236
  | 237 => 237
  | 238 => 238
  | 239 => 239
  | 240 => 240
  | 241 => 241
  | 242 => 242
  | 243 => 243
  | 244 => 244
  | 245 => 245
  | 246 => 246
  | 247 => 247
  | 248 => 248
  | 249 => 249
  | 250 => 250
  | 251 => 251
  | 252 => 252
  | 253 => 253
  | 254 => 254
  | 255 => 255
  | 256 => 256
  | 257 => 257
  | 258 => 258
  | 259 => 259
  | 260 => 260
  | 261 => 261
  | 262 => 262
  | 263 => 263
  | 264 => 264
  | 265 => 265
  | 266 => 266
  | 267 => 267
  | 268 => 268
  | 269 => 269
  | 270 => 270
  | 271 => 271
  | 272 => 272
  | 273 => 273
  | 274 => 274
  | 275 => 275
  | 276 => 276
  | 277 => 277
  | 278 => 278
  | 279 => 279
  | 280 => 280
  | 281 => 281
  | 282 => 282
  | 283 => 283
  | 284 => 284
  | 285 => 285
  | 286 => 286
  | 287 => 287
  | 288 => 288
  | 289 => 289
  | 290 => 290
  | 291 => 291
  | 292 => 292
  | 293 => 293
  | 294 => 294
  | 295 => 295
  | 296 => 296
  | 297 => 297
  | 298 => 298
  | 299 => 299
  | 300 => 300
  | 301 => 301
  | 302 => 302
  | 303 => 303
  | 304 => 304
  | 305 => 305
  | _ => 0

Expected behavior: It would be nice for the language server to handle this pattern match (and similar ones) without a timeout

Actual behavior: A timeout (which can be overcome by increasing maxHeartbeats)

Versions

4.8.0-nightly-2024-08
Ubuntu 22.04.1

Impact

Add 👍 to issues you consider important. If others are impacted by this issue, please ask them to add 👍 to it.