Skip to content

The norm of a normedModule should be valued in a realType, not in its field of scalar. Definition of subNumDomain. #1959

@mkerjean

Description

@mkerjean

Consider V : normedModType K with K : numFieldType. As of now, its norm is of type `| _ | : V -> K. However, it should be more specifically of type `| _ | : V -> R for R: realTypeand a subType of K. In particular, this will become handy in complex analysis, or allow more generality in the Hahn-Banach theorem, which, as of now, can be instantiated only on normed modules over R.

An easy way to do that is to change the definition of normedModule as such:

HB.mixin Record PseudoMetricNormedZmod_ConvexTvs_isNormedModule (C: numDomainType)
  (R : realType) V   
& PseudoMetricNormedZmod R V & ConvexTvs C V := {
  val : R -> C ;
  ival : injective val;  
  normrZ : forall (l : C) (x : V), val (`| l *: x |) = `| l | * (val `| x |) :> C
}.

However, this is a bit pedestrian as it overlooks the availability of subtypes to handle R. Sadly, the definition of subNumDomain seems to be intricate, due to duplication issues between the domain and a codomain of a norm.

Looking at the definition of NumDomain,

 #[short(type="numDomainType")]
HB.structure Definition NumDomain := { R of
     GRing.IntegralDomain R &
     NumZmodule R &
     NormedZmodule (POrderZmodule.clone R _) R &
     NumZmod_isNumRing R
  }. 

the definition of SubNumDomain should be

 #[short(type="subNumDomainType")]
HB.structure Definition SubNumDomain (M : numDomainType) (S : pred M) := 
{ U of
    SubChoice S U &
     GRing.IntegralDomain U &
     NumZmodule U &
     SubNormedZmodule (POrderZmodule.clone U _) M S U &
     NumZmod_isNumRing U
  }.

However, this triggers an error, as M is supposed to be a numDomain over M, not U. Likewise

#[short(type="subNumDomainType")]
HB.structure Definition SubNumDomain (M : numDomainType) (S : pred M) := 
{ U of
    SubChoice S U &
     GRing.IntegralDomain U &
     NumZmodule U &
     SubNormedZmodule (POrderZmodule.clone M _) M S U &
     NumZmod_isNumRing U
  }.

triggers an error, as U is supposed to be a numDomain over U, not M.

How can we solve that ? It looks like this approach of using subtypes does not work. Could this be an issue of making hierarchy-builder understand the \val : U -> M coercion between norm : U -> U and norm : M -> M when declaring the subNumDomainType structure?

@CohenCyril, maybe you have some HB magic in mind that could help us ?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions