Zulip Chat Archive

Stream: general

Topic: Dealing with different paths in type class inference


Tomas Skrivan (Oct 28 2020 at 16:51):

How do I deal with the problem when there are two ways to infer an instance of a type class, but I know that the instances are propositionally equal. I'm getting type mismatch error when applying a function that expects one way of inferring such a type class, but I provide the other way.

An example: normed spaces have products and have topology induced by the norm. To get topology on the product I can either infer topology from the product of normed spaces or take a product of topologies induced by individual norms.

Mario Carneiro (Oct 28 2020 at 16:53):

The standard solution in mathlib is to have normed_space extend topological_space, meaning that a normed space has the apparently redundant information of a norm and a topology, together with a (propositional) proof that they cohere

Reid Barton (Oct 28 2020 at 16:53):

I'm a bit surprised this is a problem for normed spaces because for metric spaces, we take specific measures to avoid exactly this problem

Mario Carneiro (Oct 28 2020 at 16:54):

Do you have a #mwe? A cursory look at normed_space seems to indicate that it is set up in the recommended way

Reid Barton (Oct 28 2020 at 16:55):

But, when you find yourself in this situation, often convert e instead of refine e will be able to make progress, or congr if you already have an equality where the sides differ only in a choice of instance

Tomas Skrivan (Oct 28 2020 at 16:55):

This was just an example and I'm running into a problem somewhere else.

Reid Barton (Oct 28 2020 at 16:55):

but of course this will only succeed in the end if you actually have a lemma that says the topologies (or whatever) are propositionally equal

Mario Carneiro (Oct 28 2020 at 16:58):

So when you make an instance of normed_space for the product, you give the product topological space as the topology and the product norm for the norm, and then the coherence proof contains the content of the statement that the product of induced topologies is the topology induced by the product norm

Mario Carneiro (Oct 28 2020 at 17:01):

There are also constructors like docs#normed_group.of_core that can be used to skip the coherence proof by actually defining the topology as the one induced by the norm. This constructor should not be used if there is any other way of getting the topology because it will cause diamond problems

Tomas Skrivan (Oct 28 2020 at 17:01):

Actually, I'm defining locally_convex_space just extends vector_spaces and having a trouble coping with normed_space. In particular, the locally convex structure on the product of normed spaces is the same as the product of locally convex spaces induced by normed spaces.

Probably the way to resolve this, would be to make normed_space to extend locally_convex_space, but I'm afraid touching mathlib.

Mario Carneiro (Oct 28 2020 at 17:04):

yes, you have to change the definition, or else introduce normed_space' that extends normed_space and locally_convex_space

Mario Carneiro (Oct 28 2020 at 17:06):

or live with the diamond and use convert as reid suggested

Tomas Skrivan (Oct 28 2020 at 17:14):

I'm a bit confused how to make normed_space extend locally_convex_space without introducing another diamond. The normed_space assumes that you already provide normed_group on the base type. Therefore there would be two ways of getting topology, through the extension from locally_convex_space and from the normed_group.

Mario Carneiro (Oct 28 2020 at 17:17):

You make normed_space extend locally_convex_space and normed_group, and the common fields are merged

Mario Carneiro (Oct 28 2020 at 17:17):

You have to use old_structure_cmd to make it work

Tomas Skrivan (Oct 28 2020 at 17:20):

So i'm thinking that the definition of locally_convex_space should be:

class locally_convex_space {a : Type} {b : Type}  [normed_field a] [toplogical_group b] extends semimodule a b := ... zero has neighbourhood basis made of convex sets...

and then change the definition of normed_space to

class normed_space (a : Type*) (b : Type*) [normed_field a] [normed_group b] extends locally_convex_space a b := ...

Mario Carneiro (Oct 28 2020 at 17:21):

oh, in that case I don't see a problem

Tomas Skrivan (Oct 28 2020 at 17:21):

Mario Carneiro said:

You make normed_space extend locally_convex_space and normed_group, and the common fields are merged

In mathlib normed_space does not extends normed_group it extends only semimodule. Should I keep it that way?

Mario Carneiro (Oct 28 2020 at 17:22):

yes, I was thinking about unary type classes

Mario Carneiro (Oct 28 2020 at 17:22):

with the parameters as you have them I don't see where the diamond arises

Tomas Skrivan (Oct 28 2020 at 17:23):

Is the whole mathlib going to break if I introduce this changes?

Mario Carneiro (Oct 28 2020 at 17:23):

probably not

Mario Carneiro (Oct 28 2020 at 17:24):

it mostly comes up when introducing new instances, since these now have to prove that they have a locally convex structure

Mario Carneiro (Oct 28 2020 at 17:25):

I count 5 instances of normed_space in mathlib, so not horrible

Tomas Skrivan (Oct 28 2020 at 17:26):

Ok, I will try it out.

Yury G. Kudryashov (Oct 28 2020 at 18:46):

Note that metric_space and normed_space don't use old_structure_cmd

Yury G. Kudryashov (Oct 28 2020 at 18:48):

And you won't have a diamond problem if locally_convex_space will be a Prop mixin taking semimodule as an argument

Yury G. Kudryashov (Oct 28 2020 at 18:49):

But @Mario Carneiro doesn't like mixins

Mario Carneiro (Oct 28 2020 at 18:49):

I assumed from "local convex structure" that there is some non-propositional data

Yury G. Kudryashov (Oct 28 2020 at 18:54):

It seems that the only non-propositional data comes from semimodule. At least based on the textual description.

