# Zulip Chat Archive

## Stream: general

### Topic: mul_le_mul

#### Johan Commelin (May 27 2020 at 11:04):

My refactor leads to a conflict: `mul_le_mul`

is now a lemma about `ordered_cancel_comm_monoid`

, but it was already a lemma for `ordered_semiring`

s:

```
-- TODO: there are four variations, depending on which variables we assume to be nonneg
lemma mul_le_mul (hac : a ≤ c) (hbd : b ≤ d) (nn_b : 0 ≤ b) (nn_c : 0 ≤ c) : a * b ≤ c * d :=
calc
a * b ≤ c * b : mul_le_mul_of_nonneg_right hac nn_b
... ≤ c * d : mul_le_mul_of_nonneg_left hbd nn_c
```

What is the preferred way to resolve this conflict?

#### Mario Carneiro (May 27 2020 at 11:05):

I should have asked this before: why are you doing this refactor?

#### Mario Carneiro (May 27 2020 at 11:05):

I hope it's not only for uniformity's sake

#### Mario Carneiro (May 27 2020 at 11:06):

do we actually have any examples of multiplicative `ordered_comm_monoid`

s?

#### Mario Carneiro (May 27 2020 at 11:06):

the fact that the new `mul_le_mul_left`

has no nonnegativity assumptions on the multiplicand looks very weird to me

#### Reid Barton (May 27 2020 at 11:07):

`nat`

?

#### Kevin Buzzard (May 27 2020 at 11:07):

The perfectoid project sets up a very general theory of valuations into ordered comm monoids, and work like Rob's on p-adic numbers has a valuation into the non-negative reals, and maybe things can be unified somehow

#### Mario Carneiro (May 27 2020 at 11:07):

Sure, but that's a `canonically_ordered_monoid`

which gives it more structure

#### Mario Carneiro (May 27 2020 at 11:08):

in particular `zero_le`

#### Kevin Buzzard (May 27 2020 at 11:08):

The multiplication isn't canonically ordered

#### Mario Carneiro (May 27 2020 at 11:08):

no but it's a semiring, it's got both

#### Mario Carneiro (May 27 2020 at 11:09):

same for enat, nnreal and ennreal

#### Mario Carneiro (May 27 2020 at 11:09):

so I'm not sure where this class will be used

#### Mario Carneiro (May 27 2020 at 11:09):

and I would certainly hate to displace an actually useful lemma for one with no known applications

#### Johan Commelin (May 27 2020 at 11:12):

Mario Carneiro said:

so I'm not sure where this class will be used

The valuations take values in an arbitrary such monoid. Not all of them are ordered semirings

#### Johan Commelin (May 27 2020 at 11:13):

You could argue that we should use additive valuations instead... but...

#### Mario Carneiro (May 27 2020 at 11:13):

I really should

#### Mario Carneiro (May 27 2020 at 11:13):

but I think that ship sailed before I even started leaning

#### Johan Commelin (May 27 2020 at 11:14):

Also... it means that valuations can't take values in `nnreal`

#### Mario Carneiro (May 27 2020 at 11:15):

Johan Commelin said:

The valuations take values in an arbitrary such monoid. Not all of them are ordered semirings

Fair enough. But I'm guessing that you don't need to do that much as far as algebraic manipulations in these types though, so perhaps you can make do with namespacing everything

#### Mario Carneiro (May 27 2020 at 11:17):

I think you might have use for something a bit more than an ordered_comm_monoid for your valuations though

#### Mario Carneiro (May 27 2020 at 11:18):

Don't you want to add a zero to the type?

#### Mario Carneiro (May 27 2020 at 11:19):

and then you will have `zero_le`

which isn't true in an ordered_comm_monoid

#### Kevin Buzzard (May 27 2020 at 11:19):

We work with group_with_zero s I guess

#### Mario Carneiro (May 27 2020 at 11:20):

Is there an `ordered_group_with_zero`

?

#### Johan Commelin (May 27 2020 at 11:20):

@Mario Carneiro In the end it will be `linearly_ordered_comm_group_with_zero`

#### Johan Commelin (May 27 2020 at 11:20):

And we have files with lots of basic lemmas about these guys in the perfectoid project

#### Johan Commelin (May 27 2020 at 11:21):

But they depend on `actual_ordered_comm_monoid`

s

#### Johan Commelin (May 27 2020 at 11:21):

I'm trying to get rid of the `actual_`

#### Mario Carneiro (May 27 2020 at 11:21):

I think you should start with the minimum number of classes necessary to say what you need

#### Mario Carneiro (May 27 2020 at 11:22):

what are `actual_ordered_comm_monoid`

s used for?

#### Johan Commelin (May 27 2020 at 11:22):

They are only there currently to prove a bunch of lemmas that are true more generally than just for `linearly_ordered_comm_group_with_zero`

s

#### Mario Carneiro (May 27 2020 at 11:23):

yeah, that qualifies as a non-use from my point of view

#### Mario Carneiro (May 27 2020 at 11:24):

you can just put those theorems in a section and say "Note: these hold more generally, make sure to migrate these if/when we need the generality"

#### Mario Carneiro (May 27 2020 at 11:25):

but there is a reason you won't find theorems like `mul_inv_cancel`

stated over quasigroups

#### Johan Commelin (May 27 2020 at 11:27):

Hmmmzz... I thought we tried to do things in "the right generality" because you never know if someone will show up with a sudden orthogonal application.

#### Johan Commelin (May 27 2020 at 11:28):

Also, I would still get the `mul_le_mul`

name conflict

#### Johan Commelin (May 27 2020 at 11:29):

Whatever method I use then to solve the name conflict, could also be applied here.

#### Mario Carneiro (May 27 2020 at 11:31):

you never know if someone will show up with a sudden orthogonal application

Don't try to anticipate applications you don't understand. You will be sufficiently wrong sufficiently often as to make the extra effort worthless. Instead, plan for the applications you are aware of, and try to design things so that it is otherwise generally maintainable and refactorable, and let future-you or future-someone else deal with future applications

#### Mario Carneiro (May 27 2020 at 11:32):

As for the name conflict, the usual technique works here: use a namespace

#### Mario Carneiro (May 27 2020 at 11:32):

or primes

#### Johan Commelin (May 27 2020 at 11:33):

Ok, I'll just make sure that none of the existing names in mathlib changes.

Last updated: May 17 2021 at 21:12 UTC