• Aucun résultat trouvé

Le choix du paramètre start _ rank

10.2 Résultats

10.2.3 Le choix du paramètre start _ rank

Figure10.3 – L’invariant obtenu avec Cycle1

10.2.3 Le choix du paramètre start_rank

Nous avons vu dans le chapitre 9, que la détection de boucles est enclenchée lorsque Rank_max est supérieur au paramètre start_rank. Nous avons mené quelques expérimentations pour déterminer la valeur optimale destart_rank pour un théorème donné. Nous avons donc considéré deux théorèmes de tailles diff é-rentes. Nous avons lancé SuperInd avec différentes valeurs de start_rank et nous avons mesuré le temps d’exécution, le nombre d’appels àCycle1 etCycle2 et le nombre de clauses générées.

Le tableau de la figure 10.5 correspond aux tests réalisés avec l’additionneur PRA (3 + 4 = 7). Nous avons choisi ce théorème pour sa grande taille (plus de 105

clauses générées). Nous pouvons remarquer, que la valeur optimale destart_rank est3 pour les deux algorithmes. Les résultats se dégradent pour des valeurs infé-rieurs où supéinfé-rieurs à3 même si cette dégradation est plus faible pour des valeurs supérieurs à3. Nous pouvons, aussi, remarquer que le nombre d’appels à Cycle1

et Cycle2 est très grand pour les valeurs de start_rank inférieures à 3, ce qui

augmente le temps d’exécution. Ce nombre d’appels est très grand car les clauses qui constituent le cycle ne sont pas encore toutes générées et comme l’appel se fait à chaque sélection d’une clause active et que le nombre de clauses générées au début de la procédure n’est pas très grand, nous avons un bon nombre d’appels qui sont inutiles. Notez aussi que que le nombre de clauses générées augmente à partir de la valeur 3 alors que toutes les clauses du cycle sont déjà générées (car nous avons déjà détecté un cycle avec102397clauses générées). Cela est dû au fait que la détection de boucles est enclenchée lorsque toutes les clauses de la forme

[� | n succk(0)] (pour tout k Rank_max) sont générées. Par exemple, si R est leRang_maxà partir duquel toutes les clauses du cycle sont générées, comme la condition Rank_max > start_rank doit être vérifiée, il faudra dériver toutes les clauses de la forme [� | n succk(0)] R k start_rank pour lancer la détection de boucles. Cela explique aussi l’augmentation du nombre d’appels à

S_init ~: (1633: [ $MplusP$(v0) | -$M$(v0) if n = s(v0) ]. 1632: [ T2(v0) if n = s(v0) ]. 1631: [ S3(v0) if n = s(v0) ]. 1630: [ -$T1$(v0) if n = s(v0) ]. 1629: [ -$P$(v0) if n = s(v0) ]. 1538: [ -$MplusP$(v0) | $M$(v0) if n = s(v0) ]. 1518: [ -$T1$$(v0) if n = s(v0) ]. 1458: [ $S3$(v0) if n = s(v0) ]. 1416: [ $T2$(v0) if n = s(v0) ]. 984: [ S2(v0) if n = s(v0) ]. 983: [ $S2$(v0) if n = s(v0) ]. 976: [ S1(v0) if n = s(v0) ]. 975: [ $S1$(v0) if n = s(v0) ]. 111: [ -$P$$(v0) if n = s(v0) ]. )

Figure10.4 – L’invariant obtenu avec Cycle2

les cycles jusqu’au Rank_max sont testés et lorsqu’on augmenteRank_max, on augmente le nombre de cycles possibles. Ces résultats confortent aussi le fait que

Cycle1 est plus efficace que Cycle2, car le temps d’exécution de Cycle2 est

presque de l’ordre de trois fois le temps d’exécution deCycle1, lorsque le nombre d’appels est très grand.

Le tableau de la figure 10.6 correspond aux tests réalisés sur le théorème attes-tant de la symétrie de l’égalité. Ce théorème est de petite taille et les résultats ne sont pas significatifs car le nombre de clauses n’est pas très grand, même si les ré-sultats correspondent à l’allure générale du premier tableau c’est-à-dire le nombre de clauses générées, le temps d’exécution et le nombre d’appels à l’algorithme du point fixe augmentent avec l’augmentation de la valeurs destart_rank.

Pour conclure, la valeur de start_rank ne doit pas être très petite, car l’aug-mentation du nombre d’appels à l’algorithme du point fixe peut s’avérer très coû-teuse. Elle ne doit pas être très grande non plus car, d’une part, le nombre de cycles potentiels augmentent, et d’autre part, le nombre de clauses générées est plus important.

10.2.4 Détection de la satisfaisabilité

Additionneur PRA (3 + 4 = 7) valeurs de

