• Aucun résultat trouvé

3.6 Automatisation

4.1.3 Voisinages et espaces uniformes

Comme cela a été évoqué dans la section précédente, les voisinages généralisés n’ont pas été définis dans les espaces métriques, mais dans les espaces uniformes. C’est-à-dire que au lieu de définir la topo-logie utilisée par les ouverts associés à une distance d : U × U → R+, nous avons choisi de la définir par les ouverts associés à un écart e : U × U → R+

∪ {+∞}. Pour donner un exemple, l’écart sur les espaces de fonctions e(f, g) = supx∈Xd(f (x), g(x)) sert usuellement à définir une topologie pour la convergence uniforme. Si l’on pose d = min{1, e}, l’une des distances associées à e, on obtient un espace métrique ayant la même topologie, mais il peut être difficile à manipuler en raison de l’usage de la fonc-tion minimum. Cette difficulté a été rencontrée lors de la démonstrafonc-tion du théorème d’échange de limite : Théorème (filterlim_switch). Soient f : A × B → F , avec F un espace

complet, a un point adhérent à A et b un point adhérent à B. Si on suppose que

CU f converge uniformément vers la fonction g : B → F quand sa première variable tend vers a,

CS f converge simplement vers la fonction h : A → F quand sa seconde variable tend vers b,

alors, il existe ℓ dans l’adhérence de F tel que

g(y)−→ y→bℓ et h(x)x→a−→ℓ f (x, y) g(y) h(x) ℓ x a CU y b C S y b x a

Dans ce théorème, l’hypothèse de convergence uniforme peut être exprimée facilement en utilisant filterlim à condition de pouvoir définir des voisinages sur un espace de fonction : filterlim f (locally a) (locally g). Comme je l’ai fait remarquer, utiliser la distance associée à l’écart de la convergence uniforme dR→R(f, g) = minR(1; sup (dR(f (x), g(x)))) n’est pas souhaitable car cette distance est difficile à manipuler. De même, utiliser directement l’écart e(f, g) = sup (dR(f (x), g(x))) est difficile car il est à valeurs dans R. J’ai donc choisi de définir les espaces uniformes par les boules engendrées par l’écart choisi. Ce choix a été guidé par un élément revenant régulièrement dans la démonstration du théo-rème d’échange de limite : les nombreux énoncés de la forme dR→R(f, g) < ε étaient systématiquement transformés en ∀x, dR(f (x), g(x)) < ε, avec ε≤ 1, avant de poursuivre la démonstration.

Définition des espaces uniformes

Les espaces uniformes ont donc été définis par la donnée d’un prédicat ball : T -> R -> T -> Prop permettant de représenter les boules, ainsi que la démonstration qu’elles représentent les boules engendrées par un écart :

ball_center: ∀x ∈ T, ∀ε > 0, x ∈ ball(x, ε)

ball_sym : ∀x, y ∈ T, ∀ε ∈ R, y ∈ ball(x, ε) ⇒ x ∈ ball(y, ε)

ball_triangle: ∀x, y, z ∈ T, ∀ε1, ε2∈ R, y ∈ ball(x, ε1)∧ z ∈ ball(y, ε2)⇒ z ∈ ball(x, ε1+ ε2) On peut faire un parallèle entre ces énoncés et certaines propriétés sur les distances : la distance d’un point à lui-même (∀x, d(x, x) = 0), la symétrie (∀x, y, d(x, y) = d(y, x)) et l’inégalité triangu-laire (∀x, y, z, d(x, z) ≤ d(x, y) + d(y, z)). Il est important de noter que la propriété de séparation (∀x, y, d(x, y) = 0 ⇒ x = y) n’est pas représentée. Cette propriété n’est en effet pas utile pour dé-montrer les théorèmes et peut être remplacée, comme en C-CoRN, par la notion de “infiniment proche” (∀ε > 0, y ∈ ball(x, ε)). Même si cela peut entraîner quelques difficultés dans les démonstrations, cela ne pose pas de problème dans les ensembles usuels (R, C, Rn, ...) car cette propriété est alors équivalente à l’égalité.

