Zulip Chat Archive

Stream: general

Topic: Style


Patrick Massot (Apr 08 2018 at 20:51):

Let's play a new game: each time someone opens a PR and is asked for style corrections, we check whether https://github.com/leanprover/mathlib/blob/master/docs/style.md and https://github.com/leanprover/mathlib/blob/master/docs/naming.md already have them. If not we open something like https://github.com/leanprover/mathlib/pull/95

Patrick Massot (Apr 08 2018 at 20:54):

Everybody can play, and make contributing to, and maintaining, mathlib slightly easier

Simon Hudon (Apr 08 2018 at 21:57):

Good idea! How do we pick a winner?

Kevin Buzzard (Apr 08 2018 at 22:38):

In the best games, everybody wins.

Kevin Buzzard (Apr 08 2018 at 22:39):

"Everybody has won and all must have prizes."

Sebastien Gouezel (Mar 29 2019 at 13:35):

What is the recommended spacing in mathlib?

  { ...
    split,
    { ... },
    { ... }}

or

  { ...
    split,
    { ... },
    { ... } }

or

  { ...
    split,
    { ... },
    { ... }
  }

Kenny Lau (Mar 29 2019 at 13:36):

second

Sebastien Gouezel (Mar 29 2019 at 13:39):

Thanks.

Sebastien Gouezel (Mar 29 2019 at 13:41):

Another one:

begin
  ...
end

or

begin
  ...
end 

or

 begin
  ...
end 

Johan Commelin (Mar 29 2019 at 13:42):

Here I prefer the first one.

Kenny Lau (Mar 29 2019 at 13:55):

The first one

Johannes Hölzl (Mar 29 2019 at 16:29):

I would say

 begin
    ...
  end 

Sebastien Gouezel (Mar 29 2019 at 17:57):

Ah. I would say your suggestion is more readable, but it has the drawback of shifting the proof by 4 characters to the right (instead of two characters for the more condensed version).

Johannes Hölzl (Mar 29 2019 at 18:07):

you an also write

begin
  constructor,
  ...
end

In many cases a refine inside of the tactic block might be necessary anyway.

Mario Carneiro (Mar 29 2019 at 18:14):

If there is only one case I would prefer option 1. If it's multiple cases I would use

begin
  refine <bla _ _, foo _ _>,
  { ... },
  { ... }
end

Floris van Doorn (Mar 29 2019 at 18:52):

Are the following acceptable styles?

begin
  have h : ...,
  { ... },
  ...
end

begin
  split,
  { ... },
  ...
end

Mario Carneiro (Mar 29 2019 at 18:53):

I prefer to bracket both cases in the second example, but the first one is common

Mario Carneiro (Mar 29 2019 at 18:54):

If one subgoal is much shorter than the other, then you should arrange it so that the short goal comes first and then you can skip the second brackets

Patrick Massot (Mar 29 2019 at 19:02):

Who wants to update the style guide to record all that?

snowbunting (Mar 31 2019 at 08:28):

What are the thoughts in the Lean community about multiple synonym/names for a certain theorem? Are there any strategies on how to do that or do people have concerns against doing that?

For example, I was looking for something like "submodule.le_zero" and I wouldn't want to have to dig into lattices and their \bot element, just to get that.

namespace submodule
        universes u v
        variables {R : Type u} {M : Type v} [comm_ring R] [add_comm_group M] [module R M]
        lemma le_zero (N: submodule R M): (0: submodule R M)  N :=
                lattice.bot_le
end namespace

Same goes with theorems that have very common names - again from my first "exercise" - e.g. I would want to find Nakayama's lemma preferable formulated in about 5 equivalent ways as something like nakayama, nakayama_rephrased_1, nakayama_rephrased_2 or something along those lines, certainly not exists_sub_one_mem_and_smul_eq_zero_of_fg_of_le_smul.

Mario Carneiro (Mar 31 2019 at 08:46):

The le_zero example is not recommended because that's not how we write the zero submodule

Jan-David Salchow (Mar 31 2019 at 08:46):

I also have the feeling that the mathlib conventions deserve some updating on this issue. This is not only about finding statements, but also about readability of proofs.

Mario Carneiro (Mar 31 2019 at 08:47):

It is important to stick to a single expression consistently because that's the common language for all the simp lemmas and such

Jan-David Salchow (Mar 31 2019 at 08:47):

Introducing new constants shouldn't be the solution though

Jan-David Salchow (Mar 31 2019 at 08:47):

Can we alias stuff?

Mario Carneiro (Mar 31 2019 at 08:47):

There is an alias command for exactly that, but it is not much used

Jan-David Salchow (Mar 31 2019 at 08:48):

Is it documented somewhere?

Mario Carneiro (Mar 31 2019 at 08:48):

There are probably less than 10 restated theorems in mathlib

Mario Carneiro (Mar 31 2019 at 08:48):

and they are mostly because I thought that core had a dumb name for something

Mario Carneiro (Mar 31 2019 at 08:49):

I agree that famous theorems should use famous names, especially if the symbol reading name is unenlightening or very long

Mario Carneiro (Mar 31 2019 at 08:50):

The convention for restatements would be to use postfix ' or \1, \2 etc

Jan-David Salchow (Mar 31 2019 at 08:50):

There are also boundary cases, e.g. Johannes asked me to rename homogeneous to norm_smul in https://github.com/leanprover-community/mathlib/pull/680#discussion_r253305420

Jan-David Salchow (Mar 31 2019 at 08:50):

I'm not claiming that homogeneous is the best name ever, but it would be nicer in some proofs

