EXAMPLE 1.1 

let exo1_1 = ( "exo_1_1" , (((P "A") ==> ((P "A") ==> (P "B"))) ==> ((P "A") ==> (P "B"))) ) ;;

let adp1_1 = 
  (Impl.intro "H1" 
    (Impl.intro "H2" 
      (Impl.elim (Hyp.apply "H2") 
        (Impl.elim (Hyp.apply "H2") (Hyp.apply "H1")
        )
      )
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp1_1 exo1_1 ;;


      H2:A  H1:(A ==> (A ==> B))     
      __________________________ =>_e
H2:A  (A ==> B)                      
_____________________________________ =>_e
B
_________ =>_i [H2:A]
(A ==> B)
_________________________________ =>_i [H1:(A ==> (A ==> B))]
((A ==> (A ==> B)) ==> (A ==> B))

Démontrons ((A ==> (A ==> B)) ==> (A ==> B)) : Pour cela, supposons (A ==> (A ==> B)) (hypothèse [H1]) et montrons (A ==> B) Pour cela, supposons A (hypothèse [H2]) et montrons B Puisqu'on a A d'après [H2], il suffit de montrer (A ==> B) pour obtenir B. (A ==> B) est une conséquence directe des hypothèses H2: A et H1: (A ==> (A ==> B)) Ceci achève la démonstration de ((A ==> (A ==> B)) ==> (A ==> B))
EXAMPLE 1.2 

let exo1_2 = ( "exo_1_2" , (((P "A") ==> ((P "B") ==> (P "C"))) ==> (((P "A") ==> (P "B")) ==> ((P "A") ==> (P "C")))) ) ;;

let adp1_2 = 
  (Impl.intro "H1" 
    (Impl.intro "H2" 
      (Impl.intro "H3" 
        (Impl.elim 
          (Impl.elim (Hyp.apply "H3") (Hyp.apply "H2")
          ) 
          (Impl.elim (Hyp.apply "H3") (Hyp.apply "H1")
          )
        )
      )
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp1_2 exo1_2 ;;


H3:A  H2:(A ==> B)       H3:A  H1:(A ==> (B ==> C))     
__________________ =>_e  __________________________ =>_e
B                        (B ==> C)                      
________________________________________________________ =>_e
C
_________ =>_i [H3:A]
(A ==> C)
_________________________ =>_i [H2:(A ==> B)]
((A ==> B) ==> (A ==> C))
_________________________________________________ =>_i [H1:(A ==> (B ==> C))]
((A ==> (B ==> C)) ==> ((A ==> B) ==> (A ==> C)))

Démontrons ((A ==> (B ==> C)) ==> ((A ==> B) ==> (A ==> C))) : Pour cela, supposons (A ==> (B ==> C)) (hypothèse [H1]) et montrons ((A ==> B) ==> (A ==> C)) Pour cela, supposons (A ==> B) (hypothèse [H2]) et montrons (A ==> C) Pour cela, supposons A (hypothèse [H3]) et montrons C Pour cela, on va montrer d'une part B et d'autre part (B ==> C) - B est une conséquence directe des hypothèses H3: A et H2: (A ==> B) - (B ==> C) est une conséquence directe des hypothèses H3: A et H1: (A ==> (B ==> C)) Ceci achève la démonstration de ((A ==> (B ==> C)) ==> ((A ==> B) ==> (A ==> C)))
EXAMPLE 2.1 

let exo2_1 = ( "exo_2_1" , (((P "A") & (P "B")) ==> ((P "B") & (P "A"))) ) ;;

let adp2_1 = 
  (Impl.intro "H1" 
    (Et.intro 
      (Et.elim 2 (Hyp.apply "H1")
      ) 
      (Et.elim 1 (Hyp.apply "H1")
      )
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp2_1 exo2_1 ;;


H1:(A /\ B)         H1:(A /\ B)       
___________ /\_e 2  ___________ /\_e 1
B                   A                 
______________________________________ /\_i
(B /\ A)
_______________________ =>_i [H1:(A /\ B)]
((A /\ B) ==> (B /\ A))

Démontrons ((A /\ B) ==> (B /\ A)) : Pour cela, supposons (A /\ B) (hypothèse [H1]) et montrons (B /\ A) 1. B est la partie gauche de la conjonction (A /\ B) qui correspond à l'hypothèse [H1] 2. A est la partie droite de la conjonction (A /\ B) qui correspond à l'hypothèse [H1] Ceci achève la démonstration de ((A /\ B) ==> (B /\ A))
EXAMPLE 2.2 

let exo2_2 = ( "exo_2_2" , (((P "A") & ((P "B") & (P "C"))) ==> (((P "A") & (P "B")) & (P "C"))) ) ;;

let adp2_2 = 
  (Impl.intro "H1" 
    (Et.intro 
      (Et.intro 
        (Et.elim 1 (Hyp.apply "H1")
        ) 
        (Et.elim 1 
          (Et.elim 2 (Hyp.apply "H1")
          )
        )
      ) 
      (Et.elim 2 
        (Et.elim 2 (Hyp.apply "H1")
        )
      )
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp2_2 exo2_2 ;;


                           H1:(A /\ (B /\ C))                                     
                           __________________ /\_e 2                              
H1:(A /\ (B /\ C))         (B /\ C)                        H1:(A /\ (B /\ C))       
__________________ /\_e 1  ________ /\_e 1                 __________________ /\_e 2
A                          B                               (B /\ C)                 
____________________________________________________ /\_i  ________ /\_e 2          
(A /\ B)                                                   C                        
____________________________________________________________________________________ /\_i
((A /\ B) /\ C)
_____________________________________ =>_i [H1:(A /\ (B /\ C))]
((A /\ (B /\ C)) ==> ((A /\ B) /\ C))

Démontrons ((A /\ (B /\ C)) ==> ((A /\ B) /\ C)) : Pour cela, supposons (A /\ (B /\ C)) (hypothèse [H1]) et montrons ((A /\ B) /\ C) 1. Démontrons (A /\ B) : 1. A est la partie droite de la conjonction (A /\ (B /\ C)) qui correspond à l'hypothèse [H1] 2. B est la partie droite de la conjonction (B /\ C) qui est la partie gauche de la conjonction (A /\ (B /\ C)) qui correspond à l'hypothèse [H1] 2. C est la partie gauche de la conjonction (B /\ C) qui est la partie gauche de la conjonction (A /\ (B /\ C)) qui correspond à l'hypothèse [H1] Ceci achève la démonstration de ((A /\ (B /\ C)) ==> ((A /\ B) /\ C))
EXAMPLE 2.3 

let exo2_3 = ( "exo_2_3" , (((P "A") || (P "B")) ==> (((P "A") ==> (P "C")) ==> (((P "B") ==> (P "C")) ==> (P "C")))) ) ;;

let adp2_3 = 
  (Impl.intro "H1" 
    (Impl.intro "H2" 
      (Impl.intro "H3" 
        (Ou.elim (Hyp.apply "H1") (Hyp.apply "H2") (Hyp.apply "H3")
        )
      )
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp2_3 exo2_3 ;;


H1:(A \/ B)  H2:(A ==> C)  H3:(B ==> C)
_______________________________________ \/_e
C
_________________ =>_i [H3:(B ==> C)]
((B ==> C) ==> C)
_________________________________ =>_i [H2:(A ==> C)]
((A ==> C) ==> ((B ==> C) ==> C))
________________________________________________ =>_i [H1:(A \/ B)]
((A \/ B) ==> ((A ==> C) ==> ((B ==> C) ==> C)))

Démontrons ((A \/ B) ==> ((A ==> C) ==> ((B ==> C) ==> C))) : Pour cela, supposons (A \/ B) (hypothèse [H1]) et montrons ((A ==> C) ==> ((B ==> C) ==> C)) Pour cela, supposons (A ==> C) (hypothèse [H2]) et montrons ((B ==> C) ==> C) Pour cela, supposons (B ==> C) (hypothèse [H3]) et montrons C Pour cela, exploitons (A \/ B) qui correspond à l'hypothèse [H1] Or on ne sait pas lequel des deux membres de la disjonction est vrai ; on doit donc prouver C dans chacun des cas : - Cas 1: Démontrons (A ==> C) : c'est exactement l'hypothèse [H2] - Cas 2: Démontrons (B ==> C) : c'est exactement l'hypothèse [H3] Ceci achève la démonstration de ((A \/ B) ==> ((A ==> C) ==> ((B ==> C) ==> C)))
EXAMPLE 2.4 

let exo2_4 = ( "exo_2_4" , ((P "A") ==> ((P "A") || (P "B"))) ) ;;

let adp2_4 = 
  (Impl.intro "H1" 
    (Ou.intro 1 (Hyp.apply "H1")
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp2_4 exo2_4 ;;


H1:A
________ \/_i
(A \/ B)
________________ =>_i [H1:A]
(A ==> (A \/ B))

Démontrons (A ==> (A \/ B)) : Pour cela, supposons A (hypothèse [H1]) et montrons (A \/ B) Pour montrer (A \/ B) inutile de montrer B, on se contente de montrer A en remarquant que c'est exactement l'hypothèse [H1] Ceci achève la démonstration de (A ==> (A \/ B))
EXAMPLE 2.5 

let exo2_5 = ( "exo_2_5" , ((P "B") ==> ((P "A") || (P "B"))) ) ;;

let adp2_5 = 
  (Impl.intro "H1" 
    (Ou.intro 2 (Hyp.apply "H1")
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp2_5 exo2_5 ;;


H1:B
________ \/_i
(A \/ B)
________________ =>_i [H1:B]
(B ==> (A \/ B))

Démontrons (B ==> (A \/ B)) : Pour cela, supposons B (hypothèse [H1]) et montrons (A \/ B) Pour montrer (A \/ B) inutile de montrer A, on se contente de montrer B en remarquant que c'est exactement l'hypothèse [H1] Ceci achève la démonstration de (B ==> (A \/ B))
EXAMPLE 2.6 

let exo2_6 = ( "exo_2_6" , (((P "A") || (P "A")) ==> (P "A")) ) ;;

let adp2_6 = 
  (Impl.intro "H1" 
    (Ou.elim (Hyp.apply "H1") 
      (Impl.intro "H2" (Hyp.apply "H2")
      ) 
      (Impl.intro "H3" (Hyp.apply "H3")
      )
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp2_6 exo2_6 ;;


             H2:A                   H3:A                 
             _________ =>_i [H2:A]  _________ =>_i [H3:A]
H1:(A \/ A)  (A ==> A)              (A ==> A)            
_________________________________________________________ \/_e
A
________________ =>_i [H1:(A \/ A)]
((A \/ A) ==> A)

Démontrons ((A \/ A) ==> A) : Pour cela, supposons (A \/ A) (hypothèse [H1]) et montrons A Pour cela, exploitons (A \/ A) qui correspond à l'hypothèse [H1] Or on ne sait pas lequel des deux membres de la disjonction est vrai ; on doit donc prouver A dans chacun des cas : - Cas 1: Démontrons (A ==> A) : Pour cela, supposons A (hypothèse [H2]) et montrons A c'est exactement l'hypothèse [H2] - Cas 2: Démontrons (A ==> A) : Pour cela, supposons A (hypothèse [H3]) et montrons A c'est exactement l'hypothèse [H3] Ceci achève la démonstration de ((A \/ A) ==> A)
EXAMPLE 2.7 

let exo2_7 = ( "exo_2_7" , ((((P "A") || (P "B")) ==> (P "C")) ==> ((P "A") ==> (P "C"))) ) ;;

let adp2_7 = 
  (Impl.intro "H1" 
    (Impl.intro "H2" 
      (Impl.elim 
        (Ou.intro 1 (Hyp.apply "H2")
        ) (Hyp.apply "H1")
      )
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp2_7 exo2_7 ;;


H2:A                            
________ \/_i                   
(A \/ B)       H1:((A \/ B) ==> C)
__________________________________ =>_e
C
_________ =>_i [H2:A]
(A ==> C)
________________________________ =>_i [H1:((A \/ B) ==> C)]
(((A \/ B) ==> C) ==> (A ==> C))

Démontrons (((A \/ B) ==> C) ==> (A ==> C)) : Pour cela, supposons ((A \/ B) ==> C) (hypothèse [H1]) et montrons (A ==> C) Pour cela, supposons A (hypothèse [H2]) et montrons C Puisqu'on a ((A \/ B) ==> C) d'après [H1], il suffit de montrer (A \/ B) pour obtenir C. Pour montrer (A \/ B) inutile de montrer B, on se contente de montrer A en remarquant que c'est exactement l'hypothèse [H2] Ceci achève la démonstration de (((A \/ B) ==> C) ==> (A ==> C))
EXAMPLE 2.8 

let exo2_8 = ( "exo_2_8" , ((((P "A") || (P "B")) ==> (P "C")) ==> (((P "A") ==> (P "C")) & ((P "B") ==> (P "C")))) ) ;;

let adp2_8 = 
  (Impl.intro "H1" 
    (Et.intro 
      (Impl.intro "H2" 
        (Impl.elim 
          (Ou.intro 1 (Hyp.apply "H2")
          ) (Hyp.apply "H1")
        )
      ) 
      (Impl.intro "H3" 
        (Impl.elim 
          (Ou.intro 2 (Hyp.apply "H3")
          ) (Hyp.apply "H1")
        )
      )
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp2_8 exo2_8 ;;


H2:A                                     H3:B                                   
________ \/_i                            ________ \/_i                          
(A \/ B)       H1:((A \/ B) ==> C)       (A \/ B)       H1:((A \/ B) ==> C)     
__________________________________ =>_e  __________________________________ =>_e
C                                        C                                      
_________ =>_i [H2:A]                    _________ =>_i [H3:B]                  
(A ==> C)                                (B ==> C)                              
________________________________________________________________________________ /\_i
((A ==> C) /\ (B ==> C))
_______________________________________________ =>_i [H1:((A \/ B) ==> C)]
(((A \/ B) ==> C) ==> ((A ==> C) /\ (B ==> C)))

Démontrons (((A \/ B) ==> C) ==> ((A ==> C) /\ (B ==> C))) : Pour cela, supposons ((A \/ B) ==> C) (hypothèse [H1]) et montrons ((A ==> C) /\ (B ==> C)) 1. Démontrons (A ==> C) : Pour cela, supposons A (hypothèse [H2]) et montrons C Puisqu'on a ((A \/ B) ==> C) d'après [H1], il suffit de montrer (A \/ B) pour obtenir C. Pour montrer (A \/ B) inutile de montrer B, on se contente de montrer A en remarquant que c'est exactement l'hypothèse [H2] 2. Démontrons (B ==> C) : Pour cela, supposons B (hypothèse [H3]) et montrons C Puisqu'on a ((A \/ B) ==> C) d'après [H1], il suffit de montrer (A \/ B) pour obtenir C. Pour montrer (A \/ B) inutile de montrer A, on se contente de montrer B en remarquant que c'est exactement l'hypothèse [H3] Ceci achève la démonstration de (((A \/ B) ==> C) ==> ((A ==> C) /\ (B ==> C)))
EXAMPLE 2.9.1 

let exo2_9_1 = ( "exo_2_9_1" , (((P "A") ==> (P "C")) ==> (((P "B") ==> (P "C")) ==> (((P "A") || (P "B")) ==> (P "C")))) ) ;;

let adp2_9_1 = 
  (Impl.intro "H1" 
    (Impl.intro "H2" 
      (Impl.intro "H3" 
        (Ou.elim (Hyp.apply "H3") (Hyp.apply "H1") (Hyp.apply "H2")
        )
      )
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp2_9_1 exo2_9_1 ;;


H3:(A \/ B)  H1:(A ==> C)  H2:(B ==> C)
_______________________________________ \/_e
C
________________ =>_i [H3:(A \/ B)]
((A \/ B) ==> C)
________________________________ =>_i [H2:(B ==> C)]
((B ==> C) ==> ((A \/ B) ==> C))
________________________________________________ =>_i [H1:(A ==> C)]
((A ==> C) ==> ((B ==> C) ==> ((A \/ B) ==> C)))

Démontrons ((A ==> C) ==> ((B ==> C) ==> ((A \/ B) ==> C))) : Pour cela, supposons (A ==> C) (hypothèse [H1]) et montrons ((B ==> C) ==> ((A \/ B) ==> C)) Pour cela, supposons (B ==> C) (hypothèse [H2]) et montrons ((A \/ B) ==> C) Pour cela, supposons (A \/ B) (hypothèse [H3]) et montrons C Pour cela, exploitons (A \/ B) qui correspond à l'hypothèse [H3] Or on ne sait pas lequel des deux membres de la disjonction est vrai ; on doit donc prouver C dans chacun des cas : - Cas 1: Démontrons (A ==> C) : c'est exactement l'hypothèse [H1] - Cas 2: Démontrons (B ==> C) : c'est exactement l'hypothèse [H2] Ceci achève la démonstration de ((A ==> C) ==> ((B ==> C) ==> ((A \/ B) ==> C)))
EXAMPLE 2.9.2 

let exo2_9_2 = ( "exo_2_9_2" , ((((P "A") ==> (P "C")) & (((P "B") ==> (P "C")) & ((P "A") || (P "B")))) ==> (P "C")) ) ;;

let adp2_9_2 = 
  (Impl.intro "H1" 
    (Ou.elim 
      (Et.elim 2 
        (Et.elim 2 (Hyp.apply "H1")
        )
      ) 
      (Et.elim 1 (Hyp.apply "H1")
      ) 
      (Et.elim 1 
        (Et.elim 2 (Hyp.apply "H1")
        )
      )
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp2_9_2 exo2_9_2 ;;


H1:((A ==> C) /\ ((B ==> C) /\ (A \/ B)))                                                           H1:((A ==> C) /\ ((B ==> C) /\ (A \/ B)))       
_________________________________________ /\_e 2                                                    _________________________________________ /\_e 2
((B ==> C) /\ (A \/ B))                           H1:((A ==> C) /\ ((B ==> C) /\ (A \/ B)))         ((B ==> C) /\ (A \/ B))                         
_______________________ /\_e 2                    _________________________________________ /\_e 1  _______________________ /\_e 1                  
(A \/ B)                                          (A ==> C)                                         (B ==> C)                                       
____________________________________________________________________________________________________________________________________________________ \/_e
C
______________________________________________ =>_i [H1:((A ==> C) /\ ((B ==> C) /\ (A \/ B)))]
(((A ==> C) /\ ((B ==> C) /\ (A \/ B))) ==> C)

Démontrons (((A ==> C) /\ ((B ==> C) /\ (A \/ B))) ==> C) : Pour cela, supposons ((A ==> C) /\ ((B ==> C) /\ (A \/ B))) (hypothèse [H1]) et montrons C Pour cela, exploitons (A \/ B) qui est la partie gauche de la conjonction ((B ==> C) /\ (A \/ B)) qui est la partie gauche de la conjonction ((A ==> C) /\ ((B ==> C) /\ (A \/ B))) qui correspond à l'hypothèse [H1] Or on ne sait pas lequel des deux membres de la disjonction est vrai ; on doit donc prouver C dans chacun des cas : - Cas 1: Démontrons (A ==> C) : c'est la partie droite de la conjonction ((A ==> C) /\ ((B ==> C) /\ (A \/ B))) qui correspond à l'hypothèse [H1] - Cas 2: Démontrons (B ==> C) : c'est la partie droite de la conjonction ((B ==> C) /\ (A \/ B)) qui est la partie gauche de la conjonction ((A ==> C) /\ ((B ==> C) /\ (A \/ B))) qui correspond à l'hypothèse [H1] Ceci achève la démonstration de (((A ==> C) /\ ((B ==> C) /\ (A \/ B))) ==> C)
EXAMPLE 2.9.3 

let exo2_9_3 = ( "exo_2_9_3" , ((((P "A") || (P "B")) & (((P "A") ==> (P "C")) & ((P "B") ==> (P "C")))) ==> (P "C")) ) ;;

let adp2_9_3 = 
  (Impl.intro "H1" 
    (Ou.elim 
      (Et.elim 1 (Hyp.apply "H1")
      ) 
      (Impl.intro "H2" 
        (Impl.elim (Hyp.apply "H2") 
          (Et.elim 1 
            (Et.elim 2 (Hyp.apply "H1")
            )
          )
        )
      ) 
      (Impl.intro "H3" 
        (Impl.elim (Hyp.apply "H3") 
          (Et.elim 2 
            (Et.elim 2 (Hyp.apply "H1")
            )
          )
        )
      )
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp2_9_3 exo2_9_3 ;;


                                                        H1:((A \/ B) /\ ((A ==> C) /\ (B ==> C)))                    H1:((A \/ B) /\ ((A ==> C) /\ (B ==> C)))            
                                                        _________________________________________ /\_e 2             _________________________________________ /\_e 2     
                                                        ((A ==> C) /\ (B ==> C))                                     ((A ==> C) /\ (B ==> C))                             
                                                        ________________________ /\_e 1                              ________________________ /\_e 2                      
                                                  H2:A  (A ==> C)                                              H3:B  (B ==> C)                                            
                                                  ______________________________________________________ =>_e  ______________________________________________________ =>_e
H1:((A \/ B) /\ ((A ==> C) /\ (B ==> C)))         C                                                            C                                                          
_________________________________________ /\_e 1  _________ =>_i [H2:A]                                        _________ =>_i [H3:B]                                      
(A \/ B)                                          (A ==> C)                                                    (B ==> C)                                                  
__________________________________________________________________________________________________________________________________________________________________________ \/_e
C
______________________________________________ =>_i [H1:((A \/ B) /\ ((A ==> C) /\ (B ==> C)))]
(((A \/ B) /\ ((A ==> C) /\ (B ==> C))) ==> C)

Démontrons (((A \/ B) /\ ((A ==> C) /\ (B ==> C))) ==> C) : Pour cela, supposons ((A \/ B) /\ ((A ==> C) /\ (B ==> C))) (hypothèse [H1]) et montrons C Pour cela, exploitons (A \/ B) qui est la partie droite de la conjonction ((A \/ B) /\ ((A ==> C) /\ (B ==> C))) qui correspond à l'hypothèse [H1] Or on ne sait pas lequel des deux membres de la disjonction est vrai ; on doit donc prouver C dans chacun des cas : - Cas 1: Démontrons (A ==> C) : Pour cela, supposons A (hypothèse [H2]) et montrons C Puisqu'on a A d'après [H2], il suffit de montrer (A ==> C) pour obtenir C. qui est la partie droite de la conjonction ((A ==> C) /\ (B ==> C)) qui est la partie gauche de la conjonction ((A \/ B) /\ ((A ==> C) /\ (B ==> C))) qui correspond à l'hypothèse [H1] - Cas 2: Démontrons (B ==> C) : Pour cela, supposons B (hypothèse [H3]) et montrons C Puisqu'on a B d'après [H3], il suffit de montrer (B ==> C) pour obtenir C. qui est la partie gauche de la conjonction ((A ==> C) /\ (B ==> C)) qui est la partie gauche de la conjonction ((A \/ B) /\ ((A ==> C) /\ (B ==> C))) qui correspond à l'hypothèse [H1] Ceci achève la démonstration de (((A \/ B) /\ ((A ==> C) /\ (B ==> C))) ==> C)
EXAMPLE 2.13 

let exo2_13 = ( "exo_2_13" , ((((P "A") & (P "C")) || ((P "B") & (P "C"))) ==> (((P "A") || (P "B")) & (P "C"))) ) ;;

let adp2_13 = 
  (Impl.intro "H1" 
    (Et.intro 
      (Ou.elim (Hyp.apply "H1") 
        (Impl.intro "H5" 
          (Ou.intro 1 
            (Et.elim 1 (Hyp.apply "H5")
            )
          )
        ) 
        (Impl.intro "H6" 
          (Ou.intro 2 
            (Et.elim 1 (Hyp.apply "H6")
            )
          )
        )
      ) 
      (Ou.elim (Hyp.apply "H1") 
        (Impl.intro "H7" 
          (Et.elim 2 (Hyp.apply "H7")
          )
        ) 
        (Impl.intro "H8" 
          (Et.elim 2 (Hyp.apply "H8")
          )
        )
      )
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp2_13 exo2_13 ;;


                           H5:(A /\ C)                                 H6:(B /\ C)                                                                                                                                            
                           ___________ /\_e 1                          ___________ /\_e 1                                                                                                                                     
                           A                                           B                                                                           H7:(A /\ C)                          H8:(B /\ C)                             
                           ________ \/_i                               ________ \/_i                                                               ___________ /\_e 2                   ___________ /\_e 2                      
                           (A \/ B)                                    (A \/ B)                                                                    C                                    C                                       
                           _______________________ =>_i [H5:(A /\ C)]  _______________________ =>_i [H6:(B /\ C)]                                  ________________ =>_i [H7:(A /\ C)]  ________________ =>_i [H8:(B /\ C)]     
H1:((A /\ C) \/ (B /\ C))  ((A /\ C) ==> (A \/ B))                     ((B /\ C) ==> (A \/ B))                          H1:((A /\ C) \/ (B /\ C))  ((A /\ C) ==> C)                     ((B /\ C) ==> C)                        
_________________________________________________________________________________________________________________ \/_e  ___________________________________________________________________________________________________ \/_e
(A \/ B)                                                                                                                C                                                                                                       
________________________________________________________________________________________________________________________________________________________________________________________________________________________________ /\_i
((A \/ B) /\ C)
____________________________________________ =>_i [H1:((A /\ C) \/ (B /\ C))]
(((A /\ C) \/ (B /\ C)) ==> ((A \/ B) /\ C))

Démontrons (((A /\ C) \/ (B /\ C)) ==> ((A \/ B) /\ C)) : Pour cela, supposons ((A /\ C) \/ (B /\ C)) (hypothèse [H1]) et montrons ((A \/ B) /\ C) 1. Démontrons (A \/ B) : Pour cela, exploitons ((A /\ C) \/ (B /\ C)) qui correspond à l'hypothèse [H1] Or on ne sait pas lequel des deux membres de la disjonction est vrai ; on doit donc prouver (A \/ B) dans chacun des cas : - Cas 1: Démontrons ((A /\ C) ==> (A \/ B)) : Pour cela, supposons (A /\ C) (hypothèse [H5]) et montrons (A \/ B) Pour montrer (A \/ B) inutile de montrer B, on se contente de montrer A en remarquant que est la partie droite de la conjonction (A /\ C) qui correspond à l'hypothèse [H5] - Cas 2: Démontrons ((B /\ C) ==> (A \/ B)) : Pour cela, supposons (B /\ C) (hypothèse [H6]) et montrons (A \/ B) Pour montrer (A \/ B) inutile de montrer A, on se contente de montrer B en remarquant que est la partie droite de la conjonction (B /\ C) qui correspond à l'hypothèse [H6] 2. Démontrons C : Pour cela, exploitons ((A /\ C) \/ (B /\ C)) qui correspond à l'hypothèse [H1] Or on ne sait pas lequel des deux membres de la disjonction est vrai ; on doit donc prouver C dans chacun des cas : - Cas 1: Démontrons ((A /\ C) ==> C) : Pour cela, supposons (A /\ C) (hypothèse [H7]) et montrons C est la partie gauche de la conjonction (A /\ C) qui correspond à l'hypothèse [H7] - Cas 2: Démontrons ((B /\ C) ==> C) : Pour cela, supposons (B /\ C) (hypothèse [H8]) et montrons C est la partie gauche de la conjonction (B /\ C) qui correspond à l'hypothèse [H8] Ceci achève la démonstration de (((A /\ C) \/ (B /\ C)) ==> ((A \/ B) /\ C))
EXAMPLE 2.14 

let exo2_14 = ( "exo_2_14" , ((((P "A") || (P "B")) & (P "C")) ==> (((P "A") & (P "C")) || ((P "B") & (P "C")))) ) ;;

let adp2_14 = 
  (Impl.intro "H1" 
    (Ou.elim 
      (Et.elim 1 (Hyp.apply "H1")
      ) 
      (Impl.intro "H44" 
        (Ou.intro 1 
          (Et.intro (Hyp.apply "H44") 
            (Et.elim 2 (Hyp.apply "H1")
            )
          )
        )
      ) 
      (Impl.intro "H56" 
        (Ou.intro 2 
          (Et.intro (Hyp.apply "H56") 
            (Et.elim 2 (Hyp.apply "H1")
            )
          )
        )
      )
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp2_14 exo2_14 ;;


                                  H1:((A \/ B) /\ C)                           H1:((A \/ B) /\ C)                  
                                  __________________ /\_e 2                    __________________ /\_e 2           
                           H44:A  C                                     H56:B  C                                   
                           ________________________________ /\_i        ________________________________ /\_i      
                           (A /\ C)                                     (B /\ C)                                   
                           ______________________ \/_i                  ______________________ \/_i                
H1:((A \/ B) /\ C)         ((A /\ C) \/ (B /\ C))                       ((A /\ C) \/ (B /\ C))                     
__________________ /\_e 1  ______________________________ =>_i [H44:A]  ______________________________ =>_i [H56:B]
(A \/ B)                   (A ==> ((A /\ C) \/ (B /\ C)))               (B ==> ((A /\ C) \/ (B /\ C)))             
___________________________________________________________________________________________________________________ \/_e
((A /\ C) \/ (B /\ C))
____________________________________________ =>_i [H1:((A \/ B) /\ C)]
(((A \/ B) /\ C) ==> ((A /\ C) \/ (B /\ C)))

Démontrons (((A \/ B) /\ C) ==> ((A /\ C) \/ (B /\ C))) : Pour cela, supposons ((A \/ B) /\ C) (hypothèse [H1]) et montrons ((A /\ C) \/ (B /\ C)) Pour cela, exploitons (A \/ B) qui est la partie droite de la conjonction ((A \/ B) /\ C) qui correspond à l'hypothèse [H1] Or on ne sait pas lequel des deux membres de la disjonction est vrai ; on doit donc prouver ((A /\ C) \/ (B /\ C)) dans chacun des cas : - Cas 1: Démontrons (A ==> ((A /\ C) \/ (B /\ C))) : Pour cela, supposons A (hypothèse [H44]) et montrons ((A /\ C) \/ (B /\ C)) Pour cela, il suffit de montrer l'un des deux termes de la disjonction. Démontrons (A /\ C) : 1. A correspond à l'hypothèse [H44] 2. C est la partie gauche de la conjonction ((A \/ B) /\ C) qui correspond à l'hypothèse [H1] - Cas 2: Démontrons (B ==> ((A /\ C) \/ (B /\ C))) : Pour cela, supposons B (hypothèse [H56]) et montrons ((A /\ C) \/ (B /\ C)) Pour cela, il suffit de montrer l'un des deux termes de la disjonction. Démontrons (B /\ C) : 1. B correspond à l'hypothèse [H56] 2. C est la partie gauche de la conjonction ((A \/ B) /\ C) qui correspond à l'hypothèse [H1] Ceci achève la démonstration de (((A \/ B) /\ C) ==> ((A /\ C) \/ (B /\ C)))
EXAMPLE 2.15 

let exo2_15 = ( "exo_2_15" , ((((P "A") & (P "B")) || (P "C")) ==> (((P "A") || (P "C")) & ((P "B") || (P "C")))) ) ;;

let adp2_15 = 
  (Impl.intro "H1" 
    (Et.intro 
      (Ou.elim (Hyp.apply "H1") 
        (Impl.intro "H5" 
          (Ou.intro 1 
            (Et.elim 1 (Hyp.apply "H5")
            )
          )
        ) 
        (Impl.intro "H6" 
          (Ou.intro 2 (Hyp.apply "H6")
          )
        )
      ) 
      (Ou.elim (Hyp.apply "H1") 
        (Impl.intro "H10" 
          (Ou.intro 1 
            (Et.elim 2 (Hyp.apply "H10")
            )
          )
        ) 
        (Impl.intro "H11" 
          (Ou.intro 2 (Hyp.apply "H11")
          )
        )
      )
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp2_15 exo2_15 ;;


                    H5:(A /\ B)                                                                                        H10:(A /\ B)                                                                   
                    ___________ /\_e 1                                                                                 ____________ /\_e 2                                                            
                    A                                           H6:C                                                   B                                            H11:C                             
                    ________ \/_i                               ________ \/_i                                          ________ \/_i                                ________ \/_i                     
                    (A \/ C)                                    (A \/ C)                                               (B \/ C)                                     (B \/ C)                          
                    _______________________ =>_i [H5:(A /\ B)]  ________________ =>_i [H6:C]                           _______________________ =>_i [H10:(A /\ B)]  ________________ =>_i [H11:C]     
H1:((A /\ B) \/ C)  ((A /\ B) ==> (A \/ C))                     (C ==> (A \/ C))                   H1:((A /\ B) \/ C)  ((A /\ B) ==> (B \/ C))                      (C ==> (B \/ C))                  
____________________________________________________________________________________________ \/_e  ______________________________________________________________________________________________ \/_e
(A \/ C)                                                                                           (B \/ C)                                                                                           
______________________________________________________________________________________________________________________________________________________________________________________________________ /\_i
((A \/ C) /\ (B \/ C))
____________________________________________ =>_i [H1:((A /\ B) \/ C)]
(((A /\ B) \/ C) ==> ((A \/ C) /\ (B \/ C)))

Démontrons (((A /\ B) \/ C) ==> ((A \/ C) /\ (B \/ C))) : Pour cela, supposons ((A /\ B) \/ C) (hypothèse [H1]) et montrons ((A \/ C) /\ (B \/ C)) 1. Démontrons (A \/ C) : Pour cela, exploitons ((A /\ B) \/ C) qui correspond à l'hypothèse [H1] Or on ne sait pas lequel des deux membres de la disjonction est vrai ; on doit donc prouver (A \/ C) dans chacun des cas : - Cas 1: Démontrons ((A /\ B) ==> (A \/ C)) : Pour cela, supposons (A /\ B) (hypothèse [H5]) et montrons (A \/ C) Pour montrer (A \/ C) inutile de montrer C, on se contente de montrer A en remarquant que est la partie droite de la conjonction (A /\ B) qui correspond à l'hypothèse [H5] - Cas 2: Démontrons (C ==> (A \/ C)) : Pour cela, supposons C (hypothèse [H6]) et montrons (A \/ C) Pour montrer (A \/ C) inutile de montrer A, on se contente de montrer C en remarquant que c'est exactement l'hypothèse [H6] 2. Démontrons (B \/ C) : Pour cela, exploitons ((A /\ B) \/ C) qui correspond à l'hypothèse [H1] Or on ne sait pas lequel des deux membres de la disjonction est vrai ; on doit donc prouver (B \/ C) dans chacun des cas : - Cas 1: Démontrons ((A /\ B) ==> (B \/ C)) : Pour cela, supposons (A /\ B) (hypothèse [H10]) et montrons (B \/ C) Pour montrer (B \/ C) inutile de montrer C, on se contente de montrer B en remarquant que est la partie gauche de la conjonction (A /\ B) qui correspond à l'hypothèse [H10] - Cas 2: Démontrons (C ==> (B \/ C)) : Pour cela, supposons C (hypothèse [H11]) et montrons (B \/ C) Pour montrer (B \/ C) inutile de montrer B, on se contente de montrer C en remarquant que c'est exactement l'hypothèse [H11] Ceci achève la démonstration de (((A /\ B) \/ C) ==> ((A \/ C) /\ (B \/ C)))
EXAMPLE 2.16.1 

let exo2_16_1 = ( "exo_2_16_1" , (((P "A") || (P "C")) ==> (((P "B") || (P "C")) ==> (((P "A") & (P "B")) || (P "C")))) ) ;;

let adp2_16_1 = 
  (Impl.intro "H1" 
    (Impl.intro "H2" 
      (Ou.elim (Hyp.apply "H2") 
        (Impl.intro "H77" 
          (Ou.elim (Hyp.apply "H1") 
            (Impl.intro "H101" 
              (Ou.intro 1 
                (Et.intro (Hyp.apply "H101") (Hyp.apply "H77")
                )
              )
            ) 
            (Impl.intro "H102" 
              (Ou.intro 2 (Hyp.apply "H102")
              )
            )
          )
        ) 
        (Impl.intro "H202" 
          (Ou.intro 2 (Hyp.apply "H202")
          )
        )
      )
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp2_16_1 exo2_16_1 ;;


                          H101:A  H77:B                                                                                                           
                          _____________ /\_i                                                                                                      
                          (A /\ B)                               H102:C                                                                           
                          _______________ \/_i                   _______________ \/_i                                                             
                          ((A /\ B) \/ C)                        ((A /\ B) \/ C)                                                                  
                          _______________________ =>_i [H101:A]  _______________________ =>_i [H102:C]                                            
             H1:(A \/ C)  (A ==> ((A /\ B) \/ C))                (C ==> ((A /\ B) \/ C))                     H202:C                               
             _________________________________________________________________________________________ \/_e  _______________ \/_i                 
             ((A /\ B) \/ C)                                                                                 ((A /\ B) \/ C)                      
             _______________________ =>_i [H77:B]                                                            _______________________ =>_i [H202:C]
H2:(B \/ C)  (B ==> ((A /\ B) \/ C))                                                                         (C ==> ((A /\ B) \/ C))              
__________________________________________________________________________________________________________________________________________________ \/_e
((A /\ B) \/ C)
______________________________ =>_i [H2:(B \/ C)]
((B \/ C) ==> ((A /\ B) \/ C))
_____________________________________________ =>_i [H1:(A \/ C)]
((A \/ C) ==> ((B \/ C) ==> ((A /\ B) \/ C)))

Démontrons ((A \/ C) ==> ((B \/ C) ==> ((A /\ B) \/ C))) : Pour cela, supposons (A \/ C) (hypothèse [H1]) et montrons ((B \/ C) ==> ((A /\ B) \/ C)) Pour cela, supposons (B \/ C) (hypothèse [H2]) et montrons ((A /\ B) \/ C) Pour cela, exploitons (B \/ C) qui correspond à l'hypothèse [H2] Or on ne sait pas lequel des deux membres de la disjonction est vrai ; on doit donc prouver ((A /\ B) \/ C) dans chacun des cas : - Cas 1: Démontrons (B ==> ((A /\ B) \/ C)) : Pour cela, supposons B (hypothèse [H77]) et montrons ((A /\ B) \/ C) Pour cela, exploitons (A \/ C) qui correspond à l'hypothèse [H1] Or on ne sait pas lequel des deux membres de la disjonction est vrai ; on doit donc prouver ((A /\ B) \/ C) dans chacun des cas : - Cas 1: Démontrons (A ==> ((A /\ B) \/ C)) : Pour cela, supposons A (hypothèse [H101]) et montrons ((A /\ B) \/ C) Pour cela, il suffit de montrer l'un des deux termes de la disjonction. Démontrons (A /\ B) : 1. A correspond à l'hypothèse [H101] 2. B correspond à l'hypothèse [H77] - Cas 2: Démontrons (C ==> ((A /\ B) \/ C)) : Pour cela, supposons C (hypothèse [H102]) et montrons ((A /\ B) \/ C) Pour montrer ((A /\ B) \/ C) inutile de montrer (A /\ B), on se contente de montrer C en remarquant que c'est exactement l'hypothèse [H102] - Cas 2: Démontrons (C ==> ((A /\ B) \/ C)) : Pour cela, supposons C (hypothèse [H202]) et montrons ((A /\ B) \/ C) Pour montrer ((A /\ B) \/ C) inutile de montrer (A /\ B), on se contente de montrer C en remarquant que c'est exactement l'hypothèse [H202] Ceci achève la démonstration de ((A \/ C) ==> ((B \/ C) ==> ((A /\ B) \/ C)))
EXAMPLE 2.16.2 

let exo2_16_2 = ( "exo_2_16_2" , ((((P "A") || (P "C")) & ((P "B") || (P "C"))) ==> (((P "A") & (P "B")) || (P "C"))) ) ;;

let adp2_16_2 = 
  (Impl.intro "H1" 
    (Ou.elim 
      (Et.elim 1 (Hyp.apply "H1")
      ) 
      (Impl.intro "H975" 
        (Ou.elim 
          (Et.elim 2 (Hyp.apply "H1")
          ) 
          (Impl.intro "H8008" 
            (Ou.intro 1 
              (Et.intro (Hyp.apply "H975") (Hyp.apply "H8008")
              )
            )
          ) 
          (Impl.intro "H9010" 
            (Ou.intro 2 (Hyp.apply "H9010")
            )
          )
        )
      ) 
      (Impl.intro "H9017" 
        (Ou.intro 2 (Hyp.apply "H9017")
        )
      )
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp2_16_2 exo2_16_2 ;;


                                                                    H975:A  H8008:B                                                                                                            
                                                                    _______________ /\_i                                                                                                       
                                                                    (A /\ B)                                H9010:C                                                                            
                                                                    _______________ \/_i                    _______________ \/_i                                                               
                                  H1:((A \/ C) /\ (B \/ C))         ((A /\ B) \/ C)                         ((A /\ B) \/ C)                                                                    
                                  _________________________ /\_e 2  _______________________ =>_i [H8008:B]  _______________________ =>_i [H9010:C]                                             
                                  (B \/ C)                          (B ==> ((A /\ B) \/ C))                 (C ==> ((A /\ B) \/ C))                      H9017:C                               
                                  ________________________________________________________________________________________________________________ \/_e  _______________ \/_i                  
H1:((A \/ C) /\ (B \/ C))         ((A /\ B) \/ C)                                                                                                        ((A /\ B) \/ C)                       
_________________________ /\_e 1  _______________________ =>_i [H975:A]                                                                                  _______________________ =>_i [H9017:C]
(A \/ C)                          (A ==> ((A /\ B) \/ C))                                                                                                (C ==> ((A /\ B) \/ C))               
_______________________________________________________________________________________________________________________________________________________________________________________________ \/_e
((A /\ B) \/ C)
____________________________________________ =>_i [H1:((A \/ C) /\ (B \/ C))]
(((A \/ C) /\ (B \/ C)) ==> ((A /\ B) \/ C))

Démontrons (((A \/ C) /\ (B \/ C)) ==> ((A /\ B) \/ C)) : Pour cela, supposons ((A \/ C) /\ (B \/ C)) (hypothèse [H1]) et montrons ((A /\ B) \/ C) Pour cela, exploitons (A \/ C) qui est la partie droite de la conjonction ((A \/ C) /\ (B \/ C)) qui correspond à l'hypothèse [H1] Or on ne sait pas lequel des deux membres de la disjonction est vrai ; on doit donc prouver ((A /\ B) \/ C) dans chacun des cas : - Cas 1: Démontrons (A ==> ((A /\ B) \/ C)) : Pour cela, supposons A (hypothèse [H975]) et montrons ((A /\ B) \/ C) Pour cela, exploitons (B \/ C) qui est la partie gauche de la conjonction ((A \/ C) /\ (B \/ C)) qui correspond à l'hypothèse [H1] Or on ne sait pas lequel des deux membres de la disjonction est vrai ; on doit donc prouver ((A /\ B) \/ C) dans chacun des cas : - Cas 1: Démontrons (B ==> ((A /\ B) \/ C)) : Pour cela, supposons B (hypothèse [H8008]) et montrons ((A /\ B) \/ C) Pour cela, il suffit de montrer l'un des deux termes de la disjonction. Démontrons (A /\ B) : 1. A correspond à l'hypothèse [H975] 2. B correspond à l'hypothèse [H8008] - Cas 2: Démontrons (C ==> ((A /\ B) \/ C)) : Pour cela, supposons C (hypothèse [H9010]) et montrons ((A /\ B) \/ C) Pour montrer ((A /\ B) \/ C) inutile de montrer (A /\ B), on se contente de montrer C en remarquant que c'est exactement l'hypothèse [H9010] - Cas 2: Démontrons (C ==> ((A /\ B) \/ C)) : Pour cela, supposons C (hypothèse [H9017]) et montrons ((A /\ B) \/ C) Pour montrer ((A /\ B) \/ C) inutile de montrer (A /\ B), on se contente de montrer C en remarquant que c'est exactement l'hypothèse [H9017] Ceci achève la démonstration de (((A \/ C) /\ (B \/ C)) ==> ((A /\ B) \/ C))
EXAMPLE 2.17 

let exo2_17 = ( "exo_2_17" , (((P "B") & ((P "A") || ((P "B") ==> (P "C")))) ==> ((P "A") || (P "C"))) ) ;;

let adp2_17 = 
  (Impl.intro "H1" 
    (Ou.elim 
      (Et.elim 2 (Hyp.apply "H1")
      ) 
      (Impl.intro "H8" 
        (Ou.intro 1 (Hyp.apply "H8")
        )
      ) 
      (Impl.intro "H10" 
        (Ou.intro 2 
          (Impl.elim 
            (Et.elim 1 (Hyp.apply "H1")
            ) (Hyp.apply "H10")
          )
        )
      )
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp2_17 exo2_17 ;;


                                                                 H1:(B /\ (A \/ (B ==> C)))                           
                                                                 __________________________ /\_e 1                    
                                                                 B                                  H10:(B ==> C)     
                                                                 ________________________________________________ =>_e
                                   H8:A                          C                                                    
                                   ________ \/_i                 ________ \/_i                                        
H1:(B /\ (A \/ (B ==> C)))         (A \/ C)                      (A \/ C)                                             
__________________________ /\_e 2  ________________ =>_i [H8:A]  ________________________ =>_i [H10:(B ==> C)]        
(A \/ (B ==> C))                   (A ==> (A \/ C))              ((B ==> C) ==> (A \/ C))                             
______________________________________________________________________________________________________________________ \/_e
(A \/ C)
______________________________________ =>_i [H1:(B /\ (A \/ (B ==> C)))]
((B /\ (A \/ (B ==> C))) ==> (A \/ C))

Démontrons ((B /\ (A \/ (B ==> C))) ==> (A \/ C)) : Pour cela, supposons (B /\ (A \/ (B ==> C))) (hypothèse [H1]) et montrons (A \/ C) Pour cela, exploitons (A \/ (B ==> C)) qui est la partie gauche de la conjonction (B /\ (A \/ (B ==> C))) qui correspond à l'hypothèse [H1] Or on ne sait pas lequel des deux membres de la disjonction est vrai ; on doit donc prouver (A \/ C) dans chacun des cas : - Cas 1: Démontrons (A ==> (A \/ C)) : Pour cela, supposons A (hypothèse [H8]) et montrons (A \/ C) Pour montrer (A \/ C) inutile de montrer C, on se contente de montrer A en remarquant que c'est exactement l'hypothèse [H8] - Cas 2: Démontrons ((B ==> C) ==> (A \/ C)) : Pour cela, supposons (B ==> C) (hypothèse [H10]) et montrons (A \/ C) Pour montrer (A \/ C) inutile de montrer A, on se contente de montrer C en remarquant que Puisqu'on a (B ==> C) d'après [H10], il suffit de montrer B pour obtenir C. qui est la partie droite de la conjonction (B /\ (A \/ (B ==> C))) qui correspond à l'hypothèse [H1] Ceci achève la démonstration de ((B /\ (A \/ (B ==> C))) ==> (A \/ C))
EXAMPLE 2.18 

let exo2_18 = ( "exo_2_18" , ((((P "A") ==> (P "B")) || ((P "A") ==> (P "C"))) ==> ((P "A") ==> ((P "B") || (P "C")))) ) ;;

let adp2_18 = 
  (Impl.intro "H1" 
    (Impl.intro "H2" 
      (Ou.elim (Hyp.apply "H1") 
        (Impl.intro "H6" 
          (Ou.intro 1 
            (Impl.elim (Hyp.apply "H2") (Hyp.apply "H6")
            )
          )
        ) 
        (Impl.intro "H7" 
          (Ou.intro 2 
            (Impl.elim (Hyp.apply "H2") (Hyp.apply "H7")
            )
          )
        )
      )
    )
  ) ;;

verify_and_print [ pretty_proof ] "-html" adp2_18 exo2_18 ;;


                             H2:A  H6:(A ==> B)                            H2:A  H7:(A ==> C)                          
                             __________________ =>_e                       __________________ =>_e                     
                             B                                             C                                           
                             ________ \/_i                                 ________ \/_i                               
                             (B \/ C)                                      (B \/ C)                                    
                             ________________________ =>_i [H6:(A ==> B)]  ________________________ =>_i [H7:(A ==> C)]
H1:((A ==> B) \/ (A ==> C))  ((A ==> B) ==> (B \/ C))                      ((A ==> C) ==> (B \/ C))                    
_______________________________________________________________________________________________________________________ \/_e
(B \/ C)
________________ =>_i [H2:A]
(A ==> (B \/ C))
_______________________________________________ =>_i [H1:((A ==> B) \/ (A ==> C))]
(((A ==> B) \/ (A ==> C)) ==> (A ==> (B \/ C)))

Démontrons (((A ==> B) \/ (A ==> C)) ==> (A ==> (B \/ C))) : Pour cela, supposons ((A ==> B) \/ (A ==> C)) (hypothèse [H1]) et montrons (A ==> (B \/ C)) Pour cela, supposons A (hypothèse [H2]) et montrons (B \/ C) Pour cela, exploitons ((A ==> B) \/ (A ==> C)) qui correspond à l'hypothèse [H1] Or on ne sait pas lequel des deux membres de la disjonction est vrai ; on doit donc prouver (B \/ C) dans chacun des cas : - Cas 1: Démontrons ((A ==> B) ==> (B \/ C)) : Pour cela, supposons (A ==> B) (hypothèse [H6]) et montrons (B \/ C) Pour montrer (B \/ C) inutile de montrer C, on se contente de montrer B en remarquant queB est une conséquence directe des hypothèses H2: A et H6: (A ==> B) - Cas 2: Démontrons ((A ==> C) ==> (B \/ C)) : Pour cela, supposons (A ==> C) (hypothèse [H7]) et montrons (B \/ C) Pour montrer (B \/ C) inutile de montrer B, on se contente de montrer C en remarquant queC est une conséquence directe des hypothèses H2: A et H7: (A ==> C) Ceci achève la démonstration de (((A ==> B) \/ (A ==> C)) ==> (A ==> (B \/ C)))