• Aucun résultat trouvé

Preuve de la propriété matroïdale de non-décroissance

Chapitre I.2 La théorie des matroïdes : une approche combinatoire crypto-

2.2 De la géométrie synthétique vers les rangs

2.2.3 Preuve de la propriété matroïdale de non-décroissance

Nous illustrons notre méthodologie pour prouver les axiomes de la théorie des matroïdes à partir des axiomes de la géométrie synthétique en détaillant la démonstration de la propriété de non-décroissance.

Lemme I.2.4 (A2R2-R3). Rk-NonDecreasing, ∀ X ⊆ Y ⊆ E, rk(X) ≤ rk(Y )

La caractérisationI.2.13indique que la fonction de rang peut prendre cinq valeurs différentes (de 0 à 4) en fonction de la dimension de l’ensemble de points considéré. Cette caractérisation mène à 25 cas différents lorsque nous effectuons une induction structurelle sur les variables X et Y qui sont des listes. Premier cas : 0 ≤ 0, deuxième cas : 0 ≤ 1, etc. En utilisant, la tactique

I.2.17qui calcule automatiquement l’inclusion entre listes, nous éliminons directement 15 cas où X ⊆ Y . Pour prouver les buts restants, nous mettons en évidence une contradiction au sein du contexte pour que la tactique my_inAS I.2.17 arrive à traiter cette configuration. Par exemple, nous montrons clairement qu’une droite ne peut pas contenir un plan rendant l’inégalité suivante impossible : 3 ≤ 2.

Pour automatiser les preuves dans cet environnement, nous employons le prédicat InA qui dénote la relation d’inclusion sur un type A dans le cas des listes relativement à une égalité issue des setoïdes. Dans notre contexte, nous utilisons notre égalité paramétrique [==] qui diffère de l’égalité classique de Coq. Nous devons donc spécifier pour quel prédicat les réécritures sont autorisées en utilisant cette égalité. Le prédicat InA accepte seulement les réécritures si l’égalité fournie est une relation d’équivalence. Nous détaillons ce mécanisme dans la sous-section suivante. Nous intégrons la manipulation automatique de ce prédicat InA dans la tactique my_inAS

I.2.17 qui fournit un traitement analogue à fsetdecide dans le cas où les ensembles sont repré-sentés sous forme de listes tout en étant bien plus efficace en temps d’exécution. Effectivement,

54 I.2. La théorie des matroïdes : une approche combinatoire cryptomorphique

toutes les couches abstraites de la librairie Containers [Les11] sont éliminées facilitant l’unifica-tion des types et la vérifical’unifica-tion du terme de preuve.

(* Tactique simple pour du calcul d’inclusion *)

Ltac my_inAS := intuition;unfold inclA in *;unfold equivlistA in *; repeat match goal with

|[H : _ |- _] => progress [intro|intros] |[H : _ |- _] => try split;intuition

|[H : InA eq _ (?P :: _ ) |- _] => inversion H;clear H |[H : _ = _ |- _] => rewrite <-H

|[H : InA eq _ nil |- _] => inversion H | [H : InA eq ?P ( ?Q :: ?R ) -> _ |- _] => let T:=fresh in assert(T : InA eq P (Q :: R)) by (my_inAS);

generalize (H T);clear H;clear T;intro end.

Table I.2.17 – Tactique simple pour du calcul automatique d’inclusion.

La première version de cette tactique permet de traiter les calculs d’inclusions d’une liste dans une autre lorsqu’aucune opération d’intersection ou d’union entre listes n’est effectuée. Il est possible de l’étendre pour prendre en compte ces deux cas supplémentaires mais les perfor-mances de cette dernière se dégradent considérablement. L’inconvénient majeur de la tactique my_inAS est l’utilisation de la tactique intuition qui est une primitive de haut-niveau regrou-pant plusieurs stratégies de résolution, elle n’est donc pas spécifiquement conçue pour démontrer automatiquement nos buts. En effet, certaines des stratégies inclues dans cette tactique ne servent pas à faire avancer la démonstration dans notre cadre géométrique. Elle a aussi l’inconvénient de conserver les modifications des hypothèses lorsqu’elle progresse dans ces différentes stratégies ce qui n’est pas souhaitable dans certaines démonstrations où une trop grande décomposition complique la terminaison de la preuve. Pour corriger ces problèmes, nous proposons une version étendue my_inAO I.2.18 qui, selon le motif identifié, applique un lemme intermédiaire adapté. Cette nouvelle tactique se découpe en 3 parties :

