Zulip Chat Archive

Stream: maths

Topic: Class instance problem


Roman Fedorov (Jul 13 2020 at 17:51):

Can anybody tell me why this code does not work (it says it fails to synthesize instance of add_monoid M):
example : Prop := ∀ (M : Type 0) [add_monoid M] (f : M →+ MM), true. Thanks!

Johan Commelin (Jul 13 2020 at 17:52):

Tip: use #backticks to format code on Zulip

Kevin Buzzard (Jul 13 2020 at 17:53):

It's because add_monoid is after the colon.

Jalex Stark (Jul 13 2020 at 17:54):

example (M : Type 0) [add_monoid M] (f : M →+ M) : Prop := true

gives no errors for me

Reid Barton (Jul 13 2020 at 17:56):

You can write it like this:
example : Prop := ∀ (M : Type 0) [add_monoid M], by exactI ∀ (f : M →+ M), true

Reid Barton (Jul 13 2020 at 17:58):

More obscurely, this version also works for some reason:

structure ex : Prop :=
(h :  (M : Type 0) [add_monoid M] (f : M →+ M), true)

Reid Barton (Jul 13 2020 at 18:00):

The reason the original doesn't work is there is something called the "instance cache" where Lean looks for instances (like add_monoid M), and variables introduced by ∀ and other binders don't get added to the cache automatically, only variables that appear in the arguments before the : like in Jalex's example.

Reid Barton (Jul 13 2020 at 18:02):

exactI is a tactic that's like exact but first causes everything in scope to get added to the instance cache.
(There are some other related tactics.)

Roman Fedorov (Jul 13 2020 at 18:18):

Thanks for the answers! But is there a better way to quantify over a module (or more generally, over something inferred by class resolution)?

Kenny Lau (Jul 13 2020 at 18:18):

what's wrong with ∀ (M : Type 0) [add_monoid M], by exactI ∀ (f : M →+ M), true as suggested by Reid?

Reid Barton (Jul 13 2020 at 18:41):

Well it's a bit inconvenient of course. I wonder whether the behavior will change in Lean 4.


Last updated: Dec 20 2023 at 11:08 UTC