Zulip Chat Archive
Stream: mathlib4
Topic: Even and odd functions
David Loeffler (Sep 02 2024 at 15:55):
I believe Mathlib doesn't currently have the notion of "even" and "odd" functions (between types with negation), i.e. functions satisfying f (-x) = f x or f (-x) = -(f x) respectively. Cf. https://en.wikipedia.org/wiki/Even_and_odd_functions.
These are pretty trivial to code up:
/-- A function `f` is _even_ if it satisfies `f (-x) = f x` for all `x`. -/
protected def Function.Even {R R' : Type*} [Neg R] (f : R → R') : Prop := ∀ (x : R), f (-x) = f x
/-- A function `f` is _odd_ if it satisfies `f (-x) = -f x` for all `x`. -/
protected def Function.Odd {R R' : Type*} [Neg R] [Neg R'] (f : R → R') : Prop :=
∀ (x : R), f (-x) = -(f x)
My question is: where should they go in Mathlib, given that they have virtually no prerequisites at all? Would a new file under Data, perhaps Data/EvenOddFunction.lean, be a good solution?
Yaël Dillies (Sep 02 2024 at 15:56):
Definitely not under Data since they import algebra if you try to prove anything non-trivial. Algebra could work
David Loeffler (Sep 02 2024 at 16:00):
Good point, I guess you will very soon need InvolutiveNeg and that lives in Algebra/Group. How about Algebra.Group.EvenOddFunction then?
Yaël Dillies (Sep 02 2024 at 16:11):
Happy with it
Yury G. Kudryashov (Sep 02 2024 at 17:52):
Should it come with a linter warning against _root_.Even (f : α → β)?
Yury G. Kudryashov (Sep 02 2024 at 17:53):
This is a valid term that means (after some simplifications) ∀ a, Even (f a).
David Loeffler (Sep 02 2024 at 20:11):
Yury G. Kudryashov said:
Should it come with a linter warning against
_root_.Even (f : α → β)?
This sounds like a nice idea (I made that mistake several times myself) but I have no idea how to write linters myself...
Johan Commelin (Sep 03 2024 at 04:52):
I think such a linter can be useful (not for mathlib CI, but just as an authoring tool in VScode). But it can definitely be a separate PR.
Damiano Testa (Sep 03 2024 at 06:23):
I'm not sure that I understand what the linter should do: it is supposed to prevent using _root_.Even with a function? Due to the protected this means Even f where f is a function, right?
Yaël Dillies (Sep 03 2024 at 06:44):
Why don't you just write f.Even?
Yaël Dillies (Sep 03 2024 at 06:44):
Or, let's be crazy, why not call the predicates EvenFun/OddFun?
Eric Wieser (Sep 03 2024 at 08:50):
Johan Commelin said:
I think such a linter can be useful (not for mathlib CI, but just as an authoring tool in VScode). But it can definitely be a separate PR.
A similar linter would be good for IsCoprime on Nat
Damiano Testa (Sep 03 2024 at 09:01):
This linter would be a "reverse" protected, or am I misunderstanding? It should flag a selected few declarations X for which Y.X is preferred (and possibly protected)?
Johan Commelin (Sep 03 2024 at 09:03):
Well, I think it should also look at the t that comes after X. So for certain t it should warn about X t and suggest Y.X t.
Johan Commelin (Sep 03 2024 at 09:03):
And I think it should only run locally.
Damiano Testa (Sep 03 2024 at 09:06):
Ok, yes, I did not mention further necessary checks to trigger the linter, but I think that I have a clearer idea of what it should do!
David Loeffler (Sep 03 2024 at 11:10):
PR up at #16446.
Last updated: May 02 2025 at 03:31 UTC