• La tactique solve_equivlistA récursive permettant de mettre en évidence l’inclusion d’un élément dans une liste. Exemple d’application de cette tactique :

inA B (A :: C :: C :: B :: A :: nil)

• La tactique inv_unifA récursive qui simplifie le contexte au maximum en décomposant les hypothèses sur les listes impliquant aussi des intersections et des unions. Exemple d’applica-tion de cette tactique, les notad’applica-tions list_inter et ++ désignent respectivement l’intersecd’applica-tion et l’union entre deux listes :

inclA (B :: nil)(list_inter(A :: C :: B :: nil)(C :: B :: nil ++ A :: nil)) ⇒ inA B (A :: C :: B :: nil) ∧ inA B (C :: B :: nil ++ A :: nil) ⇒

inA B (A :: C :: B :: nil) ∧ (inA B (C :: B :: nil) ∨ inA B (A :: nil)) • La tactique my_inAO qui teste si la combinaison des deux tactiques précédentes aboutit à

une résolution de l’inclusion ou à l’équivalence entre deux listes. Exemple d’application de cette tactique :

2. Deux approches cryptomorphiques 55

(Tactique optimisée pour du calcul d’inclusion *) Ltac solve_equivlistA :=

first[assumption | apply InA_cons_hd;reflexivity | apply InA_cons_tl;solve_equivlistA]. Ltac inv_unifA := unfold inclA in *; try split; intros;

repeat match goal with

| [H : InA eq _ _ |- _] => inversion H;clear H | [H: _ = _ |- _] => rewrite <- H in *;

try solve [contradiction|apply eq_sym in H;contradiction];clear H | [H : InA eq _ nil |- _] => inversion H

| [H : InA eq _ (_++_) |- _] => apply InA_app_iff in H; destruct H | [H :_ |- InA eq _ (_++_) ] => apply InA_app_iff

| [H : InA eq _ (list_inter _ _) |- _] =>

apply list_inter_split_bis in H; destruct H

| [H : _ |- InA eq _ (list_inter _ _)] => apply list_inter_split_reverse | [H : InA eq ?P ( ?Q :: ?R ) -> _ |- _] => let T:=fresh in

assert(T : InA eq P (Q :: R)) by (solve_equivlistA); generalize (H T);clear H;clear T;intro

end.

Ltac my_inAO := solve[inv_unifA ; first[solve_equivlistA]].

Table I.2.18 – Tactique optimisée pour du calcul automatique d’inclusion.

Pour revenir à la démonstration de la propriété matroïdale de non-décroissance, nous pou-vons maintenant présenter dans la TableI.2.19 le schéma de cette preuve avec les tactiques qui ont été présentées ci-dessus. Pour rappel, cette preuve comporte 25 cas dont 15 sont directement simplifiés par l’utilisation de la tactiqueI.2.16. Les 10 buts restant correspondant à des situations contradictoires sont prouvés grâce à la mise en évidence d’une contradiction dans les hypothèses.

(* Preuve de la propriété matroïdale de non-décroissance *) Lemma matroid2 : forall e e’, inclA eq e e’ -> rkl(e)<=rkl(e’). Proof.

intros;case_eq e;case_eq e’; (* pré-traitement & inductions *)

