4.12 Do cases

proof attempt by case

Syntax

  dc(f)
  dc(v,E)

with:

Use

This command enables the starting up of a proof by cases.
If the goal to be proved is G and the parameter supplied to dc is X:

Example 1

Let us consider the following situation:


 
    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  
 


Due to the presence of the two hypotheses xx : 1..5 => yy = 10 and xx : 6..10 => yy = 1, the user decides to start a proof by case , for the predicate xx : 1..5.


 
     PRI> dc(xx: 1..5)  
 


The first goal processed is thus:


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


The prover will therefore attempt to prove the current goal, first under the hypothesis xx : 1..5. To do this, the user applies the command pr (see chapter 4.38 page §).


 
    PRI> pr  
 


The goal is proved by the automatic prover. The other case to be processed is thus not(xx : 1..5).


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


The user starts the automatic prover again.


 
    PRI> pr  
 


The PO is proved and its command line is:


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


Example 2

We will now consider proof by case, for an enumerated set.

Given the following situation:


 
    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)  
 


The user starts a proof by cases for every value of xx, which belongs to enumerated set ENS.


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


the interactive prover will thus launch 5 successive proofs:


 
    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)