start_rank

Cycle1 Cycle2

nombre # de clauses Temps nombre # de clauses Temps d’appels générées d’exécution (s) d’appels générées d’exécution (s)

1 8953 102397 7.26 8953 102397 23.44 2 5284 102397 6 5284 102397 21.51 3 10 102397 1.06 10 102397 1.34 4 13 166434 1.67 13 166434 1.96 5 16 245548 2.44 16 245548 2.75 6 19 339739 3.36 19 339739 3.74 7 22 449007 4.47 22 449007 4.84

Figure 10.5 – Résultats des tests correspondant aux différentes valeurs de

start_rank pour un théorème de grande taille

n1≥n2∧n2≥n1⇒n1=n2 valeurs de

start_rank

Cycle1 Cycle2

nombre # de clauses Temps nombre # de clauses Temps d’appels générées d’exécution (s) d’appels générées d’exécution (s)

1 3 199 0.01 3 199 0.01

2 4 255 0.01 4 255 0.01

3 5 316 0.01 5 316 0.01

8 10 696 0.02 10 696 0.02

10 12 883 0.02 12 883 0.02

Figure 10.6 – Résultats des tests correspondant aux différentes valeurs de

Exemple 119 Cet exemple est adapté de [20]. L’ensemble de clauses est le suivant : (1) P(f(a,�)n+1.b) (2) ¬P(c) (3) f(a, b)�d (4) f(a, d)�c

Le terme f(a,�)n.b est un terme avec exposant entier (au sens de [33]), dénotant le terme f(a, f(. . . , f(a, b). . .)), avec n occurrences de f. La clause 1 est ensuite codée avec l’ensemble des n-clauses suivantes :

(5) S(0) =f(a, b) (6) S(s(x)) =f(a, S(x)) (7) [P(S(x))��V|n �x]

S(n) encode le terme f(a,�)b.n+ 1. A noter que la variable n est quantifiée exis-tentiellement (à la différence de [20] où elle est quantifiée universellement), ce qui

explique que l’ensemble est satisfaisable.

Exemple 120 Nous construisons des exemples satisfaisables à partir des schémas de formules propositionnelles. Si nous considérons l’exemple de l’additionneur où on montre la commutativité nous avons un schéma qui calcule X+Y et un autre qui calculeY +X et la formule but vérifie l’égalité des deux résultats. Il suffit donc d’enlever la formule but pour obtenir un exemple satisfaisable. Nous procédons de la même manière pour les autres exemples insatisfaisables testés ci-dessus.

Lafigure 10.7 résume les résultats obtenus pour les exemples satisfaisables dans un tableau contenant respectivement l’exemple testé, la valeur possible du paramètre et le temps d’exécution.

Exemples Valeur possible pourn Temps d’exécution (s)

Additionneur PPR Commutativité 0 0.01

Additionneur PPR Associativité 0 0.02

Equivalence entre additionneurs PPR et PRA 0 0.01

Exemple 116 (Even) s(0) 0.01

Exemple 119 (schémas de termes) s(0) 0.01

Figure10.7 – Résumé des exemples satisfaisables

La première remarque que nous pouvons faire est que les résultats n’indiquent pas le nombre d’appels à l’algorithme du point fixe. Cela est dû au fait que la preuve de satisfiabilité ne nécessite pas la détection de boucle : elle est réalisée

d’exécution (s) à Cycle1 générées de l’invariant

Additionneur PRA (A+ 0 =A) 0.01 1 255 3

Additionneur PRA (commutativité) 0.02 1 963 4

Additionneur PRA (associativité) 1.72 1 142527 10 Additionneur PRA (3 + 4 = 7) 2.16 883 102397 7 Unicité du résultat (Additionneur PRA) 0.03 1 1885 4

Additionneur PPR (A+ 0 =A) 0.77 1 142692 3

Additionneur PPR (commutativité) 0.09 1 3487 4

Additionneur PPR (associativité) 0.67 1 52066 10 Equivalence entre un additionneur PPR

et un additionneur PRA 0.04 1 1855 4

. . .

Figure10.8 – Résumé des tests pour Cycle1 avec la méthode probabiliste

en saturant l’ensemble de clauses pour une valeur donnée du paramètre, ce qui peut-être réalisé en utilisant les règles d’inférence de Prover9. Nous remarquons aussi que tous les exemples avec l’additionneur ont des modèles où n= 0 même si toutes les valeurs de N sont possibles, ce qui est un simple choix (de renvoyer la première valeur trouvée). Il suffit par exemple d’ajouter la clausen�= 0, pour que SuperInd retourne n = s(0). Le même raisonnement est appliqué pour l’exemple 116, où tous les nombres impairs sont des valeurs possibles pourn.