try my_inAO;my_rank. (* simplification des 15 cas triviaux 0 <= 1, 0 <= 2 ... *) my_rank;subst;unfold inclA in *;assert(HH := H p);my_inAO. (* cas trivial 1 <= 0 *) unfold rkl;my_rank;subst. (* pré-traitement & simplification pour les cas non triviaux *) assert( HH := contains_four_non_coplanar_points_sublist [...];my_rank. (* cas 4 <= 0 *) assert( HH := contains_four_non_coplanar_points_sublist [...];my_rank. (* cas 4 <= 1 *) assert( HH := contains_four_non_coplanar_points_sublist [...];my_rank. (* cas 4 <= 2 *) assert( HH := contains_four_non_coplanar_points_sublist [...];my_rank. (* cas 4 <= 3 *) assert( HH := contains_three_non_collinear_points_sublist [...];my_rank. (* cas 3 <= 0 *) assert( HH := contains_three_non_collinear_points_sublist [...];my_rank. (* cas 3 <= 1 *) assert( HH := contains_three_non_collinear_points_sublist [...];my_rank. (* cas 3 <= 2 *) assert( HH := contains_two_distinct_points_sublist [...];my_rank. (* cas 2 <= 0 *)

assert( HH := contains_two_distinct_points_sublist [...];my_rank. (* cas 2 <= 1 *) Qed.

56 I.2. La théorie des matroïdes : une approche combinatoire cryptomorphique

2.2.4 Implantation Coq

Le lemme de sous-modularité, ∀ X, Y ⊆ E, rk(X ∪ Y ) + rk(X ∩ Y ) ≤ rk(X) + rk(Y ), est la propriété la plus difficile à démontrer à cause de la gestion des intersections et des unions. Cette preuve contient de nombreux cas non triviaux qui doivent être décomposés dans des lemmes in-termédiaires comme illustré dans la TableI.2.20. Le premier exemple indique que si deux droites sont confondues, il est possible de représenter le problème par une unique droite contenant tous les points appartenant aux deux droites. Le deuxième spécifie qu’une droite m peut être incluse dans un plan l pour former un unique objet. Le troisième indique que si deux plans sont confon-dus, l’union de ces deux plans engendre un plan qui les contient tous les deux. Tous ces lemmes, décrivant des résultats d’intersection et d’union entre différents objets, sont des configurations classiques de la géométrie synthétique qui peuvent être déduit à partir des axiomes.

(* L’union de deux droites confondues génère une droite *) Lemma matroid3_rk2_rk2_interrk2_to_unionrk2 : forall l m, rkl l = 2 -> rkl m = 2 -> rkl (inter l m) = 2 -> rkl (l ++ m) = 2.

(* L’union d’un plan et d’une droite de ce plan génère un plan *) Lemma matroid3_rk3_rk2_interrk2_to_unionrk3 : forall l m, rkl l = 3 -> rkl m = 2 -> rkl (list_inter l m) = 2 -> rkl (l ++ m) = 3.

(* L’union de deux plans confondus génère un plan *) Lemma matroid3_rk3_rk3_interrk3_to_unionrk3 : forall l m, rkl l = 3 -> rkl m = 3 -> rkl (list_inter l m) = 3 -> rkl (l ++ m) = 3.

Table I.2.20 – Lemmes intermédiaires sur les cas non triviaux de la sous-modularité. Finalement, la difficulté principale pendant l’implantation provient de la gestion du méca-nisme généralisé de réécriture introduit par l’utilisation des setoïdes avec l’égalité paramétrique. Quand nous définissons un nouveau prédicat en accord avec une égalité qui n’est pas incluse dans la librairie standard, nous devons formaliser une règle autorisant l’application de cette éga-lité pour effectuer des réécritures dans les prédicats. Dans la terminologie Coq, on parle ici de morphisme, nous fournissons à travers ce morphisme la preuve qu’il est possible d’utiliser notre relation d’équivalence dans ce prédicat. Donc, pour toute définition impliquant le type point, il sera nécessaire d’établir un morphisme semblable à I.2.21. Cela garantit que notre égalité est compatible et cohérente avec la définition dans laquelle elle est utilisée. Il est dès lors possible de substituer un ensemble X par un ensemble Y directement dans la définition du rang.

2. Deux approches cryptomorphiques 57

(* Morphisme pour le prédicat rang *)

Instance rank_morph : Proper (@equivlistA Point eq => (@Logic.eq nat)) rkl. Proof.

[...] Qed.

Table I.2.21 – Exemple de morphisme.

Ce morphisme indique que le prédicat rkl doit utiliser l’égalité classique de Coq pour les ré-écritures si les listes en paramètre sont équivalentes. En dépliant le prédicat Proper, nous devons prouver le lemme suivant où equivlist indique que deux listes sont égales :

Lemme I.2.5 (rank_morph). ∀ x y : list Point, equivlist x y → rkl x = rkl y

Toutes les preuves de la géométrie synthétique vers les rangs suivent le même modèle. Une fois que la caractérisation intermédiaire est établie, il suffit de déplier et simplifier à l’aide de la tactique I.2.16 avant d’utiliser des lemmes intermédiaires caractérisant une situation typique en géométrie synthétique ou mettre en évidence des contradictions dans les hypothèses en s’aidant de la tactique I.2.18.