Zulip Chat Archive
Stream: lean4
Topic: explicit and implicit namespaces
Damiano Testa (Sep 16 2024 at 07:43):
In the code below, I was expecting Nat.zero2
to "just work". Is this a misunderstanding on my part?
-- Only if you comment at least one of the following two commands...
namespace X
def Nat.zero1 := Nat.zero
-- ... this works
open Nat in
def Nat.zero2 : Nat := zero
section
open Nat
def Nat.zero3 : Nat := zero -- for this to work, commenting `Nat.zero1` is inconsequential
end
Daniel Weber (Sep 16 2024 at 08:37):
namespace X
def Nat.zero1 : Nat := 0
open Nat
def Nat.zero2 : Nat := zero
end X
this is really weird
Kevin Buzzard (Sep 16 2024 at 09:27):
(What is weird is that you get an error on Nat.zero2 unless you comment out Nat.zero1)
Daniel Weber (Sep 16 2024 at 09:31):
opaque X.Nat.test : Nat
namespace X
open Nat
def Nat.zero2 : Nat := zero
end X
Jannis Limperg (Sep 16 2024 at 09:31):
This works:
namespace X
def Nat.zero1 : Nat := 0
open _root_.Nat
def Nat.zero2 : Nat := zero
end X
So the open Nat
seems to open the namespace X.Nat
(which only exists because of the def
of zero1
).
Edward van de Meent (Sep 16 2024 at 09:34):
i seem to recall it opens both namespaces... open Foo Bar Baz
opens Foo
,Bar
and Baz
namespaces, but also Foo.Bar
, Foo.Baz
, and even Foo.Bar.Baz
namespaces.
Kevin Buzzard (Sep 16 2024 at 09:35):
def _root_.Nat.zero2 : Nat := zero
does not work, which surprises me a little (I would have guessed that this would open Nat for the duration of the definition)
Damiano Testa (Sep 16 2024 at 15:45):
Jannis, your comment about the non-existing namespace clears up some mystery around this, thanks!
Last updated: May 02 2025 at 03:31 UTC