-
Notifications
You must be signed in to change notification settings - Fork 297
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(algebra/jordan/triple): Introduce Jordan triples #11553
base: master
Are you sure you want to change the base?
Conversation
src/algebra/jordan/triple.lean
Outdated
... = ⦃a, b, a⦄ + 2•⦃a, b, c⦄ + ⦃c, b, c⦄ : by rw two_nsmul | ||
|
||
/-- Define the multiplication operator `D` -/ | ||
@[simps] def D (a b : A) : add_monoid.End A := |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a pretty bad name! Isn't there anything more explicit in the literature?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's usually written
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
mul
or mult
would already be a better name. You can't just use a letter.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fully it's is_tp.D
. If a symbol like +
, *
etc can represent a bilinear map, why not D
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+
and *
are notation; feel free to introduce D
as local notation or an abbreviation. But the convention is that the name is descriptive.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@kbuzzard, you say this, but we have algebraic_geometry.AffineScheme.Γ
! I think that one is due a rename to .Gamma
or something.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We also have polynomial.C
, polynomial.X
.
Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
etc... but we need to decide on the naming convention for the middle argument.
|
Zulip thread: https://leanprover.zulipchat.com/#narrow/stream/113488-general/topic/Middle.20argument Was a convention agreed for this? |
I've redefined the triple product along the lines discussed in #11575. I still haven't managed to redefine the |
by rw [map_add, add_monoid_hom.add_apply, add_monoid_hom.add_apply] | ||
|
||
lemma add_middle (A : Type*) [add_comm_monoid A] [has_trilinear_tp A] (a b₁ b₂ c : A) : | ||
⦃a, b₁ + b₂, c⦄ = ⦃a, b₁, c⦄ + ⦃a, b₂, c⦄ := by rw [map_add, add_monoid_hom.add_apply] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is (or should be) add_monoid_hom.map_add₂
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure there is a add_monoid_hom.map_add₂
? Perhaps there should be? Did you mean linear_map.map_add₂
?
mathlib/src/linear_algebra/bilinear_map.lean
Line 124 in e37daad
theorem map_add₂ (f : M →ₛₗ[ρ₁₂] N →ₛₗ[σ₁₂] P) (x₁ x₂ y) : f (x₁ + x₂) y = f x₁ y + f x₂ y := |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@eric-wieser I guess the next step would be to define something like this:
class is_jordan_triple (R : Type u) [comm_ring R] (ρ : R →+* R)
(A : Type v) [add_comm_group A] [module R A]
extends is_jordan_tp A :=
(triple_smul₁ : ∀ (r : R) (a b c : A), ⦃r•a, b, c⦄ = r • ⦃a, b, c⦄)
(triple_smul₂ : ∀ (r : R) (a b c : A), ⦃a, r•b, c⦄ = (ρ r) • ⦃a, b, c⦄)
But we then need to show that thetp
is an instance of A →ₛₗ[ring_hom.id] A →ₛₗ[ρ] A →ₛₗ[ring_hom.id] A
, and it's not immediately clear to me how to formulate that statement.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Something along these lines, perhaps?
class is_jordan_triple (S : Type u) [comm_semiring S] [star_ring S]
(A : Type v) [add_comm_group A] [module S A]
extends is_jordan_tp A :=
(triple_smul₁ : ∀ (s : S) (a b c : A), ⦃s•a, b, c⦄ = s • ⦃a, b, c⦄)
(triple_smul₂ : ∀ (s : S) (a b c : A), ⦃a, s•b, c⦄ = (star s) • ⦃a, b, c⦄)
variables (S : Type u) [comm_semiring S] [star_ring S]
variables {A : Type v} [add_comm_group A] [module S A]
def sesterlinear [is_jordan_triple S A] : A →ₗ[S] A →ₛₗ[star_ring_end S] A →ₗ[S] A := {
to_fun := λ a, {
to_fun := λ b, {
to_fun := λ c, ⦃a, b, c⦄,
map_add' := λ c₁ c₂, sorry,
map_smul' := sorry,
},
map_add' := sorry,
map_smul':= sorry,
},
map_add' := λ a₁ a₂, sorry,
map_smul' := sorry,
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Trying something like this:
import algebra.lie.of_associative
universes u v
/-- An additive commutative monoid with a trilinear triple product -/
class has_triadditive_tp (A : Type*) [add_comm_group A] := (tp : A →+ A →+ A →+ A )
localized "notation ⦃a, b, c⦄ := has_triadditive_tp.tp a b c" in triple
class has_sesterlinear_tp (R : Type u) [comm_semiring R] [star_ring R] (A : Type*)
[add_comm_group A] [module R A] :=
(tp : A →ₗ[R] A →ₛₗ[star_ring_end R] A →ₗ[R] A )
instance : star_ring ℤ := star_ring_of_comm
lemma add_left {A : Type*} [add_comm_group A] [has_triadditive_tp A] (a₁ a₂ b c : A) :
⦃a₁ + a₂, b, c⦄ = ⦃a₁, b, c⦄ + ⦃a₂, b, c⦄ :=
by rw [map_add, add_monoid_hom.add_apply, add_monoid_hom.add_apply]
instance has_triadditive_tp_to_has_sesterlinear_tp {A : Type v} [add_comm_group A]
[has_triadditive_tp A] : has_sesterlinear_tp ℤ A := {
tp := {
to_fun := λ a, {
to_fun := λ b, {
to_fun := λ c, ⦃a, b, c⦄,
map_add' := λ c₁ c₂, sorry,
map_smul' := sorry,
},
map_add' := sorry,
map_smul':= sorry,
},
map_add' := λ a₁ a₂, λ b, linear_map.ext (λ c, add_left a₁ a₂ b c)
map_smul' := sorry,
}
}
But it doesn't quite meet up in the middle
mvp.lean:33:28
type mismatch at application
linear_map.ext (λ (c : A), add_left a₁ a₂ b c)
term
λ (c : A), add_left a₁ a₂ b c
has type
∀ (c : A),
⇑(⇑(⇑has_triadditive_tp.tp (a₁ + a₂)) b) c =
⇑(⇑(⇑has_triadditive_tp.tp a₁) b) c + ⇑(⇑(⇑has_triadditive_tp.tp a₂) b) c
but is expected to have type
∀ (x : A), ⇑?m_10 x = ⇑?m_11 x
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There's a discrepancy here that my brain can't quite unpick at the moment. →+
is a add_monoid_hom
, whereas →ₛₗ[star_ring_end R]
is an instance of add_monoid_hom_class
. So it is not quite right in lean to say that →ₛₗ[star_ring_end R]
is an instance of →+
- which seems a bit unsatisfactory.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's the point of add_monoid_hom_class
: you don't have to use add_monoid_hom
to talk about additive monoid homs.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So why is the definition of →+
infixr ` →+ `:25 := add_monoid_hom
and not
infixr ` →+ `:25 := add_monoid_hom_class
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
add_monoid_hom A B
is the type of additive monoid homomorphisms from A
to B
. add_monoid_hom_class F A B
states that an already existing type F
is a type of additive monoid homomorphisms from A
to B
. So for example add_monoid_hom
is an add_monoid_hom_class
, but so is add_equiv
, ring_hom
, continuous_add_monoid_hom
...
Put another way, add_monoid_hom
is here to be studied as an object on its own, by giving it an algebraic structure, an order, a topology... while add_monoid_hom_class
is a way to talk about additive monoid homs individually.
Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
Introduces Jordan triples and establishes some basic properties.
This is a sibling PR to #11073, which introduces Jordan rings. A subsequent PR will show that all Jordan rings also have a Jordan triple product. Conversely, every element
a
of a Jordan tripleA
induces a Jordan ring multiplication onA
(thea
-homotope).