Jan-David Salchow (Mar 31 2019 at 08:51):

So an alias might really do the trick ...

Mario Carneiro (Mar 31 2019 at 08:51):

If it is some kind of f(g x) = g (f x) statement I would definitely prefer the symbol reading name

Mario Carneiro (Mar 31 2019 at 08:52):

If it is \ex x, foo x /\ \all y, bar x <= f x + g y then I would prefer a more informative name

Jan-David Salchow (Mar 31 2019 at 08:54):

How about the Cauchy Schwarz inequality?

Mario Carneiro (Mar 31 2019 at 08:55):

I could see a case for either, but I'd err on the side of symbol reading name

Jan-David Salchow (Mar 31 2019 at 08:55):

Is there a reason not to define an alias?

Mario Carneiro (Mar 31 2019 at 08:55):

the problem is that these theorems often have a few forms, and if they are algebraic manipulation lemmas then it's easier to get at them by the symbol reading name

Mario Carneiro (Mar 31 2019 at 08:57):

The alias command still leaves some to be desired. I would like it if it was possible to have forwarding links, i.e. you type in cauchy_s... in autocomplete and norm_mul_le pops up (with an indication that it is redirecting from cauchy_schwarz)

Jan-David Salchow (Mar 31 2019 at 08:58):

I see your point for finding statements

Jan-David Salchow (Mar 31 2019 at 08:58):

But in a proof I'd prefer an informative name

Mario Carneiro (Mar 31 2019 at 08:59):

I suppose you could also do it the other way around, seeing as the main reason for the symbol reading names is searchability

snowbunting (Mar 31 2019 at 09:00):

So how would that alias work? I see

/ -- doc string - /
alias my_theorem ← alias1 alias2 ...

or

alias A_iff_B ↔ B_of_A A_of_B

in the comments, but alias submodule.le_zero ← lattice.bot_le does not work.

What is the bad thing of doing

lemma le_zerro: ... :=
        lattice.bot_le

Mario Carneiro (Mar 31 2019 at 09:00):

you have to import the tactic, I don't think it's in the default set

Mario Carneiro (Mar 31 2019 at 09:01):

The tactic does basically the same thing as that, except it also gives it a nice docstring and attributes and stuff

Mario Carneiro (Mar 31 2019 at 09:02):

alias is a good way to document your intent about it too (otherwise people might just remove it to eliminate duplication)

Mario Carneiro (Mar 31 2019 at 09:02):

Of course, alias is only for exact duplicates. If you want to change the statement it's not an alias

Mario Carneiro (Mar 31 2019 at 09:03):

so le_zero isn't an example

snowbunting (Mar 31 2019 at 09:06):

would you mind pointing me to a minimal working example? Also didn't see any documentation about docstrings yet, is there any tutorial/document where to read that stuff?

Yes it is not, but since I could replace my submodule.le_zero in the proof with lattice.bot_le, it would be functionally an alias, wouldn't it? (I mean I only did write the lemma because I needed this fact in the proof and couldn't find it)

Mario Carneiro (Mar 31 2019 at 09:09):

Just try it and see, it's not a particularly complicated tactic

Mario Carneiro (Mar 31 2019 at 09:11):

import tactic.alias

section end

alias add_comm  plus_comm

#print plus_comm -- mouse over this, the docstring is "**Alias** of `add_comm`"
-- @[alias]
-- theorem plus_comm : ∀ {α : Type u} [_inst_1 : add_comm_semigroup α] (a b : α), a + b = b + a :=
-- add_comm

Mario Carneiro (Mar 31 2019 at 09:12):

By the way, that theorem would be called zero_le not le_zero anyway

Mario Carneiro (Mar 31 2019 at 09:13):

and that already exists and might even apply if you can prove submodules have the right structure

Mario Carneiro (Mar 31 2019 at 09:14):

but like I said, I strongly recommend against adding that theorem, because it will make you want to use 0 for the zero submodule, and you will be frustrated six more times for lack of other theorems talking about this submodule

Mario Carneiro (Mar 31 2019 at 09:14):

because it's uniformly called bot in the library

snowbunting (Mar 31 2019 at 09:41):

thank you!

I'm not going to make any pull request to the library, I am merely trying to figure out how things work, so the example here is rather a theoretical one. But I think it is good to know the options available for giving nicer, shorter notations to things, as this seems to be im my opinion quite important for the usability.

I agree with you that I should use \bot to match the library style, and also that I messed up the name there (I had first "ge_zero", then I changed the sign later).

Scott Morrison (Mar 31 2019 at 09:43):

Naming things is hard. It took me a long time to get over the fact that mathlib people were telling me the property that functors have is called map_comp, rather than functoriality.

Scott Morrison (Mar 31 2019 at 09:43):

I have grudgingly accepted their point, I think. :-)

snowbunting (Mar 31 2019 at 09:46):

absolutely, and it makes sense for searching when you can type something like eq_of... and it gives you all the options, so I generally like the naming style.

Mario Carneiro (Mar 31 2019 at 09:48):

By the way, I've tried this kind of naming in the past. In the long term, you get confused by your own naming system, because it is difficult to name everything consistently this way and you have to look a lot more up

Mario Carneiro (Mar 31 2019 at 09:48):

you end up with ad hoc extensions to the naming system all over the place and it becomes a mess

Mario Carneiro (Mar 31 2019 at 09:50):

there just isn't enough creativity in the mathematical lexicon to name all the thousands of piddly lemmas that demand names


Last updated: Dec 20 2023 at 11:08 UTC