Zulip Chat Archive
Stream: new members
Topic: Universe confusion
Jack J Garzella (Jul 19 2022 at 18:58):
Hello, I'm a relatively inexperienced Lean user, and I'm a bit confused about how one is supposed to handle universes when dealing with rings and modules. For example, I'm trying to assume the following statement: Let is an -module and be a prime ideal, then is a free -module. Here's the #mwe:
import algebra.module.localized_module
import ring_theory.localization.at_prime
import linear_algebra.free_module.basic
universes u v
variables (R : Type u) [comm_ring R]
variables (M : Type v) [add_comm_group M] [module R M]
variables (P : ideal R) [hp : P.is_prime]
#check localized_module P.prime_compl
variable (hm : @module.free
(localization.at_prime P) (localized_module P.prime_compl))
And here's the error Lean gives me:
type mismatch at application
module.free (localization.at_prime P) (localized_module P.prime_compl)
term
localized_module P.prime_compl
has type
Π (M : Type ?) [_inst_2 : add_comm_monoid M] [_inst_3 : module R M], Type (max u ?) : Type (max
(?+1)
?
((max u ?)+1))
but is expected to have type
Type ? : Type (?+1)
It seems like my universe v has been replaced by a question mark in the error, but as far as I can tell it's mad that localized_module has a universe which is the max of u and v (possibly adding one), rather than being in universe v.
Does anyone know what's going on here? What is the best practice for dealing with such issues?
Reid Barton (Jul 19 2022 at 19:11):
Well first, M should appear somewhere in hm
Reid Barton (Jul 19 2022 at 19:12):
You can read the error message as: localized_module P.prime_compl was supposed to be a type, but actually it's a function that still needs another type (clearly M) and some type classes and stuff, and then after providing that see whether things get better
Jack J Garzella (Jul 19 2022 at 19:34):
Ahh, whoops. That fixed it, thanks.
Jack J Garzella (Jul 19 2022 at 19:37):
Based on the documentation in localized_module.lean, I was expecting to put localized_module M P.prime_compl instead of localized_module P.prime_compl M. The same swap occurs in the localization.lean file for rings. Is there a reason these are flipped? If not, I can possibly make a quick docs PR?
Jack J Garzella (Jul 19 2022 at 19:37):
btw I'm looking at https://github.com/leanprover-community/mathlib/blob/master/src/algebra/module/localized_module.lean, line 20
Reid Barton (Jul 19 2022 at 19:51):
It looks like the comments are out of date (there are further occurrences with the arguments swapped in later comments in the file).
Junyan Xu (Jul 19 2022 at 20:56):
You can prove the same thing for any submonoid, not just prime_compl, right? The result will be strictly more general.
Jack J Garzella (Jul 20 2022 at 02:33):
You mean to say that free over implies is free over for any submonoid ? If so, yes, and it follows quickly from the fact that localization is a tensor product/base change. However, this isn't what I'm trying to prove--I'm going for (the algebraic version of) Hartshorne II.5.7, in which you don't know that is free over .
Junyan Xu (Jul 20 2022 at 02:43):
Oh sorry, I misread your original question: you are assuming that M_p is free over R_p for all p, which is a weaker assumption than assuming it for all submonoids. Indeed, I erroneously thought you want to show that if M is free over R then M_p is free over R_p. However,
it follows quickly from the fact that localization is a tensor product/base change.
I think we don't have this yet in mathlib, but maybe it's in some open PR ...
Last updated: May 02 2025 at 03:31 UTC