Pour donner quelques exemples d’espaces uniformes, on peut citer

– l’espace uniforme sur les réels : ballR(x, ε, y) := |y − x| < ε qui reprend la distance usuelle sur les nombres réels,

– les produits d’espaces uniformes : ballU×V ((x, y), ε, (x, y)) := ballU(x, ε, x)∧ ballV (y, ε, y) avec U et V deux espaces uniformes,

– l’espace uniforme sur les fonctions : ballU→V(f, ε, g) := ∀x ∈ U, ballV (f (x), ε, g(x)) où l’espace d’arrivée V est également muni d’une structure d’espace uniforme.

Sur ces quelques exemples, on peut remarquer que les ball ne sont ni des boules fermées, ni des boules ouvertes. En effet, dans R, les ball correspondent aux boules ouvertes usuelles de la forme ]x − ε; x + ε[, mais si on regarde l’espace uniforme des fonctions à valeurs dans R, les boules engendrées ne sont ni

ouvertes ni fermées. On a en effet les inclusions strictes B(f, ε) ⊂ ball(f, ε) ⊂ B(f, ε) avec B(f, ε) = {g|e(f, g) < ε} et B(f, ε) = {g|e(f, g) ≤ ε}. Pour donner un exemple concernant la première inclusion, sur l’intervalle [0, ε[, la fonction identité est dans ball(x 7→ 0, ε) car on a bien ∀x ∈ [0, ε[, |x| < ε, mais elle n’est pas dans la boule ouverte B(x 7→ 0, ε) car sup{ |x| tel que x ∈ [0, ε[ } = ε. De même, pour la seconde inclusion la fonction constante x 7→ ε est dans la boule fermée B(x 7→ 0, ε) car sup |ε| = ε ≤ ε, mais pas dans ball(x 7→ 0, ε) car |ε| = ε 6< ε. Cette particularité ne pose cependant pas de problème en pratique car la topologie engendrée par les boules fermées ou ouvertes de rayon strictement positif est la même. La topologie engendrée par les ball est également la même en raison des inclusions citées ci-dessus.

Le prédicat ball ainsi défini permet d’exprimer les voisinages d’un point : D e f i n i ti o n locally { U : UniformSpace } ( x : U ) ( P : U -> Prop ) :=

e x i s t s eps : posreal , f o r a l l y : U , ball x eps y -> P y .

Dans le cas où l’espace uniforme U est celui des nombres réels R, on retrouve la caractérisation usuelle des voisinages. En effet, dans ce cas le prédicat ball x eps y est défini par |y − x| < eps. On a alors la propriété qu’un ensemble P est un voisinage de x ∈ R si ∃ε > 0, ∀y ∈ R, |y − x| < ε ⇒ y ∈ P .

Comme pour les filtres, nous avons souhaité utiliser un mécanisme permettant de reconnaître automa-tiquement les espaces uniformes, ainsi que les structures présentées dans la suite de ce chapitre. L’usage des classes de types s’est avéré inadapté pour des raisons de priorités dans la recherche qui entraînent des boucles infinies. Nous nous sommes donc tournés vers les structures canoniques [Sai99]. Ainsi, pour désigner un élément x de l’ensemble U possédant une structure d’espace uniforme, l’utilisateur peut écrire indifféremment “x : U” ou “x : My_UniformSpace” où

Canonical My_UniformSpa c e := UniformSpace . Pack U My_Uniform S p ac e _m i x in U .

avec My_UniformSpace_mixin une preuve que l’ensemble U possède bien les propriétés d’espace uniforme. L’utilisateur pourra alors utiliser tous les théorèmes démontrés dans le cadre des espaces uniformes. Il est à noter que ce système ne supporte pas la surcharge : un seul espace uniforme peut être associé de manière canonique à un ensemble U. Pour définir un second espace uniforme sur le même espace de base U, il conviendra alors de remplacerCanonicalparDefinitionet d’utiliser explicitement my_UniformSpace pour désigner l’espace uniforme choisi.

Continuité

Afin d’alléger l’écriture des théorèmes concernant la continuité, la définition suivante a été introduite : D e f i n i ti o n continuous { T U : UniformSpace } ( f : T -> U ) ( x : T ) : Prop :=

filterlim f ( locally x ) ( locally ( f x )). ainsi que sa version sur un domaine :

D e f i n i ti o n continuous_on { T U : UniformSpace } ( D : T -> Prop ) ( f : T -> U ) : Prop :=

f o r a l l x : T , D x -> filterlim f ( within D ( locally x )) ( locally ( f x )). Cette définition permet d’exprimer la continuité de fonctions comme arcsin qui est définie et continue sur l’intervalle [−1; 1] sans avoir à distinguer le cas de la continuité en −1 et en 1.

La continuité d’un certain nombre de fonctions a été démontrée avant l’introduction de cette définition. Pour les fonctions à une seule variable, cela ne pose pas de problème car l’énoncé utilisant filterlim et celui utilisant continuous sont interchangeables. Ce n’est cependant pas le cas pour les fonctions à plusieurs variables. En effet, le filtre choisi pour le point vers lequel tend la variable dans les théorèmes déjà définis est filter_prod (locally x) (locally y), alors qu’il s’agit de locally (x,y) dans le cas des théorèmes utilisant le prédicat continuous. Même si les deux versions sont équivalentes, elles ne sont pas convertibles.

Les espaces uniformes complets

Les espaces uniformes décrits dans la section ci-dessus permettent d’exprimer aussi facilement en Coq l’hypothèse de convergence uniforme “y 7→ f(x, y) converge uniformément vers g quand x tend vers a”, qui s’écrit

4.1. GÉNÉRALISER LES LIMITES 69 que l’hypothèse de convergence simple “f(x, y) converge simplement vers h(x) quand y tend vers b”, qui s’écrit

forall x, filterlim (f (x)) (locally b) (locally (h(x))).

Pour démontrer le théorème d’échange de limite présenté au début de la section 4.1.3, il faut de plus pouvoir exprimer la complétude d’un espace uniforme. La caractérisation des espaces complets par la convergence des suites de Cauchy n’a pas été choisie comme définition en raison de son manque de généralité. En effet, avec les définitions présentées jusqu’ici, il est possible d’exprimer l’énoncé “la suite u est une suite de Cauchy” par

D e f i n i ti o n is_cauchy ( u : nat -> U ) := f o r a l l eps : posreal ,

filter_prod eventually eventually (fun n = > ball ( u ( snd n )) eps ( u ( fst n ))). Cependant cette approche ne permet de caractériser que les espaces séquentiellement complets et n’assure que la convergence des suites. Il est possible de généraliser cette définition “être de Cauchy” afin de caractériser effectivement les espaces de Cauchy :

D e f i n i ti o n is_cauchy ( f : T -> U ) ( F : ( T -> Prop ) -> Prop ) := f o r a l l eps : posreal ,

filter_prod F F (fun n = > ball ( f ( snd n )) eps ( f ( fst n ))). mais cette définition est lourde à utiliser en raison de la présence de filter_prod.

La définition “être de Cauchy” retenue dans la bibliothèque Coquelicot est la notion de filtre de Cauchy telle que définie par Bourbaki [Bou71]. Il s’agit des filtres d’un espace uniforme U contenant des boules de rayon arbitrairement petit :

D e f i n i ti o n cauchy ( F : ( U -> Prop ) -> Prop ) :=

f o r a l l eps : posreal , e x i s t s x : T , F ( ball x eps ).

Après plusieurs pistes étudiées pour caractériser la complétude, la solution retenue est la suivante : – une fonction totale lim : ((U -> Prop) -> Prop) -> U prenant en argument une collection de

sous-ensembles d’un espace uniforme U, usuellement un filtre, et renvoyant un élément de U, – et un prédicat

complete_ca uc hy : f o r a l l F : ( T -> Prop ) -> Prop , ProperFilter F -> cauchy F ->

f o r a l l eps : posreal , F ( ball ( lim F ) eps ).

qui assure que cet élément est la limite du filtre si le filtre fournit en argument est un filtre de Cauchy.

Cette approche permet de construire, pour tout espace complet, des fonctions totales comme celles décrites dans la section 3.5. En effet, pour tout prédicat P vrai pour au plus une valeur, la fonction

D e f i n i ti o n iota ( P : T -> Prop ) := lim (fun A = > ( f o r a l l x , P x -> A x )). renvoie, si elle existe, cette unique valeur et une valeur arbitraire sinon.

Notre définition d’un espace complet étant assez éloignée de la formulation usuelle, le lemme suivant a été démontré :

Lemma f i l t e r l i m _ l o c a l l y _ c a u c h y { T : Type } { U : CompleteSpace } :

f o r a l l { F : ( T -> Prop ) -> Prop } { FF : ProperFilter F } ( f : T -> U ) , (f o r a l l eps : posreal , e x i s t s P : T -> Prop ,

F P /\ f o r a l l u v : T , P u -> P v -> ball ( f u ) eps ( f v )) <-> e x i s t s y , filterlim f F ( locally y ).

Dans le cas où F est le filtre sur les entiers eventually, ce lemme correspond exactement à la caractérisa-tion de la complétude (séquentielle) par les suites de Cauchy. En d’autres termes, toute suite de Cauchy admet une limite. La réciproque est vraie dans tout espace uniforme.

L’espace uniforme des fonctions

Comme cela a été évoqué tout au long de cette section, le choix des espaces uniformes vient de la nécessité d’exprimer la convergence dans les espaces de fonction. L’espace uniforme des fonctions à valeurs dans un espace uniforme a été défini avec le prédicat ball suivant :

UniformSpace ball

CompleteSpace lim

Figure4.1 – Les espaces uniformes dans la bibliothèque Coquelicot. Les boîtes de cette figure représentent les différents espaces formalisés, avec leur nom et les éléments à fournir par l’utilisateur. La flèche −→ signifie “fait partie de la définition de”.

D e f i n i ti o n fct_ball ( T : Type ) ( U : UniformSpace ) ( x : T -> U ) ( eps : R ) ( y : T -> U ) :=

f o r a l l t : T , ball ( x t ) eps ( y t ).

L’ensemble des fonctions à valeurs dans un espace complet définit également un espace complet. La limite d’un filtre F sur les fonctions est définie par la fonction qui associe à chaque point t de l’espace de départ la limite de la projection du filtre F par rapport à t :

D e f i n i ti o n lim_fct { T : Type } { U : CompleteSpace } ( F : (( T -> U ) -> Prop ) -> Prop ) ( t : T ) :=

lim (fun P = > F ( fun g = > P ( g t ))).

Résumé des espaces uniformes

La construction des espaces permettant d’exprimer la convergence dans la bibliothèque Coquelicot est résumée dans la figure 4.1, extraite de la figure 4.3 page 73. Les espaces uniformes U sont définis à partir d’un prédicat ball : U -> R -> U -> Prop permettant de représenter les boules. Les espaces complets sont quant à eux définis à partir d’un espace uniforme U et d’une fonction totale lim : ((U -> Prop) -> Prop) -> Urenvoyant la limite des filtres de Cauchy. Ces espaces permettent de construire facilement la famille de filtres locally : U -> (U -> Prop) -> Prop qui représente les voisinages.