Zulip Chat Archive
Stream: general
Topic: what is a numeral
Kevin Buzzard (Jan 15 2022 at 16:02):
My understanding is that 37
is a numeral. Is (37 : real)
a numeral? My understanding is that real.pi
is not a numeral. Is -37
a numeral? Is 1/37
a numeral? What is a numeral? I would not expect norm_num
to prove pi>3
but I would expect it to prove 1/37>0
. The documentation of norm_num
says it proves theorems about numerical expressions
. Is the idea that 1/37
is not a numeral but it's a "numerical expression"? Sorry for such weird questions, I'm writing notes for my course and I'd rather get things right the first time than have people complain that I'm not using terminology correctly.
Anne Baanen (Jan 15 2022 at 16:51):
By numeral, I mean a "numeric literal", so an expression denoting a fixed number that cannot be decomposed into subexpressions. So 37
, 3.7
, 0x25
and 0b00100101
are all numerals in Lean, -37
is not a numeral since it applies the -
operator to 37
.
I believe @Rob Lewis introduced me to this term, so he may have a more authoritative opinion.
Anne Baanen (Jan 15 2022 at 16:53):
Presumably "numerical expressions" in this context means expressions consisting only of numerals and operators known to norm_num
.
Rob Lewis (Jan 15 2022 at 16:57):
"Cannot be decomposed into subexpressions" is maybe a bit off, since 37
is built of applications of docs#bit0, docs#bit1, etc. In the Lean 3 context specifically, I'd say a numeral is either has_zero.zero
or a sequence of 0 or more applications of bit0
and bit1
to has_one.one
. The type class requirements on these defintions mean that this only make sense over a type with 0, 1, and +.
Anne Baanen (Jan 15 2022 at 16:58):
Then you wouldn't call 3.7
a numeral?
Rob Lewis (Jan 15 2022 at 16:58):
37
, 0x25
are numerals in this sense. 3.7
is not, but it is a "numerical expression": a sequence of applications of ring operations to numerals.
Rob Lewis (Jan 15 2022 at 17:00):
So
Is the idea that 1/37 is not a numeral but it's a "numerical expression"?
is right.
Anne Baanen (Jan 15 2022 at 17:00):
Right, I should make clear that by "subexpressions" I mean subexpressions in the source code. In the way that a + b
can be decomposed into a
, +
and b
, but not into has_add.add
nor nat.has_add
.
Rob Lewis (Jan 15 2022 at 17:03):
At least in the original C++ implementation of norm_num
there was a third distinction, "generalized numerals" or something like that, which would have included 1/37
and -37
. It's supposed to capture the notion of a fully reduced numeral expression.
Rob Lewis (Jan 15 2022 at 17:03):
Something like, "a numeral, or the negation of a numeral, or the division of two numerals, or the negation of the division of two numerals"
Rob Lewis (Jan 15 2022 at 17:04):
norm_num
applied to a numeral expression should produce a generalized numeral.
Kevin Buzzard (Jan 15 2022 at 17:34):
Thanks a lot for these comments!
Mario Carneiro (Jan 15 2022 at 18:48):
I believe I have used the term "rational numeral" or "integer numeral" to refer (in norm_num
docs) to what Rob calls "generalized numeral"
Mario Carneiro (Jan 15 2022 at 18:49):
so 1/3
is a rational numeral but 2/6
is not, and -13
is an integer numeral
Mario Carneiro (Jan 15 2022 at 18:50):
it is like "simp-normal form" but for norm_num
instead
Mario Carneiro (Jan 15 2022 at 18:50):
Usually, when I say numeral without qualification I mean natural numeral though, so 0
or 1
or 37
but not 2+2
or -5
Mario Carneiro (Jan 15 2022 at 18:53):
the term overlaps a lot with "numeric literal" which deals with the actual parser input, so for example 0x20
is a hexadecimal literal and 32
is a (decimal) numeric literal. I probably use the terms interchangeably most of the time
Last updated: Dec 20 2023 at 11:08 UTC