Yury G. Kudryashov (Oct 28 2020 at 18:55):

I guess, something like ∀ U ∈ nhds (0:E), ∃ s ∈ nhds (0:E), convex s ∧ s ⊆ U.

Tomas Skrivan (Oct 28 2020 at 19:08):

Yury G. Kudryashov said:

I guess, something like ∀ U ∈ nhds (0:E), ∃ s ∈ nhds (0:E), convex s ∧ s ⊆ U.

I will probably go this way. The problem is that convexity makes sense only for real or complex vector spaces, this prevents me from making normed_space to extend locally_convex_space.

Kevin Buzzard (Oct 28 2020 at 19:09):

https://www.springer.com/gp/book/9783540425335 :P

Kevin Buzzard (Oct 28 2020 at 19:10):

"The fourth more advanced chapter was added to give the reader a rather complete tour through all the important aspects of the theory of locally convex vector spaces over nonarchimedean fields. "

Yury G. Kudryashov (Oct 28 2020 at 19:15):

You don't need normed_space to extend locally_convex_space if locally_convex_space is a Prop-valued mixin.

Tomas Skrivan (Oct 28 2020 at 19:17):

Yury G. Kudryashov said:

You don't need normed_space to extend locally_convex_space if locally_convex_space is a Prop-valued mixin.

Yes, I understand that now, which is great! But I have already started modifying matlib to do such an extension, but I will abandon that approach now.

Tomas Skrivan (Oct 28 2020 at 19:18):

Kevin Buzzard said:

"The fourth more advanced chapter was added to give the reader a rather complete tour through all the important aspects of the theory of locally convex vector spaces over nonarchimedean fields. "

Ohhh ok. I need to have a look at their definition of locally convex space then. The definition via seminorms probably still works, but I do not see how to define a convex set.

Also to keep locally_convex_space as a Prop I will only state an existence of a family of seminorms that generates the given topology.

Kevin Buzzard (Oct 28 2020 at 19:19):

Honestly I wouldn't worry about the nonarchimedean case right now :-)

Kevin Buzzard (Oct 28 2020 at 19:20):

but FWIW this is the definition in the nonarchimedean case too -- the p-adic numbers are a complete normed field and there is a theory of Banach spaces, locally convex spaces etc over this field (which is important in the p-adic Langlands program)

Tomas Skrivan (Nov 02 2020 at 19:04):

I'm running into these problems again, this time with inner_product_space.

First, I need a product of inner_product_spaces and there does not seems to be one defined, so I have defined it. (currently just with a sorry, so that might be a problem)

Example of a problem with this is when deducing add_comm_group of a product. I get two different paths:

1. product of two inner_product_space -> inner_product_space to normed group -> normed_group to add_comm_group
2. inner_product_space to normed group -> normed_group to add_comm_group -> product of two add_comm_group

The problem is all over the place, when deducing topological_space semimodule etc.

This leads to the question why is inner_product_space not a Prop? It is just a normed_space that satisfy parallelogram law.

Going down the rabbit hole. Cannot we define normed_group also as a Prop? Maybe there is some sufficient and necessary condition on the metric to be induced by a norm.

Johan Commelin (Nov 02 2020 at 19:06):

@Tomas Skrivan I think if you fill in the sorry, then the problem might go away.

Johan Commelin (Nov 02 2020 at 19:07):

Because then Lean can check that the two paths give the same add_comm_group (definitionally)

Tomas Skrivan (Nov 03 2020 at 08:49):

Ok, I will try that, but I'm expecting there will be a problem with topology because if I have checked correctly, the product of normed space is given with sup norm but product of inner product spaces gives product with l2 norm. The resulting norm/metric is different but the topology is the same, but that is non-trivial theorem. Let's see if I get into trouble.

Johan Commelin (Nov 03 2020 at 09:16):

yup, that sounds like you might get some trouble at some point... but I don't know that part of the library well enough to know how much trouble

Sebastien Gouezel (Nov 03 2020 at 09:24):

You should be using a type synonym.

In the same way, the product of finitely many spaces is endowed with the sup norm, so to define the product of finitely many inner spaces, with the canonical inner product structure, we use pi_Lp 2 one_le_two, which as a type is just the same as the product type, but as a normed space is registered with a different norm. That's why the instance pi_Lp.inner_product_space in inner_product.lean does not create a problem.

Note that the product of two spaces is not a special case of the product of finitely many spaces (an element of the first one has two components x.fst and x.snd, while an element of the second one is a function on a finite space)...

Eric Wieser (Mar 20 2023 at 13:50):

This leads to the question why is inner_product_space not a Prop? It is just a normed_space that satisfy parallelogram law.

There are a handful of lemmas in mathlib that say "this thing is true for inner_product_space K V" which don't mention K at all in the statement. In these places, a is_inner_product_norm V typeclass would probably make sense (in addition to the current typeclass). This would be a nice follow-up to #18583, which now makes these "unused" K arguments more obvious.

Jireh Loreaux (Mar 20 2023 at 14:30):

There's a characterization of inner product norms purely in terms of the norm: when it satisfies the parallelogram identity. So, I would call this class parallelogram_norm. Then we can have the construction that creates an inner_product_space from a normed space with this property.

Jireh Loreaux (Mar 20 2023 at 14:38):

In general, of course, you wouldn't want to use this construction because it goes through the polarization identity, so the definition would be gross.


Last updated: Dec 20 2023 at 11:08 UTC