Zulip Chat Archive

Stream: lean4

Topic: Set `maxHeartbeats` for `Lean.Environment.unsafeRunMetaM`?


fiforeach (Feb 13 2026 at 13:32):

When building my project using lake build I receive the error message

PANIC at Lean.Environment.unsafeRunMetaM Lean.LibrarySuggestions.SymbolFrequency:75:24: (deterministic) timeout at `whnf`, maximum number of heartbeats (200000) has been reached

Note: Use `set_option maxHeartbeats <num>` to set the limit.(invalid MessageData.lazy, missing context)

I tried setting the option maxHeartbeats in the offending file and also as an option to lean using the -D flag (by setting moreLeanArgs in the lakefile.lean), but this does not seem to increase the heartbeats allowed for whnf, which is consistently being reported as 200000.

Is it possible to increase the number of heartbeats for this operation?

When I open the file in VSCode, the file gets compiled (after a long time) without any warnings/messages appearing. Is there something different going on there or are the messages simply being suppressed?

Jovan Gerbscheid (Feb 14 2026 at 08:17):

You can inspect the definition of unsafeRunMetaM:

unsafe def _root_.Lean.Environment.unsafeRunMetaM [Inhabited α] (env : Environment) (x : MetaM α) : α :=
   match unsafeEIO ((((withoutExporting x).run' {} {}).run' { fileName := "symbolFrequency", fileMap := default } { env })) with
   | Except.ok a => a
   | Except.error ex => panic! match unsafeIO ex.toMessageData.toString with
     | Except.ok s => s
     | Except.error ex => ex.toString

The Core.Context that is passed into the ocmputation is { fileName := "symbolFrequency", fileMap := default }, which sets the default values

  initHeartbeats : Nat := 0
  maxHeartbeats  : Nat := getMaxHeartbeats options

In particular initHeartbeats being set to 0 is a very very bad idea, because if the initial heartbeats are actually much higher, then you will reach the maxHeartbeats much sooner, or even immediately.

You can use withCurrHeartbeats in your MetaM function to set the initHeartbeats to the current number.

Jovan Gerbscheid (Feb 14 2026 at 08:17):

Though I also wonder why you are using unsafeRunMetaM

fiforeach (Feb 14 2026 at 08:33):

Jovan Gerbscheid said:

Though I also wonder why you are using unsafeRunMetaM

Thanks a lot for the input. Sorry, I should have been more explicit about my problem. I myself am not using any metaprogramming at all. The file I have is a large file with many (mutual) inductive definitions and nothing else.

Jovan Gerbscheid (Feb 14 2026 at 08:39):

Aha I see. Well we'll probably need a #mwe to help further.

fiforeach (Feb 14 2026 at 12:27):

I am not entirely sure about the "minimality" of this example, but on my machine this gives the observed behavior:

mutual

inductive A0 where
| mk : A0
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A0

inductive A1 where
| mk : A1
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A1

inductive A2 where
| mk : A2
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A2

inductive A3 where
| mk : A3
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A3

inductive A4 where
| mk : A4
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A4

inductive A5 where
| mk : A5
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A5

inductive A6 where
| mk : A6
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A6

inductive A7 where
| mk : A7
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A7

inductive A8 where
| mk : A8
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A8

inductive A9 where
| mk : A9
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A9

inductive A10 where
| mk : A10
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A10

inductive A11 where
| mk : A11
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A11

inductive A12 where
| mk : A12
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A12

inductive A13 where
| mk : A13
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A13

inductive A14 where
| mk : A14
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A14

inductive A15 where
| mk : A15
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A15

inductive A16 where
| mk : A16
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A16

inductive A17 where
| mk : A17
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A17

inductive A18 where
| mk : A18
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A18

inductive A19 where
| mk : A19
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A19

inductive A20 where
| mk : A20
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A20

inductive A21 where
| mk : A21
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A21

inductive A22 where
| mk : A22
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A22

inductive A23 where
| mk : A23
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A23

inductive A24 where
| mk : A24
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A24

inductive A25 where
| mk : A25
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A25

inductive A26 where
| mk : A26
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A26

inductive A27 where
| mk : A27
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A27

inductive A28 where
| mk : A28
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A28

inductive A29 where
| mk : A29
| combine : A0  A1  A2  A3  A4  A5  A6  A7  A8  A9  A10  A11  A12  A13  A14  A15  A16  A17  A18  A19  A20  A21  A22  A23  A24  A25  A26  A27  A28  A29  A29

end

Note the following:

  1. The above file compiles without increasing maxHeartbeats (but gives the aforementioned warning)
  2. Using set_option maxHeartbeats does not change the warning

Last updated: Feb 28 2026 at 14:05 UTC