4.12 Do cases

Tentative de preuve par cas

Syntaxe

  dc(f)
  dc(v,E)
avec :

Utilisation

Cette commande permet le déclenchement d’une preuve par cas.
Si le but à prouver est B :

Exemple 1

Soit la situation suivante :


 
    Hypothesis  
        xx: 1..10 &  
        yy: 1..10 &  
        zz: 1..100 &  
        xx: 1..5 => yy = 10 &  
        xx: 6..10 => yy = 1 &  
        yy*xx<=100 & xx*yy<=100 or (yy*yy<=100 & yy*yy<=100)  
    Goal  
       xx+yy-1: 1..100  
 


Du fait de la présence des deux hypothèses xx : 1..5 => yy = 10 et xx : 6..10 => yy = 1, l’opérateur décide de lancer une preuve par cas, pour le prédicat xx : 1..5.


 
     PRI> dc(xx: 1..5)  
 


Le premier but traité est donc :


 
     Goal  
        xx: 1..5 => xx+yy-1: 1..100  
 


Le prouveur va donc tenter de prouver le but courant, d’abord sous l’hypothèse xx : 1..5. Pour cela, l’opérateur applique la commande pr (voir chapitre 4.38 page §).


 
    PRI> pr  
 


Le but est prouvé par le prouveur automatique. L’autre cas à traiter est donc not(xx : 1..5).


 
    Goal  
        not(xx: 1..5) => xx+yy-1: 1..100  
 


L’opérateur lance de nouveau le prouveur automatique.


 
    PRI> pr  


La PO est prouvée et sa ligne de commande est :


 
        Force(0) &  
          dd &  
            dc(xx: 1..5) &  
              pr &  
              pr &  
          Next  


Exemple 2

Considérons maintenant la preuve par cas, dans le cas d’un ensemble énuméré.
Soit la situation suivante :


 
    Hypothesis  
        ENS = {e1,e2,e3,e4,e5} &  
      ENS: FIN(NATURAL*{ENS.enum}) &  
      not(ENS = {}) &  
        xx: ENS &  
        xx: {e1,e2,e3,e4}  
    Goal  
        not(xx = e5)  
 


L’opérateur lance une preuve par cas, relativement à xx, qui appartient à l’ensemble énuméré ENS.


 
PRI> dc(xx,ENS)  
Do Cases on Enumerated: {5}\/{4}\/{3}\/{2}\/{1}  
 


Le prouveur interactif va donc déclencher 5 preuves successives :


 
    Goal  
        xx = e5 => not(xx = e5)  
 
    Goal  
        xx = e4 => not(xx = e5)  
 
    Goal  
        xx = e3 => not(xx = e5)  
 
    Goal  
        xx = e2 => not(xx = e5)  
 
    Goal  
        xx = e1 => not(xx = e5)