Acciones

Diferencia entre revisiones de «Sol 7»

De Lógica matemática y fundamentos (2018-19)

m
 
Línea 1: Línea 1:
<source lang = "isabelle">
+
<source lang="isabelle">
 
theory R7_sol
 
theory R7_sol
 +
 
imports Main  
 
imports Main  
 
begin
 
begin
Línea 37: Línea 38:
 
   ---------------------------------------------------------------------  
 
   ---------------------------------------------------------------------  
 
*}
 
*}
 +
 +
text {*
 +
  Se usarán las reglas notnotI y mt que demostramos a continuación.
 +
  *}
 +
 +
lemma notnotI: "P ⟹ ¬¬ P"
 +
by auto
 +
 +
lemma mt: "⟦F ⟶ G; ¬G⟧ ⟹ ¬F"
 +
  by auto
  
 
section {* Implicaciones *}
 
section {* Implicaciones *}
Línea 45: Línea 56:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej1: "⟦p ⟶ q; p⟧ ⟹ q"  
+
lemma ej1a: "⟦p ⟶ q; p⟧ ⟹ q"  
   apply (erule mp)
+
   apply (erule mp)  (* p ⟹ p *)
   apply assumption
+
   apply assumption (* *)
 
   done
 
   done
 +
 +
lemma ej1b: "⟦p ⟶ q; p⟧ ⟹ q"
 +
  apply (erule mp, assumption)
 +
  done
 +
 +
lemma ej1c: "⟦p ⟶ q; p⟧ ⟹ q"
 +
  by (erule mp, assumption)
  
 
text {* ---------------------------------------------------------------  
 
text {* ---------------------------------------------------------------  
Línea 55: Línea 73:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej2: "⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r"
+
lemma ej2a: "⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r"
   apply (erule mp)+
+
   apply (erule mp)   (* ⟦p ⟶ q; p⟧ ⟹ q *)
   apply assumption
+
    apply (erule mp)  (* p ⟹ p *)
 +
   apply assumption   (* *)
 
   done   
 
   done   
 +
 +
lemma ej2b: "⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r"
 +
  apply (erule mp)+  (* p ⟹ p *)
 +
  apply assumption  (* *)
 +
  done 
 +
 +
lemma ej2c: "⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r"
 +
  apply ((erule mp)+, assumption)
 +
  done
 +
 +
lemma ej2d: "⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r"
 +
  by ((erule mp)+, assumption)
  
 
text {* ---------------------------------------------------------------  
 
text {* ---------------------------------------------------------------  
Línea 66: Línea 97:
  
 
lemma ej3a: "⟦p ⟶ (q ⟶ r); p ⟶ q; p⟧ ⟹ r"
 
lemma ej3a: "⟦p ⟶ (q ⟶ r); p ⟶ q; p⟧ ⟹ r"
   apply (erule impE)
+
   apply (drule mp)  (* ⟦p ⟶ q; p⟧ ⟹ p
   apply assumption
+
                        ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
   apply (erule impE)
+
   apply assumption (* ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
   apply assumption
+
   apply (drule mp)  (* ⟦p; q ⟶ r⟧ ⟹ p
   apply (erule impE)
+
                        ⟦p; q ⟶ r; q⟧ ⟹ r *)
   apply assumption+
+
   apply assumption (* ⟦p; q ⟶ r; q⟧ ⟹ r *)
 +
   apply (drule mp)  (* ⟦p; q⟧ ⟹ q
 +
                        ⟦p; q; r⟧ ⟹ r *)
 +
   apply assumption (* ⟦p; q; r⟧ ⟹ r *)
 +
  apply assumption  (* *)
 
   done
 
   done
  
 
lemma ej3b: "⟦p ⟶ (q ⟶ r); p ⟶ q; p⟧ ⟹ r"
 
lemma ej3b: "⟦p ⟶ (q ⟶ r); p ⟶ q; p⟧ ⟹ r"
   apply (erule impE, assumption+)+
+
   apply (drule mp, assumption) (* ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
 +
  apply (drule mp, assumption) (* ⟦p; q ⟶ r; q⟧ ⟹ r *)
 +
  apply (drule mp, assumption) (* ⟦p; q; r⟧ ⟹ r *)
 +
  apply assumption            (* *)
 +
  done
 +
 
 +
lemma ej3c: "⟦p ⟶ (q ⟶ r); p ⟶ q; p⟧ ⟹ r"
 +
  apply (drule mp, assumption)+ (* ⟦p; q; r⟧ ⟹ r *)
 +
  apply assumption              (* *)
 +
  done
 +
 
 +
lemma ej3d: "⟦p ⟶ (q ⟶ r); p ⟶ q; p⟧ ⟹ r"
 +
  apply (drule mp, assumption+)+
 
   done
 
   done
 +
 +
lemma ej3e: "⟦p ⟶ (q ⟶ r); p ⟶ q; p⟧ ⟹ r"
 +
  by (drule mp, assumption+)+
  
 
text {* ---------------------------------------------------------------  
 
text {* ---------------------------------------------------------------  
Línea 83: Línea 133:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
-- "La demostración detallada es"
+
lemma ej4a: "⟦p ⟶ q; q ⟶ r⟧ ⟹ p ⟶ r"
lemma ej4: "⟦p ⟶ q; q ⟶ r⟧ ⟹ p ⟶ r"
+
   apply (rule impI)  (* ⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r *)
   apply (rule impI)
+
   apply (erule mp)  (* ⟦p ⟶ q; p⟧ ⟹ q *)
   apply (erule mp)
+
  apply (erule mp)  (* p ⟹ p *)
   apply (erule mp)
+
  apply assumption  (* *)
   apply assumption
+
  done
 +
 
 +
lemma ej4b: "⟦p ⟶ q; q ⟶ r⟧ ⟹ p ⟶ r"
 +
  apply (rule impI)  (* ⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r *)
 +
   apply (erule mp)+  (* p ⟹ p *)
 +
   apply assumption   (* *)
 
   done
 
   done
  
Línea 96: Línea 151:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej5: "p ⟶ (q ⟶ r) ⟹ q ⟶ (p ⟶ r)"
+
lemma ej5a: "p ⟶ (q ⟶ r) ⟹ q ⟶ (p ⟶ r)"
   apply (rule impI)
+
   apply (rule impI)   (* ⟦p ⟶ q ⟶ r; q⟧ ⟹ p ⟶ r *)
   apply (rule impI)
+
  apply (rule impI)  (* ⟦p ⟶ q ⟶ r; q; p⟧ ⟹ r *)
   apply (erule impE, assumption)
+
  apply (erule impE)  (* ⟦q; p⟧ ⟹ p
   apply (erule impE, assumption+)
+
                        ⟦q; p; q ⟶ r⟧ ⟹ r *)
 +
  apply assumption  (* ⟦q; p; q ⟶ r⟧ ⟹ r *)
 +
  apply (erule impE)  (* ⟦q; p⟧ ⟹ q
 +
                        ⟦q; p; r⟧ ⟹ r *)
 +
  apply assumption  (* ⟦q; p; r⟧ ⟹ r *)
 +
  apply assumption    (* *)
 +
  done 
 +
 
 +
lemma ej5b: "p ⟶ (q ⟶ r) ⟹ q ⟶ (p ⟶ r)"
 +
  apply (rule impI)              (* ⟦p ⟶ q ⟶ r; q⟧ ⟹ p ⟶ r *)
 +
  apply (rule impI)              (* ⟦p ⟶ q ⟶ r; q; p⟧ ⟹ r *)
 +
  apply (erule impE, assumption)  (* ⟦q; p; q ⟶ r⟧ ⟹ r *)
 +
  apply (erule impE, assumption+) (* *)
 +
  done 
 +
 
 +
lemma ej5c: "p ⟶ (q ⟶ r) ⟹ q ⟶ (p ⟶ r)"
 +
   apply (rule impI)+              (* ⟦p ⟶ q ⟶ r; q; p⟧ ⟹ r *)  
 +
   apply (erule impE, assumption)  (* ⟦q; p; q ⟶ r⟧ ⟹ r *)
 +
   apply (erule impE, assumption+) (* *)
 +
  done 
 +
 
 +
lemma ej5d: "p ⟶ (q ⟶ r) ⟹ q ⟶ (p ⟶ r)"
 +
  apply (rule impI)+                (* ⟦p ⟶ q ⟶ r; q; p⟧ ⟹ r *)
 +
  apply (erule impE, assumption+)+  (* ⟦q; p; q ⟶ r⟧ ⟹ r *)
 
   done   
 
   done   
 
    
 
    
Línea 108: Línea 186:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej6: "p ⟶ (q ⟶ r) ⟹ (p ⟶ q) ⟶ (p ⟶ r)"
+
lemma ej6a: "p ⟶ (q ⟶ r) ⟹ (p ⟶ q) ⟶ (p ⟶ r)"
   apply (rule impI)
+
   apply (rule impI)   (* ⟦p ⟶ q ⟶ r; p ⟶ q⟧ ⟹ p ⟶ r *)
   apply (rule impI)
+
  apply (rule impI)  (* ⟦p ⟶ q ⟶ r; p ⟶ q; p⟧ ⟹ r *)
   apply (erule impE, assumption)
+
  apply (erule impE)  (* ⟦p ⟶ q; p⟧ ⟹ p
   apply (erule impE, assumption)
+
                        ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
   apply (erule impE, assumption+)
+
  apply assumption  (* ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
 +
  apply (erule impE)  (* ⟦p; q ⟶ r⟧ ⟹ p
 +
                        ⟦p; q ⟶ r; q⟧ ⟹ r *)
 +
  apply assumption  (* ⟦p; q ⟶ r; q⟧ ⟹ r *)
 +
  apply (erule impE)  (* ⟦p; q⟧ ⟹ q
 +
                        ⟦p; q; r⟧ ⟹ r *)
 +
  apply assumption  (* ⟦p; q; r⟧ ⟹ r *)
 +
  apply assumption    (* *)
 +
  done
 +
 
 +
lemma ej6b: "p ⟶ (q ⟶ r) ⟹ (p ⟶ q) ⟶ (p ⟶ r)"
 +
   apply (rule impI)              (* ⟦p ⟶ q ⟶ r; p ⟶ q⟧ ⟹ p ⟶ r *)
 +
  apply (rule impI)              (* ⟦p ⟶ q ⟶ r; p ⟶ q; p⟧ ⟹ r *)
 +
   apply (erule impE, assumption)  (* ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
 +
   apply (erule impE, assumption)  (* ⟦p; q ⟶ r; q⟧ ⟹ r *)
 +
  apply (erule impE, assumption+) (* *)
 +
  done
 +
 
 +
lemma ej6c: "p ⟶ (q ⟶ r) ⟹ (p ⟶ q) ⟶ (p ⟶ r)"
 +
  apply (rule impI)+              (* ⟦p ⟶ q ⟶ r; p ⟶ q; p⟧ ⟹ r *)
 +
   apply (erule impE, assumption+)+ (* *)
 
   done
 
   done
  
Línea 121: Línea 219:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej7: "p ⟹ q ⟶ p"
+
lemma ej7a: "p ⟹ q ⟶ p"
   apply (rule impI)
+
   apply (rule impI)  (* ⟦p; q⟧ ⟹ p *)
   apply assumption
+
   apply assumption   (* *)
 +
  done
 +
   
 +
lemma ej7b: "p ⟹ q ⟶ p"
 +
  apply (rule impI, assumption)  (* *)
 
   done
 
   done
 
      
 
      
Línea 131: Línea 233:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej8: "p ⟶ (q ⟶ p)"
+
lemma ej8a: "p ⟶ (q ⟶ p)"
   apply (rule impI)
+
   apply (rule impI)  (* p ⟹ q ⟶ p *)
   apply (rule impI)
+
   apply (rule impI)  (* ⟦p; q⟧ ⟹ p *)
   apply assumption
+
   apply assumption   (* *)
 
   done
 
   done
  
text {* ---------------------------------------------------------------  
+
lemma ej8b: "p ⟶ (q ⟶ p)"
 +
  apply (rule impI)+  (* ⟦p; q⟧ ⟹ p *)
 +
  apply assumption    (* *)
 +
  done
 +
 
 +
lemma ej8c: "p ⟶ (q ⟶ p)"
 +
  by (rule impI)+
 +
 
 +
text {* ---------------------------------------------------------------
 
   Ejercicio 9. Demostrar
 
   Ejercicio 9. Demostrar
 
     p ⟶ q ⊢ (q ⟶ r) ⟶ (p ⟶ r)
 
     p ⟶ q ⊢ (q ⟶ r) ⟶ (p ⟶ r)
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej9: "p ⟶ q ⟹ (q ⟶ r) ⟶ (p ⟶ r)"
+
lemma ej9a: "p ⟶ q ⟹ (q ⟶ r) ⟶ (p ⟶ r)"
   apply (rule impI)
+
   apply (rule impI) (* ⟦p ⟶ q; q ⟶ r⟧ ⟹ p ⟶ r *)
   apply (rule impI)
+
   apply (rule impI) (* ⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r *)
   apply (erule impE, assumption)
+
   apply (erule mp)  (* ⟦p ⟶ q; p⟧ ⟹ q *)
   apply (erule impE, assumption+)
+
  apply (erule mp)  (* p ⟹ p *)
 +
  apply assumption (* *)
 +
  done
 +
 
 +
lemma ej9b: "p ⟶ q ⟹ (q ⟶ r) ⟶ (p ⟶ r)"
 +
  apply (rule impI)+ (* ⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r *)
 +
   apply (erule mp)+  (* p ⟹ p *)
 +
  apply assumption   (* *)
 
   done
 
   done
  
Línea 154: Línea 271:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej10: "p ⟶ (q ⟶ (r ⟶ s)) ⟹ r ⟶ (q ⟶ (p ⟶ s))"
+
lemma ej10a: "p ⟶ (q ⟶ (r ⟶ s)) ⟹ r ⟶ (q ⟶ (p ⟶ s))"
   apply (rule impI)+
+
  apply (rule impI)  (* ⟦p ⟶ q ⟶ r ⟶ s; r⟧ ⟹ q ⟶ p ⟶ s *)
   apply (erule impE, assumption+)+
+
  apply (rule impI)  (* ⟦p ⟶ q ⟶ r ⟶ s; r; q⟧ ⟹ p ⟶ s *)
 +
  apply (rule impI)  (* ⟦p ⟶ q ⟶ r ⟶ s; r; q; p⟧ ⟹ s *)
 +
  apply (drule mp)  (* ⟦r; q; p⟧ ⟹ p
 +
                        ⟦r; q; p; q ⟶ r ⟶ s⟧ ⟹ s *)
 +
  apply assumption  (* ⟦r; q; p; q ⟶ r ⟶ s⟧ ⟹ s *)
 +
  apply (drule mp)  (* ⟦r; q; p⟧ ⟹ q
 +
                        ⟦r; q; p; r ⟶ s⟧ ⟹ s *)
 +
  apply assumption  (* ⟦r; q; p; r ⟶ s⟧ ⟹ s *)
 +
  apply (erule mp)  (* ⟦r; q; p⟧ ⟹ r *)
 +
  apply assumption  (* *)
 +
  done
 +
   
 +
lemma ej10b: "p ⟶ (q ⟶ (r ⟶ s)) ⟹ r ⟶ (q ⟶ (p ⟶ s))"
 +
  apply (rule impI)  (* ⟦p ⟶ q ⟶ r ⟶ s; r⟧ ⟹ q ⟶ p ⟶ s *)
 +
  apply (rule impI)  (* ⟦p ⟶ q ⟶ r ⟶ s; r; q⟧ ⟹ p ⟶ s *)
 +
  apply (rule impI)  (* ⟦p ⟶ q ⟶ r ⟶ s; r; q; p⟧ ⟹ s *)
 +
  apply (drule mp, assumption)  (* ⟦r; q; p; q ⟶ r ⟶ s⟧ ⟹ s *)
 +
  apply (drule mp, assumption)  (* ⟦r; q; p; r ⟶ s⟧ ⟹ s *)
 +
  apply (erule mp, assumption)  (* *)
 +
  done
 +
   
 +
lemma ej10c: "p ⟶ (q ⟶ (r ⟶ s)) ⟹ r ⟶ (q ⟶ (p ⟶ s))"
 +
   apply (rule impI)+ (* ⟦p ⟶ q ⟶ r ⟶ s; r; q; p⟧ ⟹ s *)
 +
   apply (drule mp, assumption+)+ (* *)
 
   done
 
   done
 
      
 
      
Línea 164: Línea 304:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej11: "(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))"
+
lemma ej11a: "(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))"
   apply (rule impI)+
+
  apply (rule impI)  (* p ⟶ q ⟶ r ⟹ (p ⟶ q) ⟶ p ⟶ r *)
   apply (erule impE, assumption+)+
+
  apply (rule impI)  (* ⟦p ⟶ q ⟶ r; p ⟶ q⟧ ⟹ p ⟶ r *)
 +
  apply (rule impI)  (* ⟦p ⟶ q ⟶ r; p ⟶ q; p⟧ ⟹ r *)
 +
  apply (drule mp)  (* ⟦p ⟶ q; p⟧ ⟹ p
 +
                        ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
 +
  apply assumption  (* ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
 +
  apply (drule mp)  (* ⟦p; q ⟶ r⟧ ⟹ p
 +
                        ⟦p; q ⟶ r; q⟧ ⟹ r *)
 +
  apply assumption  (* ⟦p; q ⟶ r; q⟧ ⟹ r *)
 +
  apply (erule mp)  (* ⟦p; q⟧ ⟹ q *)
 +
  apply assumption  (* *)
 +
  done
 +
   
 +
lemma ej11b: "(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))"
 +
   apply (rule impI)+             (* ⟦p ⟶ q ⟶ r; p ⟶ q; p⟧ ⟹ r *)
 +
   apply (drule mp, assumption+)+ (* *)
 
   done
 
   done
 
      
 
      
Línea 174: Línea 328:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej12: "(p ⟶ q) ⟶ r ⟹ p ⟶ (q ⟶ r)"
+
lemma ej12a: "(p ⟶ q) ⟶ r ⟹ p ⟶ (q ⟶ r)"
   apply (rule impI)+
+
  apply (rule impI)  (* ⟦(p ⟶ q) ⟶ r; p⟧ ⟹ q ⟶ r *)
   apply (rule_tac P="p ⟶ q" in mp)
+
  apply (rule impI)  (* ⟦(p ⟶ q) ⟶ r; p; q⟧ ⟹ r *)
   apply assumption
+
  apply (drule mp)  (* ⟦p; q⟧ ⟹ p ⟶ q
   apply (rule impI)
+
                        ⟦p; q; r⟧ ⟹ r *)
   apply assumption
+
  apply (rule impI)  (* ⟦p; q; p⟧ ⟹ q
 +
                        ⟦p; q; r⟧ ⟹ r *)
 +
  apply assumption  (* ⟦p; q; r⟧ ⟹ r *)
 +
  apply assumption  (* *)
 +
  done
 +
 
 +
lemma ej12b: "(p ⟶ q) ⟶ r ⟹ p ⟶ (q ⟶ r)"
 +
  apply (rule impI)+  (* ⟦(p ⟶ q) ⟶ r; p; q⟧ ⟹ r *)
 +
  apply (drule mp)    (* ⟦p; q⟧ ⟹ p ⟶ q
 +
                        ⟦p; q; r⟧ ⟹ r *)
 +
  apply (rule impI)  (* ⟦p; q; p⟧ ⟹ q
 +
                        ⟦p; q; r⟧ ⟹ r *)
 +
  apply assumption+  (* *)
 +
  done
 +
 
 +
lemma ej12c: "(p ⟶ q) ⟶ r ⟹ p ⟶ (q ⟶ r)"
 +
  apply (rule impI)+  (* ⟦(p ⟶ q) ⟶ r; p; q⟧ ⟹ r *)
 +
  apply (drule mp)    (* ⟦p; q⟧ ⟹ p ⟶ q
 +
                        ⟦p; q; r⟧ ⟹ r *)
 +
  apply (rule impI,
 +
        assumption+) (* *)
 +
  done
 +
 
 +
lemma ej12e: "(p ⟶ q) ⟶ r ⟹ p ⟶ (q ⟶ r)"
 +
   apply (rule impI)+                 (* ⟦(p ⟶ q) ⟶ r; p; q⟧ ⟹ r *)
 +
   apply (rule_tac P="p ⟶ q" in mp)
 +
                        (* ⟦(p ⟶ q) ⟶ r; p; q⟧ ⟹ (p ⟶ q) ⟶ r
 +
                            ⟦(p ⟶ q) ⟶ r; p; q⟧ ⟹ p ⟶ q *)
 +
   apply assumption     (* ⟦(p ⟶ q) ⟶ r; p; q⟧ ⟹ p ⟶ q *)
 +
   apply (rule impI)      (* ⟦(p ⟶ q) ⟶ r; p; q; p⟧ ⟹ q *)
 +
   apply assumption       (* *)
 
   done
 
   done
 
    
 
    
Línea 190: Línea 374:
  
 
lemma ej13: "⟦p; q⟧ ⟹ p ∧ q"
 
lemma ej13: "⟦p; q⟧ ⟹ p ∧ q"
   apply (rule conjI)
+
   apply (rule conjI)  (* ⟦p; q⟧ ⟹ p
   apply assumption
+
                          ⟦p; q⟧ ⟹ q *)
   apply assumption
+
   apply assumption   (* ⟦p; q⟧ ⟹ q *)
 +
   apply assumption     (* *)
 
   done
 
   done
 +
   
 +
lemma ej13b: "⟦p; q⟧ ⟹ p ∧ q"
 +
  apply (rule conjI)  (* ⟦p; q⟧ ⟹ p
 +
                          ⟦p; q⟧ ⟹ q *)
 +
  apply assumption+  (* *)
 +
  done
 +
   
 +
lemma ej13c: "⟦p; q⟧ ⟹ p ∧ q"
 +
  apply (rule conjI, assumption+)
 +
  done
 +
   
 +
lemma ej13d: "⟦p; q⟧ ⟹ p ∧ q"
 +
  by (rule conjI, assumption+)
 
      
 
      
 
text {* ---------------------------------------------------------------  
 
text {* ---------------------------------------------------------------  
Línea 200: Línea 398:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej14: "p ∧ q ⟹ p"
+
lemma ej14a: "p ∧ q ⟹ p"
 
   apply (erule conjunct1)
 
   apply (erule conjunct1)
 
   done
 
   done
 +
   
 +
lemma ej14b: "p ∧ q ⟹ p"
 +
  by (erule conjunct1)
 
      
 
      
 
text {* ---------------------------------------------------------------  
 
text {* ---------------------------------------------------------------  
Línea 209: Línea 410:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej15: "p ∧ q ⟹ q"
+
lemma ej15a: "p ∧ q ⟹ q"
 
   apply (erule conjunct2)
 
   apply (erule conjunct2)
 
   done
 
   done
 +
   
 +
lemma ej15b: "p ∧ q ⟹ q"
 +
  by (erule conjunct2)
 
      
 
      
 
text {* ---------------------------------------------------------------  
 
text {* ---------------------------------------------------------------  
Línea 218: Línea 422:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej16: "p ∧ (q ∧ r) ⟹ (p ∧ q) ∧ r"
+
lemma ej16a: "p ∧ (q ∧ r) ⟹ (p ∧ q) ∧ r"
   apply (rule conjI)
+
   apply (rule conjI)          (* p ∧ (q ∧ r) ⟹ p ∧ q
   apply (rule conjI)
+
                                p ∧ (q ∧ r) ⟹ r *)
     apply (erule conjunct1)
+
   apply (rule conjI)        (* p ∧ (q ∧ r) ⟹ p
   apply (drule conjunct2)
+
                                p ∧ (q ∧ r) ⟹ q
   apply (erule conjunct1)
+
                                p ∧ (q ∧ r) ⟹ r *)
   apply (drule conjunct2)
+
     apply (erule conjunct1)  (* p ∧ (q ∧ r) ⟹ q
   apply (erule conjunct2)
+
                                p ∧ (q ∧ r) ⟹ r *)
 +
   apply (drule conjunct2)    (* q ∧ r ⟹ q
 +
                                p ∧ (q ∧ r) ⟹ r *)
 +
   apply (erule conjunct1)    (* p ∧ (q ∧ r) ⟹ r *)
 +
   apply (drule conjunct2)    (* q ∧ r ⟹ r *)
 +
   apply (erule conjunct2)    (* *)
 +
  done
 +
   
 +
lemma ej16b: "p ∧ (q ∧ r) ⟹ (p ∧ q) ∧ r"
 +
  apply (rule conjI)+        (* p ∧ (q ∧ r) ⟹ p
 +
                                p ∧ (q ∧ r) ⟹ q
 +
                                p ∧ (q ∧ r) ⟹ r *)
 +
    apply (erule conjE)      (* ⟦p; q ∧ r⟧ ⟹ p
 +
                                p ∧ (q ∧ r) ⟹ q
 +
                                p ∧ (q ∧ r) ⟹ r *)
 +
  apply assumption            (* p ∧ (q ∧ r) ⟹ q
 +
                                p ∧ (q ∧ r) ⟹ r *)
 +
  apply (erule conjE)+      (* ⟦p; q; r⟧ ⟹ q
 +
                                p ∧ (q ∧ r) ⟹ r *)
 +
  apply assumption            (* p ∧ (q ∧ r) ⟹ r *)
 +
  apply (erule conjE)+        (* ⟦p; q; r⟧ ⟹ r *)
 +
  apply assumption            (* *)
 +
  done
 +
   
 +
lemma ej16c: "p ∧ (q ∧ r) ⟹ (p ∧ q) ∧ r"
 +
  apply (rule conjI)+        (* p ∧ (q ∧ r) ⟹ p
 +
                                p ∧ (q ∧ r) ⟹ q
 +
                                p ∧ (q ∧ r) ⟹ r *)
 +
    apply (erule conjE,
 +
          assumption)        (* p ∧ (q ∧ r) ⟹ q
 +
                                p ∧ (q ∧ r) ⟹ r *)
 +
  apply ((erule conjE)+,
 +
          assumption)        (* p ∧ (q ∧ r) ⟹ r *)
 +
  apply ((erule conjE)+,
 +
        assumption)          (* *)
 +
  done
 +
   
 +
lemma ej16d: "p ∧ (q ∧ r) ⟹ (p ∧ q) ∧ r"
 +
  apply (rule conjI)+        (* p ∧ (q ∧ r) ⟹ p
 +
                                p ∧ (q ∧ r) ⟹ q
 +
                                p ∧ (q ∧ r) ⟹ r *)
 +
    apply ((erule conjE)+,
 +
          assumption)+      (* *)
 
   done
 
   done
 
      
 
      
Línea 233: Línea 479:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej17: "(p ∧ q) ∧ r ⟹ p ∧ (q ∧ r)"
+
lemma ej17a: "(p ∧ q) ∧ r ⟹ p ∧ (q ∧ r)"
   apply (rule conjI)
+
   apply (rule conjI)        (* (p ∧ q) ∧ r ⟹ p
   apply (drule conjunct1)
+
                              (p ∧ q) ∧ r ⟹ q ∧ r *)
   apply (erule conjunct1)
+
   apply (drule conjunct1)  (* p ∧ q ⟹ p
   apply (rule conjI)
+
                              (p ∧ q) ∧ r ⟹ q ∧ r *)
   apply (drule conjunct1)
+
   apply (erule conjunct1)  (* (p ∧ q) ∧ r ⟹ q ∧ r *)
   apply (erule conjunct2)
+
   apply (rule conjI)        (* (p ∧ q) ∧ r ⟹ q
   apply (erule conjunct2)
+
                              (p ∧ q) ∧ r ⟹ r *)
 +
   apply (drule conjunct1)  (* p ∧ q ⟹ q
 +
                              (p ∧ q) ∧ r ⟹ r *)
 +
   apply (erule conjunct2)  (* (p ∧ q) ∧ r ⟹ r *)
 +
   apply (erule conjunct2)  (* *)
 
   done
 
   done
 
      
 
      
 +
lemma ej17b: "(p ∧ q) ∧ r ⟹ p ∧ (q ∧ r)"
 +
  apply (erule conjE)  (* ⟦p ∧ q; r⟧ ⟹ p ∧ (q ∧ r) *)
 +
  apply (erule conjE)  (* ⟦r; p; q⟧ ⟹ p ∧ (q ∧ r) *)
 +
  apply (erule conjI)  (* ⟦r; q⟧ ⟹ q ∧ r *)
 +
  apply (erule conjI)  (* r ⟹ r *)
 +
  apply assumption      (* *)
 +
  done
 +
 +
lemma ej17c: "(p ∧ q) ∧ r ⟹ p ∧ (q ∧ r)"
 +
  apply (erule conjE)+  (* ⟦r; p; q⟧ ⟹ p ∧ (q ∧ r) *)
 +
  apply (erule conjI)+  (* r ⟹ r *)
 +
  apply assumption      (* *)
 +
  done
 +
 
text {* ---------------------------------------------------------------  
 
text {* ---------------------------------------------------------------  
 
   Ejercicio 18. Demostrar
 
   Ejercicio 18. Demostrar
Línea 249: Línea 513:
  
 
lemma ej18: "p ∧ q ⟹ p ⟶ q"
 
lemma ej18: "p ∧ q ⟹ p ⟶ q"
   apply (rule impI)
+
   apply (rule impI)        (* ⟦p ∧ q; p⟧ ⟹ q *)
   apply (erule conjunct2)
+
   apply (erule conjunct2)  (* *)
 
   done
 
   done
 
      
 
      
Línea 258: Línea 522:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej19: "(p ⟶ q) ∧ (p ⟶ r) ⟹ p ⟶ q ∧ r"
+
lemma ej19a: "(p ⟶ q) ∧ (p ⟶ r) ⟹ p ⟶ q ∧ r"
   apply (rule impI)
+
   apply (rule impI)          (* ⟦(p ⟶ q) ∧ (p ⟶ r); p⟧ ⟹ q ∧ r *)
   apply (rule conjI)
+
   apply (rule conjI)        (* ⟦(p ⟶ q) ∧ (p ⟶ r); p⟧ ⟹ q
   apply (drule conjunct1)
+
                                ⟦(p ⟶ q) ∧ (p ⟶ r); p⟧ ⟹ r *)
   apply (erule impE)
+
   apply (drule conjunct1)  (* ⟦p; p ⟶ q⟧ ⟹ q *)
     apply assumption
+
   apply (erule mp)          (* p ⟹ p
  apply assumption
+
                                ⟦(p ⟶ q) ∧ (p ⟶ r); p⟧ ⟹ r *)
   apply (drule conjunct2)
+
     apply assumption         (* ⟦(p ⟶ q) ∧ (p ⟶ r); p⟧ ⟹ r *)
   apply (erule impE)
+
   apply (drule conjunct2)    (* ⟦p; p ⟶ r⟧ ⟹ r *)
   apply assumption
+
   apply (erule mp)          (* p ⟹ p *)
  apply assumption
+
   apply assumption         (* *)
 
   done
 
   done
 
      
 
      
 +
lemma ej19b: "(p ⟶ q) ∧ (p ⟶ r) ⟹ p ⟶ q ∧ r"
 +
  apply (erule conjE)  (* ⟦p ⟶ q; p ⟶ r⟧ ⟹ p ⟶ q ∧ r *)
 +
  apply (rule impI)    (* ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ q ∧ r *)
 +
  apply (rule conjI)  (* ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ q
 +
                          ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ r *)
 +
  apply (erule mp)    (* ⟦p ⟶ r; p⟧ ⟹ p
 +
                          ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ r *)
 +
  apply assumption    (* ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ r *)
 +
  apply (erule mp)    (* ⟦p ⟶ q; p⟧ ⟹ p *)
 +
  apply assumption    (* *)
 +
  done
 +
 +
lemma ej19c: "(p ⟶ q) ∧ (p ⟶ r) ⟹ p ⟶ q ∧ r"
 +
  apply (erule conjE)  (* ⟦p ⟶ q; p ⟶ r⟧ ⟹ p ⟶ q ∧ r *)
 +
  apply (rule impI)    (* ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ q ∧ r *)
 +
  apply (rule conjI)  (* ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ q
 +
                          ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ r *)
 +
  apply (erule mp,
 +
        assumption)  (* ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ r *)
 +
  apply (erule mp,
 +
        assumption)  (* *)
 +
  done
 +
 +
lemma ej19d: "(p ⟶ q) ∧ (p ⟶ r) ⟹ p ⟶ q ∧ r"
 +
  apply (erule conjE)  (* ⟦p ⟶ q; p ⟶ r⟧ ⟹ p ⟶ q ∧ r *)
 +
  apply (rule impI)    (* ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ q ∧ r *)
 +
  apply (rule conjI)  (* ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ q
 +
                          ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ r *)
 +
  apply (erule mp,
 +
        assumption)+  (* *)
 +
  done
 +
 
text {* ---------------------------------------------------------------  
 
text {* ---------------------------------------------------------------  
 
   Ejercicio 20. Demostrar
 
   Ejercicio 20. Demostrar
Línea 276: Línea 572:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej20: "p ⟶ q ∧ r ⟹ (p ⟶ q) ∧ (p ⟶ r)"
+
lemma ej20a: "p ⟶ q ∧ r ⟹ (p ⟶ q) ∧ (p ⟶ r)"
   apply (rule conjI)
+
   apply (rule conjI)          (* p ⟶ q ∧ r ⟹ p ⟶ q
   apply (rule impI)
+
                                p ⟶ q ∧ r ⟹ p ⟶ r *)
   apply (erule impE)
+
   apply (rule impI)          (* ⟦p ⟶ q ∧ r; p⟧ ⟹ q
     apply assumption
+
                                p ⟶ q ∧ r ⟹ p ⟶ r *)
     apply (erule conjunct1)
+
   apply (drule mp)          (* p ⟹ p
   apply (rule impI)
+
                                ⟦p; q ∧ r⟧ ⟹ q
   apply (erule impE)
+
                                p ⟶ q ∧ r ⟹ p ⟶ r *)
   apply assumption
+
    apply assumption          (* ⟦p; q ∧ r⟧ ⟹ q
   apply (erule conjunct2)
+
                                p ⟶ q ∧ r ⟹ p ⟶ r *)
 +
    apply (erule conjunct1)  (* p ⟶ q ∧ r ⟹ p ⟶ r *)
 +
  apply (rule impI)          (* ⟦p ⟶ q ∧ r; p⟧ ⟹ r *)
 +
  apply (drule mp)            (* p ⟹ p
 +
                                ⟦p; q ∧ r⟧ ⟹ r *)
 +
  apply assumption          (* ⟦p; q ∧ r⟧ ⟹ r *)
 +
  apply (erule conjunct2)    (* *)
 +
  done
 +
      
 +
lemma ej20b: "p ⟶ q ∧ r ⟹ (p ⟶ q) ∧ (p ⟶ r)"
 +
  apply (rule conjI)          (* p ⟶ q ∧ r ⟹ p ⟶ q
 +
                                p ⟶ q ∧ r ⟹ p ⟶ r *)
 +
  apply (rule impI)          (* ⟦p ⟶ q ∧ r; p⟧ ⟹ q
 +
                                p ⟶ q ∧ r ⟹ p ⟶ r *)
 +
  apply (drule mp,
 +
        assumption)          (* ⟦p; q ∧ r⟧ ⟹ q
 +
                                p ⟶ q ∧ r ⟹ p ⟶ r *)
 +
     apply (erule conjunct1)  (* p ⟶ q ∧ r ⟹ p ⟶ r *)
 +
   apply (rule impI)          (* ⟦p ⟶ q ∧ r; p⟧ ⟹ r *)
 +
  apply (drule mp,
 +
        assumption)          (* ⟦p; q ∧ r⟧ ⟹ r *)
 +
   apply (erule conjunct2)    (* *)
 +
  done
 +
   
 +
lemma ej20c: "p ⟶ q ∧ r ⟹ (p ⟶ q) ∧ (p ⟶ r)"
 +
  apply (rule conjI)          (* p ⟶ q ∧ r ⟹ p ⟶ q
 +
                                p ⟶ q ∧ r ⟹ p ⟶ r *)
 +
   apply (rule impI)          (* ⟦p ⟶ q ∧ r; p⟧ ⟹ q
 +
                                p ⟶ q ∧ r ⟹ p ⟶ r *)
 +
  apply (drule mp,
 +
        assumption,
 +
        erule conjunct1)    (* p ⟶ q ∧ r ⟹ p ⟶ r *)
 +
  apply (rule impI)          (* ⟦p ⟶ q ∧ r; p⟧ ⟹ r *)
 +
   apply (drule mp,
 +
        assumption,
 +
        erule conjunct2)    (* *)
 +
  done
 +
   
 +
lemma ej20d: "p ⟶ q ∧ r ⟹ (p ⟶ q) ∧ (p ⟶ r)"
 +
  apply (rule conjI)          (* p ⟶ q ∧ r ⟹ p ⟶ q
 +
                                p ⟶ q ∧ r ⟹ p ⟶ r *)
 +
  apply (rule impI,
 +
        drule mp,
 +
        assumption,
 +
        erule conjunct1)    (* p ⟶ q ∧ r ⟹ p ⟶ r *)
 +
  apply (rule impI,
 +
        drule mp,
 +
        assumption,
 +
        erule conjunct2)    (* *)
 +
  done
 +
   
 +
lemma ej20e: "p ⟶ q ∧ r ⟹ (p ⟶ q) ∧ (p ⟶ r)"
 +
  apply (rule conjI)    (* p ⟶ q ∧ r ⟹ p ⟶ q
 +
                          p ⟶ q ∧ r ⟹ p ⟶ r *)
 +
  apply (rule impI,
 +
        drule mp,
 +
        assumption,
 +
        erule conjE)  (* ⟦p; q; r⟧ ⟹ q
 +
                          p ⟶ q ∧ r ⟹ p ⟶ r *)
 +
  apply assumption    (* p ⟶ q ∧ r ⟹ p ⟶ r *)
 +
  apply (rule impI,
 +
        drule mp,
 +
        assumption,
 +
        erule conjE)  (* ⟦p; q; r⟧ ⟹ r *)
 +
  apply assumption      (* *)
 +
  done
 +
   
 +
lemma ej20f: "p ⟶ q ∧ r ⟹ (p ⟶ q) ∧ (p ⟶ r)"
 +
  apply (rule conjI)          (* p ⟶ q ∧ r ⟹ p ⟶ q
 +
                                p ⟶ q ∧ r ⟹ p ⟶ r *)
 +
  apply (rule impI,
 +
        drule mp,
 +
        assumption,
 +
        erule conjE,
 +
        assumption)+        (* *)
 
   done
 
   done
 
      
 
      
Línea 293: Línea 663:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej21_1: "p ⟶ (q ⟶ r) ⟹ p ∧ q ⟶ r"
+
lemma ej21a: "p ⟶ (q ⟶ r) ⟹ p ∧ q ⟶ r"
   apply (rule impI)
+
   apply (rule impI)        (* ⟦p ⟶ (q ⟶ r); p ∧ q⟧ ⟹ r *)
   apply (erule conjE)
+
  apply (frule conjunct1)  (* ⟦p ⟶ (q ⟶ r); p ∧ q; p⟧ ⟹ r *)
   apply (erule impE)
+
  apply (drule mp)          (* ⟦p ∧ q; p⟧ ⟹ p
   apply assumption
+
                              ⟦p ∧ q; p; q ⟶ r⟧ ⟹ r *)
   apply (erule impE)
+
  apply assumption        (* ⟦p ∧ q; p; q ⟶ r⟧ ⟹ r *)
  apply assumption
+
  apply (drule conjunct2)  (* ⟦p; q ⟶ r; q⟧ ⟹ r *)
   apply assumption
+
  apply (erule mp)          (* ⟦p; q⟧ ⟹ q *)
 +
  apply assumption        (* *)
 +
  done
 +
   
 +
lemma ej21b: "p ⟶ (q ⟶ r) ⟹ p ∧ q ⟶ r"
 +
  apply (rule impI)        (* ⟦p ⟶ (q ⟶ r); p ∧ q⟧ ⟹ r *)
 +
   apply (erule conjE)      (* ⟦p ⟶ (q ⟶ r); p; q⟧ ⟹ r *)
 +
  apply (drule mp)          (* ⟦p; q⟧ ⟹ p
 +
                              ⟦p; q; q ⟶ r⟧ ⟹ r *)
 +
  apply assumption        (* ⟦p; q; q ⟶ r⟧ ⟹ r *)
 +
   apply (erule mp)          (* ⟦p; q⟧ ⟹ q *)
 +
   apply assumption         (* *)
 +
  done
 +
   
 +
lemma ej21c: "p ⟶ (q ⟶ r) ⟹ p ∧ q ⟶ r"
 +
  apply (rule impI)        (* ⟦p ⟶ (q ⟶ r); p ∧ q⟧ ⟹ r *)
 +
   apply (erule conjE)      (* ⟦p ⟶ (q ⟶ r); p; q⟧ ⟹ r *)
 +
  apply (drule mp,
 +
        assumption)        (* ⟦p; q; q ⟶ r⟧ ⟹ r *)
 +
  apply (erule mp,
 +
        assumption)        (* *)
 +
  done
 +
   
 +
lemma ej21d: "p ⟶ (q ⟶ r) ⟹ p ∧ q ⟶ r"
 +
   apply (rule impI)        (* ⟦p ⟶ (q ⟶ r); p ∧ q⟧ ⟹ r *)
 +
  apply (erule conjE)      (* ⟦p ⟶ (q ⟶ r); p; q⟧ ⟹ r *)
 +
  apply (drule mp,
 +
        assumption+)+      (* *)
 
   done
 
   done
 
      
 
      
Línea 308: Línea 705:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej22: "p ∧ q ⟶ r ⟹ p ⟶ (q ⟶ r)"
+
lemma ej22a: "p ∧ q ⟶ r ⟹ p ⟶ (q ⟶ r)"
   apply (rule impI)
+
   apply (rule impI)      (* ⟦p ∧ q ⟶ r; p⟧ ⟹ q ⟶ r *)
   apply (rule impI)
+
   apply (rule impI)      (* ⟦p ∧ q ⟶ r; p; q⟧ ⟹ r *)
   apply (erule impE)
+
   apply (erule mp)      (* ⟦p; q⟧ ⟹ p ∧ q *)
     apply (rule conjI)
+
  apply (rule conjI)    (* ⟦p; q⟧ ⟹ p
     apply assumption+
+
                            ⟦p; q⟧ ⟹ q *)
 +
  apply assumption    (* ⟦p; q⟧ ⟹ q *)
 +
  apply assumption      (* *)
 +
  done
 +
      
 +
lemma ej22b: "p ∧ q ⟶ r ⟹ p ⟶ (q ⟶ r)"
 +
  apply (rule impI)+    (* ⟦p ∧ q ⟶ r; p; q⟧ ⟹ r *)
 +
  apply (erule mp)      (* ⟦p; q⟧ ⟹ p ∧ q *)
 +
  apply (erule conjI)   (* q ⟹ q *)
 +
  apply assumption      (* *)
 +
  done
 +
   
 +
lemma ej22c: "p ∧ q ⟶ r ⟹ p ⟶ (q ⟶ r)"
 +
  apply (rule impI)+     (* ⟦p ∧ q ⟶ r; p; q⟧ ⟹ r *)
 +
  apply (erule mp)      (* ⟦p; q⟧ ⟹ p ∧ q *)
 +
  apply (erule conjI,
 +
        assumption)    (* *)
 
   done
 
   done
 
      
 
      
Línea 321: Línea 734:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej23: "(p ⟶ q) ⟶ r ⟹ p ∧ q ⟶ r"
+
lemma ej23a: "(p ⟶ q) ⟶ r ⟹ p ∧ q ⟶ r"
   apply (rule impI)
+
   apply (rule impI)        (* ⟦(p ⟶ q) ⟶ r; p ∧ q⟧ ⟹ r *)
   apply (erule impE)
+
   apply (erule mp)          (* p ∧ q ⟹ p ⟶ q *)
  apply (rule impI)
+
  apply (rule impI)        (* ⟦p ∧ q; p⟧ ⟹ q *)
  apply (erule conjunct2)
+
  apply (erule conjunct2)  (*  *)
   apply assumption
 
 
   done
 
   done
 
      
 
      
Línea 334: Línea 746:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej24: "p ∧ (q ⟶ r) ⟹ (p ⟶ q) ⟶ r"
+
lemma ej24a: "p ∧ (q ⟶ r) ⟹ (p ⟶ q) ⟶ r"
   apply (rule impI)
+
   apply (rule impI)        (* ⟦p ∧ (q ⟶ r); p ⟶ q⟧ ⟹ r *)
   apply (erule conjE)
+
  apply (frule conjunct1)  (* ⟦p ∧ (q ⟶ r); p ⟶ q; p⟧ ⟹ r *)
   apply (erule impE)
+
  apply (drule mp)          (* ⟦p ∧ (q ⟶ r); p⟧ ⟹ p
   apply assumption
+
                              ⟦p ∧ (q ⟶ r); p; q⟧ ⟹ r *)
   apply (erule impE)
+
  apply assumption        (* ⟦p ∧ (q ⟶ r); p; q⟧ ⟹ r *)
  apply assumption+
+
  apply (drule conjunct2)  (* p; q; q ⟶ r⟧ ⟹ r *)
 +
  apply (erule mp)          (* ⟦p; q⟧ ⟹ q *)
 +
  apply assumption          (* *)
 +
  done
 +
   
 +
lemma ej24b: "p ∧ (q ⟶ r) ⟹ (p ⟶ q) ⟶ r"
 +
  apply (rule impI)        (* ⟦p ∧ (q ⟶ r); p ⟶ q⟧ ⟹ r *)
 +
   apply (erule conjE)      (* ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
 +
   apply (drule mp)          (* ⟦p; q ⟶ r⟧ ⟹ p
 +
                              ⟦p; q ⟶ r; q⟧ ⟹ r *)
 +
   apply assumption         (* ⟦p; q ⟶ r; q⟧ ⟹ r *)
 +
   apply (erule mp)          (* ⟦p; q⟧ ⟹ q *)
 +
  apply assumption          (* *)
 +
  done
 +
   
 +
lemma ej24c: "p ∧ (q ⟶ r) ⟹ (p ⟶ q) ⟶ r"
 +
  apply (rule impI)        (* ⟦p ∧ (q ⟶ r); p ⟶ q⟧ ⟹ r *)
 +
  apply (erule conjE)      (* ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
 +
  apply (drule mp,
 +
        assumption+)+      (* *)
 
   done
 
   done
 
      
 
      
Línea 351: Línea 782:
  
 
lemma ej25: "p ⟹ p ∨ q"
 
lemma ej25: "p ⟹ p ∨ q"
   apply (erule disjI1)
+
   apply (erule disjI1)  (* *)
 
   done
 
   done
 
      
 
      
Línea 360: Línea 791:
  
 
lemma ej26: "q ⟹ p ∨ q"
 
lemma ej26: "q ⟹ p ∨ q"
   apply (erule disjI2)
+
   apply (erule disjI2)  (* *)
 
   done
 
   done
 
      
 
      
Línea 369: Línea 800:
  
 
lemma ej27: "p ∨ q ⟹ q ∨ p"
 
lemma ej27: "p ∨ q ⟹ q ∨ p"
   apply (erule disjE)
+
   apply (erule disjE)    (* p ⟹ q ∨ p
   apply (erule disjI2)
+
                            q ⟹ q ∨ p *)
   apply (erule disjI1)
+
   apply (erule disjI2)  (* q ⟹ q ∨ p *)
 +
   apply (erule disjI1)    (* *)
 
   done
 
   done
 
      
 
      
Línea 380: Línea 812:
  
 
lemma ej28: "q ⟶ r ⟹ p ∨ q ⟶ p ∨ r"
 
lemma ej28: "q ⟶ r ⟹ p ∨ q ⟶ p ∨ r"
   apply (rule impI)
+
   apply (rule impI)      (* ⟦q ⟶ r; p ∨ q⟧ ⟹ p ∨ r *)
   apply (erule disjE)
+
   apply (erule disjE)    (* ⟦q ⟶ r; p⟧ ⟹ p ∨ r
   apply (erule disjI1)
+
                            ⟦q ⟶ r; q⟧ ⟹ p ∨ r *)
   apply (erule impE)
+
   apply (erule disjI1)  (* ⟦q ⟶ r; q⟧ ⟹ p ∨ r *)
   apply assumption
+
   apply (drule mp)        (* q ⟹ q
   apply (erule disjI2)
+
                            ⟦q; r⟧ ⟹ p ∨ r *)
 +
   apply assumption       (* ⟦q; r⟧ ⟹ p ∨ r *)
 +
   apply (erule disjI2)    (* *)
 
   done
 
   done
 
      
 
      
Línea 394: Línea 828:
  
 
lemma ej29: "p ∨ p ⟹ p"
 
lemma ej29: "p ∨ p ⟹ p"
   apply (erule disjE)
+
   apply (erule disjE)  (* p ⟹ p
 +
                          p ⟹ p *)
 
   apply assumption+
 
   apply assumption+
 
   done
 
   done
Línea 404: Línea 839:
  
 
lemma ej30: "p ⟹ p ∨ p"
 
lemma ej30: "p ⟹ p ∨ p"
   apply (erule disjI1)
+
   apply (erule disjI1)  (* *)
 
   done
 
   done
 
      
 
      
Línea 412: Línea 847:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej31: "p ∨ (q ∨ r) ⟹ (p ∨ q) ∨ r"
+
lemma ej31a: "p ∨ (q ∨ r) ⟹ (p ∨ q) ∨ r"
   apply (erule disjE)
+
   apply (erule disjE)    (* p ⟹ (p ∨ q) ∨ r
   apply (rule disjI1)
+
                            q ∨ r ⟹ (p ∨ q) ∨ r *)
   apply (erule disjI1)
+
   apply (rule disjI1)    (* p ⟹ p ∨ q
   apply (erule disjE)
+
                            q ∨ r ⟹ (p ∨ q) ∨ r *)
   apply (rule disjI1)
+
   apply (erule disjI1)  (* q ∨ r ⟹ (p ∨ q) ∨ r *)
   apply (erule disjI2)
+
   apply (erule disjE)    (* q ⟹ (p ∨ q) ∨ r
   apply (erule disjI2)
+
                            r ⟹ (p ∨ q) ∨ r *)
 +
   apply (rule disjI1)    (* q ⟹ p ∨ q
 +
                            r ⟹ (p ∨ q) ∨ r *)
 +
   apply (erule disjI2)  (* r ⟹ (p ∨ q) ∨ r *)
 +
   apply (erule disjI2)    (* *)
 +
  done
 +
   
 +
lemma ej31b: "p ∨ (q ∨ r) ⟹ (p ∨ q) ∨ r"
 +
  apply (erule disjE)    (* p ⟹ (p ∨ q) ∨ r
 +
                            q ∨ r ⟹ (p ∨ q) ∨ r *)
 +
  apply (rule disjI1)    (* p ⟹ p ∨ q
 +
                            q ∨ r ⟹ (p ∨ q) ∨ r *)
 +
  apply (erule disjI1)  (* q ∨ r ⟹ (p ∨ q) ∨ r *)
 +
  apply (erule disjE)    (* q ⟹ (p ∨ q) ∨ r
 +
                            r ⟹ (p ∨ q) ∨ r *)
 +
  apply (rule disjI1,
 +
        erule disjI2)    (* r ⟹ (p ∨ q) ∨ r *)
 +
  apply (erule disjI2)    (* *)
 
   done
 
   done
 
      
 
      
Línea 427: Línea 879:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej32: "(p ∨ q) ∨ r ⟹ p ∨ (q ∨ r)"
+
lemma ej32a: "(p ∨ q) ∨ r ⟹ p ∨ (q ∨ r)"
   apply (erule disjE)
+
   apply (erule disjE)      (* p ∨ q ⟹ p ∨ (q ∨ r)
   apply (erule disjE)
+
                              r ⟹ p ∨ (q ∨ r) *)
     apply (erule disjI1)
+
   apply (erule disjE)    (* p ⟹ p ∨ (q ∨ r)
   apply (rule disjI2)
+
                              q ⟹ p ∨ (q ∨ r)
   apply (erule disjI1)
+
                              r ⟹ p ∨ (q ∨ r) *)
   apply (rule disjI2)
+
     apply (erule disjI1)  (* q ⟹ p ∨ (q ∨ r)
   apply (erule disjI2)
+
                              r ⟹ p ∨ (q ∨ r) *)
 +
   apply (rule disjI2)    (* q ⟹ q ∨ r
 +
                              r ⟹ p ∨ (q ∨ r) *)
 +
   apply (erule disjI1)    (* r ⟹ p ∨ (q ∨ r) *)
 +
   apply (rule disjI2)      (* r ⟹ q ∨ r *)
 +
   apply (erule disjI2)    (* *)
 +
  done
 +
   
 +
lemma ej32b: "(p ∨ q) ∨ r ⟹ p ∨ (q ∨ r)"
 +
  apply (erule disjE)      (* p ∨ q ⟹ p ∨ (q ∨ r)
 +
                              r ⟹ p ∨ (q ∨ r) *)
 +
  apply (erule disjE)    (* p ⟹ p ∨ (q ∨ r)
 +
                              q ⟹ p ∨ (q ∨ r)
 +
                              r ⟹ p ∨ (q ∨ r) *)
 +
    apply (erule disjI1)  (* q ⟹ p ∨ (q ∨ r)
 +
                              r ⟹ p ∨ (q ∨ r) *)
 +
  apply (rule disjI2,
 +
        erule disjI1)    (* r ⟹ p ∨ (q ∨ r) *)
 +
  apply (rule disjI2,
 +
        erule disjI2)    (* *)
 
   done
 
   done
 
      
 
      
Línea 442: Línea 913:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej33: "p ∧ (q ∨ r) ⟹ (p ∧ q) ∨ (p ∧ r)"
+
lemma ej33a: "p ∧ (q ∨ r) ⟹ (p ∧ q) ∨ (p ∧ r)"
   apply (erule conjE)
+
   apply (erule conjE)    (* ⟦p; q ∨ r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
   apply (erule disjE)
+
   apply (erule disjE)    (* ⟦p; q⟧ ⟹ (p ∧ q) ∨ (p ∧ r)
   apply (rule disjI1)
+
                            ⟦p; r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
   apply (rule conjI)
+
   apply (rule disjI1)  (* ⟦p; q⟧ ⟹ p ∧ q
     apply assumption
+
                            ⟦p; r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
   apply assumption
+
   apply (rule conjI)    (* ⟦p; q⟧ ⟹ p
   apply (rule disjI2)
+
                            ⟦p; q⟧ ⟹ q
   apply (rule conjI)
+
                            ⟦p; r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
   apply assumption
+
     apply assumption     (* ⟦p; q⟧ ⟹ q
   apply assumption
+
                            ⟦p; r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
 +
   apply assumption     (* ⟦p; r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
 +
   apply (rule disjI2)    (* ⟦p; r⟧ ⟹ p ∧ r *)
 +
   apply (rule conjI)     (* ⟦p; r⟧ ⟹ p
 +
                            ⟦p; r⟧ ⟹ r *)
 +
  apply assumption      (* ⟦p; r⟧ ⟹ r *)
 +
  apply assumption      (* *)
 +
  done
 +
   
 +
lemma ej33b: "p ∧ (q ∨ r) ⟹ (p ∧ q) ∨ (p ∧ r)"
 +
  apply (erule conjE)   (* ⟦p; q ∨ r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
 +
  apply (erule disjE)    (* ⟦p; q⟧ ⟹ (p ∧ q) ∨ (p ∧ r)
 +
                            ⟦p; r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
 +
  apply (rule disjI1)  (* ⟦p; q⟧ ⟹ p ∧ q
 +
                            ⟦p; r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
 +
  apply (erule conjI,
 +
          assumption)    (* ⟦p; r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
 +
   apply (rule disjI2)    (* ⟦p; r⟧ ⟹ p ∧ r *)
 +
  apply (erule conjI,
 +
        assumption)    (* *)
 
   done
 
   done
 
      
 
      
Línea 460: Línea 950:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej34: "(p ∧ q) ∨ (p ∧ r) ⟹ p ∧ (q ∨ r)"
+
lemma ej34a: "(p ∧ q) ∨ (p ∧ r) ⟹ p ∧ (q ∨ r)"
   apply (rule conjI)
+
  apply (erule disjE)    (* p ∧ q ⟹ p ∧ (q ∨ r)
   apply (erule disjE)
+
                            p ∧ r ⟹ p ∧ (q ∨ r) *)
     apply (erule conjunct1)
+
  apply (erule conjE)  (* ⟦p; q⟧ ⟹ p ∧ (q ∨ r)
   apply (erule conjunct1)
+
                            p ∧ r ⟹ p ∧ (q ∨ r) *)
   apply (erule disjE)
+
  apply (rule conjI)    (* ⟦p; q⟧ ⟹ p
   apply (erule conjE)
+
                            ⟦p; q⟧ ⟹ q ∨ r
   apply (rule disjI1)
+
                            p ∧ r ⟹ p ∧ (q ∨ r) *)
   apply assumption
+
    apply assumption    (* ⟦p; q⟧ ⟹ q ∨ r
   apply (erule conjE)
+
                            p ∧ r ⟹ p ∧ (q ∨ r) *)
   apply (erule disjI2)
+
  apply (rule disjI1)  (* ⟦p; q⟧ ⟹ q
 +
                            p ∧ r ⟹ p ∧ (q ∨ r) *)
 +
  apply assumption      (* p ∧ r ⟹ p ∧ (q ∨ r) *)
 +
  apply (erule conjE)    (* ⟦p; r⟧ ⟹ p ∧ (q ∨ r) *)
 +
  apply (rule conjI)    (* ⟦p; r⟧ ⟹ p
 +
                            ⟦p; r⟧ ⟹ q ∨ r *)
 +
  apply assumption      (* ⟦p; r⟧ ⟹ q ∨ r *)
 +
  apply (erule disjI2)  (* *)
 +
  done
 +
   
 +
lemma ej34b: "(p ∧ q) ∨ (p ∧ r) ⟹ p ∧ (q ∨ r)"
 +
  apply (erule disjE)    (* p ∧ q ⟹ p ∧ (q ∨ r)
 +
                            p ∧ r ⟹ p ∧ (q ∨ r) *)
 +
  apply (erule conjE)  (* ⟦p; q⟧ ⟹ p ∧ (q ∨ r)
 +
                            p ∧ r ⟹ p ∧ (q ∨ r) *)
 +
   apply (rule conjI,
 +
        assumption)    (* ⟦p; q⟧ ⟹ q ∨ r
 +
                            p ∧ r ⟹ p ∧ (q ∨ r) *)
 +
  apply (rule disjI1,
 +
        assumption)    (* p ∧ r ⟹ p ∧ (q ∨ r) *)
 +
  apply (erule conjE)    (* ⟦p; r⟧ ⟹ p ∧ (q ∨ r) *)
 +
  apply (rule conjI,
 +
        assumption)    (* ⟦p; r⟧ ⟹ q ∨ r *)
 +
  apply (erule disjI2)  (* *)
 +
  done
 +
   
 +
lemma ej34c: "(p ∧ q) ∨ (p ∧ r) ⟹ p ∧ (q ∨ r)"
 +
  apply (rule conjI)          (* (p ∧ q) ∨ (p ∧ r) ⟹ p
 +
                                (p ∧ q) ∨ (p ∧ r) ⟹ q ∨ r *)
 +
   apply (erule disjE)        (* p ∧ q ⟹ p
 +
                                p ∧ r ⟹ p
 +
                                (p ∧ q) ∨ (p ∧ r) ⟹ q ∨ r *)
 +
     apply (erule conjunct1)  (* p ∧ r ⟹ p
 +
                                (p ∧ q) ∨ (p ∧ r) ⟹ q ∨ r *)
 +
   apply (erule conjunct1)    (* (p ∧ q) ∨ (p ∧ r) ⟹ q ∨ r *)
 +
   apply (erule disjE)        (* p ∧ q ⟹ q ∨ r
 +
                                p ∧ r ⟹ q ∨ r *)
 +
   apply (drule conjunct2)    (* q ⟹ q ∨ r
 +
                                p ∧ r ⟹ q ∨ r *)
 +
   apply (rule disjI1)        (* q ⟹ q
 +
                                p ∧ r ⟹ q ∨ r *)
 +
   apply assumption           (* p ∧ r ⟹ q ∨ r *)
 +
   apply (drule conjunct2)    (* r ⟹ q ∨ r *)
 +
   apply (erule disjI2)        (* *)
 
   done
 
   done
 
      
 
      
Línea 478: Línea 1011:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej35: "p ∨ (q ∧ r) ⟹ (p ∨ q) ∧ (p ∨ r)"
+
lemma ej35a: "p ∨ (q ∧ r) ⟹ (p ∨ q) ∧ (p ∨ r)"
   apply (erule disjE)
+
   apply (erule disjE)      (* p ⟹ (p ∨ q) ∧ (p ∨ r)
   apply (rule conjI)
+
                              q ∧ r ⟹ (p ∨ q) ∧ (p ∨ r) *)
     apply (erule disjI1)
+
   apply (rule conjI)      (* p ⟹ p ∨ q
   apply (erule disjI1)
+
                              p ⟹ p ∨ r
   apply (erule conjE)
+
                              q ∧ r ⟹ (p ∨ q) ∧ (p ∨ r) *)
   apply (rule conjI)
+
     apply (erule disjI1)  (* p ⟹ p ∨ r
   apply (erule disjI2)
+
                              q ∧ r ⟹ (p ∨ q) ∧ (p ∨ r) *)
   apply (erule disjI2)
+
   apply (erule disjI1)    (* q ∧ r ⟹ (p ∨ q) ∧ (p ∨ r) *)
 +
   apply (erule conjE)      (* ⟦q; r⟧ ⟹ (p ∨ q) ∧ (p ∨ r) *)
 +
   apply (rule conjI)      (* ⟦q; r⟧ ⟹ p ∨ q
 +
                              ⟦q; r⟧ ⟹ p ∨ r *)
 +
   apply (erule disjI2)    (* ⟦q; r⟧ ⟹ p ∨ r *)
 +
   apply (erule disjI2)    (* *)
 
   done
 
   done
 
      
 
      
 +
lemma ej35b: "p ∨ (q ∧ r) ⟹ (p ∨ q) ∧ (p ∨ r)"
 +
  apply (rule conjI)        (* p ∨ (q ∧ r) ⟹ p ∨ q
 +
                                p ∨ (q ∧ r) ⟹ p ∨ r *)
 +
  apply (erule disjE)      (* p ⟹ p ∨ q
 +
                                q ∧ r ⟹ p ∨ q
 +
                                p ∨ (q ∧ r) ⟹ p ∨ r *)
 +
    apply (erule disjI1)    (* q ∧ r ⟹ p ∨ q
 +
                                p ∨ (q ∧ r) ⟹ p ∨ r *)
 +
  apply (drule conjunct1)  (* q ⟹ p ∨ q
 +
                                p ∨ (q ∧ r) ⟹ p ∨ r *)
 +
  apply (erule disjI2)      (* p ∨ (q ∧ r) ⟹ p ∨ r *)
 +
  apply (erule disjE)        (* p ⟹ p ∨ r
 +
                                q ∧ r ⟹ p ∨ r *)
 +
  apply (erule disjI1)      (* q ∧ r ⟹ p ∨ r *)
 +
  apply (drule conjunct2)    (* r ⟹ p ∨ r *)
 +
  apply (erule disjI2)      (* *)
 +
  done
 +
 
text {* ---------------------------------------------------------------  
 
text {* ---------------------------------------------------------------  
 
   Ejercicio 36. Demostrar
 
   Ejercicio 36. Demostrar
Línea 494: Línea 1050:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej36: "(p ∨ q) ∧ (p ∨ r) ⟹ p ∨ (q ∧ r)"
+
lemma ej36a: "(p ∨ q) ∧ (p ∨ r) ⟹ p ∨ (q ∧ r)"
   apply (erule conjE)
+
   apply (erule conjE)    (* ⟦p ∨ q; p ∨ r⟧ ⟹ p ∨ (q ∧ r) *)
   apply (erule disjE)
+
   apply (erule disjE)    (* ⟦p ∨ r; p⟧ ⟹ p ∨ (q ∧ r)
   apply (erule disjI1)
+
                            ⟦p ∨ r; q⟧ ⟹ p ∨ (q ∧ r) *)
   apply (erule disjE)
+
   apply (erule disjI1)  (* ⟦p ∨ r; q⟧ ⟹ p ∨ (q ∧ r) *)
   apply (erule disjI1)
+
   apply (erule disjE)    (* ⟦q; p⟧ ⟹ p ∨ (q ∧ r)
   apply (rule disjI2)
+
                            ⟦q; r⟧ ⟹ p ∨ (q ∧ r) *)
   apply (rule conjI)
+
   apply (erule disjI1)  (* ⟦q; r⟧ ⟹ p ∨ (q ∧ r) *)
   apply assumption+
+
   apply (rule disjI2)    (* ⟦q; r⟧ ⟹ q ∧ r *)
 +
   apply (rule conjI)      (* ⟦q; r⟧ ⟹ q
 +
                            ⟦q; r⟧ ⟹ r *)
 +
   apply assumption       (* ⟦q; r⟧ ⟹ r *)
 +
  apply assumption        (* *)
 
   done
 
   done
 
      
 
      
Línea 510: Línea 1070:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej37: "(p ⟶ r) ∧ (q ⟶ r) ⟹ p ∨ q ⟶ r"
+
lemma ej37a: "(p ⟶ r) ∧ (q ⟶ r) ⟹ p ∨ q ⟶ r"
   apply (rule impI)
+
   apply (rule impI)          (* ⟦(p ⟶ r) ∧ (q ⟶ r); p ∨ q⟧ ⟹ r *)
   apply (erule conjE)
+
   apply (erule conjE)        (* ⟦p ∨ q; p ⟶ r; q ⟶ r⟧ ⟹ r *)
   apply (erule disjE)
+
   apply (erule disjE)        (* ⟦p ⟶ r; q ⟶ r; p⟧ ⟹ r
   apply (erule impE, assumption+)+
+
                                ⟦p ⟶ r; q ⟶ r; q⟧ ⟹ r *)
 +
   apply (erule mp)          (* ⟦q ⟶ r; p⟧ ⟹ p
 +
                                ⟦p ⟶ r; q ⟶ r; q⟧ ⟹ r *)
 +
  apply assumption          (* ⟦p ⟶ r; q ⟶ r; q⟧ ⟹ r *)
 +
  apply (erule_tac P=q in mp) (* ⟦p ⟶ r; q⟧ ⟹ q *)
 +
  apply assumption            (* *)
 +
  done
 +
   
 +
lemma ej37b: "(p ⟶ r) ∧ (q ⟶ r) ⟹ p ∨ q ⟶ r"
 +
  apply (rule impI)      (* (p ⟶ r) ∧ (q ⟶ r) ⟹ p ∨ q ⟹ r *)   
 +
  apply (erule conjE)    (* ⟦p ∨ q; p ⟶ r; q ⟶ r⟧ ⟹ r *)
 +
  apply (erule disjE)    (* ⟦p ⟶ r; q ⟶ r; p⟧ ⟹ r
 +
                            ⟦p ⟶ r; q ⟶ r; q⟧ ⟹ r *)
 +
  apply (erule mp,  
 +
          assumption+)+   (* *)
 
   done
 
   done
 
      
 
      
Línea 522: Línea 1096:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej38: "p ∨ q ⟶ r ⟹ (p ⟶ r) ∧ (q ⟶ r)"
+
lemma ej38a: "p ∨ q ⟶ r ⟹ (p ⟶ r) ∧ (q ⟶ r)"
   apply (rule conjI)
+
   apply (rule conjI)      (* p ∨ q ⟶ r ⟹ p ⟶ r
   apply (rule impI)
+
                            p ∨ q ⟶ r ⟹ q ⟶ r *)
   apply (erule impE)
+
   apply (rule impI)      (* ⟦p ∨ q ⟶ r; p⟧ ⟹ r
     apply (erule disjI1)
+
                            p ∨ q ⟶ r ⟹ q ⟶ r *)
  apply assumption
+
   apply (erule mp)      (* p ⟹ p ∨ q
   apply (rule impI)
+
                            p ∨ q ⟶ r ⟹ q ⟶ r *)
   apply (erule impE)
+
     apply (erule disjI1) (* p ∨ q ⟶ r ⟹ q ⟶ r *)
   apply (erule disjI2)
+
   apply (rule impI)      (* ⟦p ∨ q ⟶ r; q⟧ ⟹ r *)
  apply assumption
+
   apply (erule mp)        (* q ⟹ p ∨ q *)
 +
   apply (erule disjI2)   (* *)
 
   done
 
   done
 
      
 
      
Línea 542: Línea 1117:
  
 
lemma ej39: "p ⟹ ¬¬p"
 
lemma ej39: "p ⟹ ¬¬p"
   apply (rule notI)
+
   apply (rule notI)    (* ⟦p; ¬ p⟧ ⟹ False *)
   apply (erule notE)
+
   apply (erule notE)  (* p ⟹ p *)
   apply assumption
+
   apply assumption     (* *)
 
   done
 
   done
 
      
 
      
Línea 553: Línea 1128:
  
 
lemma ej40: "¬p ⟹ p ⟶ q"
 
lemma ej40: "¬p ⟹ p ⟶ q"
   apply (rule impI)
+
   apply (rule impI)  (* ⟦¬ p; p⟧ ⟹ q *)
   apply (erule notE)
+
   apply (erule notE)  (* p ⟹ p *)
   apply assumption
+
   apply assumption   (* *)
 
   done
 
   done
 
      
 
      
Línea 564: Línea 1139:
  
 
lemma ej41: "p ⟶ q ⟹ ¬q ⟶ ¬p"
 
lemma ej41: "p ⟶ q ⟹ ¬q ⟶ ¬p"
   apply (rule impI)
+
   apply (rule impI)   (* ⟦p ⟶ q; ¬ q⟧ ⟹ ¬ p *) 
   apply (rule notI)
+
   apply (rule notI)    (* ⟦p ⟶ q; ¬ q; p⟧ ⟹ False *)
   apply (erule impE)
+
   apply (drule mp)    (* ⟦¬ q; p⟧ ⟹ p
   apply assumption
+
                          ⟦¬ q; p; q⟧ ⟹ False *)
   apply (erule notE)
+
   apply assumption   (* ⟦¬ q; p; q⟧ ⟹ False *)
   apply assumption
+
   apply (erule notE)  (* ⟦p; q⟧ ⟹ q *)
 +
   apply assumption     (* *)
 
   done
 
   done
 
      
 
      
Línea 578: Línea 1154:
  
 
lemma ej42: "⟦p ∨ q; ¬q⟧ ⟹ p"
 
lemma ej42: "⟦p ∨ q; ¬q⟧ ⟹ p"
   apply (erule disjE)
+
   apply (erule disjE)  (* ⟦¬ q; p⟧ ⟹ p
   apply assumption
+
                          ⟦¬ q; q⟧ ⟹ p *)
   apply (erule notE)
+
   apply assumption     (* ⟦¬ q; q⟧ ⟹ p  *)
   apply assumption
+
   apply (erule notE)    (* q ⟹ q *)
 +
   apply assumption     (* *)
 
   done
 
   done
 
      
 
      
Línea 590: Línea 1167:
  
 
lemma ej43: "⟦p ∨ q; ¬p⟧ ⟹ q"
 
lemma ej43: "⟦p ∨ q; ¬p⟧ ⟹ q"
   apply (erule disjE)
+
   apply (erule disjE)  (* ⟦¬ p; p⟧ ⟹ q
   apply (erule notE)
+
                          ⟦¬ p; q⟧ ⟹ q *)
   apply assumption
+
   apply (erule notE)  (* p ⟹ p
   apply assumption
+
                          ⟦¬ p; q⟧ ⟹ q *)
 +
   apply assumption     (* ⟦¬ p; q⟧ ⟹ q *)
 +
   apply assumption     (* ⟦¬ p; q⟧ ⟹ q *)
 
   done
 
   done
 
      
 
      
Línea 601: Línea 1180:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
 +
lemma ej44a: "p ∨ q ⟹ ¬(¬p ∧ ¬q)"
 +
  apply (rule notI)              (* ⟦p ∨ q; ¬ p ∧ ¬ q⟧ ⟹ False *)
 +
  apply (erule conjE)            (* ⟦p ∨ q; ¬ p; ¬ q⟧ ⟹ False *)
 +
  apply (erule disjE)            (* ⟦¬ p; ¬ q; p⟧ ⟹ False
 +
                                    ⟦¬ p; ¬ q; q⟧ ⟹ False *)
 +
  apply (erule notE)            (* ⟦¬ q; p⟧ ⟹ p
 +
                                    ⟦¬ p; ¬ q; q⟧ ⟹ False *)
 +
  apply assumption              (* ⟦¬ p; ¬ q; q⟧ ⟹ False *)
 +
  apply (erule_tac P=q in notE)  (* ⟦¬ p; q⟧ ⟹ q *)
 +
  apply assumption              (* *)
 +
  done
 +
   
 
lemma ej44: "p ∨ q ⟹ ¬(¬p ∧ ¬q)"
 
lemma ej44: "p ∨ q ⟹ ¬(¬p ∧ ¬q)"
   apply (rule notI)
+
   apply (rule notI)                (* ⟦p ∨ q; ¬ p ∧ ¬ q⟧ ⟹ False *)
   apply (erule conjE)
+
   apply (erule conjE)              (* ⟦p ∨ q; ¬ p; ¬ q⟧ ⟹ False *)
   apply (erule disjE)
+
   apply (erule disjE)              (* ⟦¬ p; ¬ q; p⟧ ⟹ False
   apply (erule notE, assumption)+
+
                                      ⟦¬ p; ¬ q; q⟧ ⟹ False *)
   done
+
   apply (erule notE, assumption)+ (* *)
 +
   done                          
 
      
 
      
 
text {* ---------------------------------------------------------------  
 
text {* ---------------------------------------------------------------  
Línea 613: Línea 1205:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej45: "p ∧ q ⟹ ¬(¬p ∨ ¬q)"
+
lemma ej45a: "p ∧ q ⟹ ¬(¬p ∨ ¬q)"
   apply (rule notI)
+
   apply (rule notI)    (* ⟦p ∧ q; ¬ p ∨ ¬ q⟧ ⟹ False *)
   apply (erule conjE)
+
  apply (erule conjE)  (* ⟦¬ p ∨ ¬ q; p; q⟧ ⟹ False *)
   apply (erule disjE)
+
  apply (erule disjE)  (* ⟦p; q; ¬ p⟧ ⟹ False
   apply (erule notE, assumption)+
+
                          ⟦p; q; ¬ q⟧ ⟹ False *)
 +
  apply (erule notE)  (* ⟦p; q⟧ ⟹ p
 +
                          ⟦p; q; ¬ q⟧ ⟹ False *)
 +
  apply assumption    (* ⟦p; q; ¬ q⟧ ⟹ False *)
 +
  apply (erule notE)    (* ⟦p; q⟧ ⟹ q *)
 +
  apply assumption      (* *)
 +
  done
 +
   
 +
lemma ej45b: "p ∧ q ⟹ ¬(¬p ∨ ¬q)"
 +
  apply (rule notI)    (* ⟦p ∧ q; ¬ p ∨ ¬ q⟧ ⟹ False *)
 +
   apply (erule conjE)  (* ⟦¬ p ∨ ¬ q; p; q⟧ ⟹ False *)  
 +
   apply (erule disjE)  (* ⟦p; q; ¬ p⟧ ⟹ False
 +
                          ⟦p; q; ¬ q⟧ ⟹ False *)
 +
  apply (erule notE,
 +
        assumption)   (* ⟦p; q; ¬ q⟧ ⟹ False *)
 +
  apply (erule notE,
 +
        assumption)    (* *)
 +
  done
 +
   
 +
lemma ej45c: "p ∧ q ⟹ ¬(¬p ∨ ¬q)"
 +
  apply (rule notI)    (* ⟦p ∧ q; ¬ p ∨ ¬ q⟧ ⟹ False *)
 +
  apply (erule conjE)  (* ⟦¬ p ∨ ¬ q; p; q⟧ ⟹ False *)
 +
  apply (erule disjE)  (* ⟦p; q; ¬ p⟧ ⟹ False
 +
                          ⟦p; q; ¬ q⟧ ⟹ False *)
 +
  apply (erule notE,
 +
        assumption)+   (* *)
 
   done
 
   done
 
      
 
      
Línea 625: Línea 1242:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej46: "¬(p ∨ q) ⟹ ¬p ∧ ¬q"
+
lemma ej46b: "¬(p ∨ q) ⟹ ¬p ∧ ¬q"
   apply (rule conjI)
+
   apply (rule conjI)    (* ¬ (p ∨ q) ⟹ ¬ p
   apply (rule notI)
+
                            ¬ (p ∨ q) ⟹ ¬ q *)
   apply (erule notE)
+
   apply (rule notI)    (* ⟦¬ (p ∨ q); p⟧ ⟹ False
   apply (erule disjI1)
+
                            ¬ (p ∨ q) ⟹ ¬ q *)
   apply (rule notI)
+
   apply (erule notE)    (* p ⟹ p ∨ q
   apply (erule notE)
+
                            ¬ (p ∨ q) ⟹ ¬ q *)
   apply (erule disjI2)
+
   apply (erule disjI1)  (* ¬ (p ∨ q) ⟹ ¬ q *)
 +
   apply (rule notI)      (* ⟦¬ (p ∨ q); q⟧ ⟹ False *)
 +
   apply (erule notE)    (* q ⟹ p ∨ q *)
 +
   apply (erule disjI2)  (* *)
 +
  done
 +
   
 +
lemma ej46b: "¬(p ∨ q) ⟹ ¬p ∧ ¬q"
 +
  apply (rule conjI)      (* ¬ (p ∨ q) ⟹ ¬ p
 +
                              ¬ (p ∨ q) ⟹ ¬ q *)
 +
  apply (rule notI,
 +
        erule notE,
 +
        (erule disjI1 |
 +
          erule disjI2))+  (* *)
 
   done
 
   done
 +
   
 +
lemma ej46c: "¬(p ∨ q) ⟹ ¬p ∧ ¬q"
 +
  by (rule conjI,
 +
      (rule notI,
 +
      erule notE,
 +
      (erule disjI1 |
 +
        erule disjI2))+)
 
      
 
      
 
text {* ---------------------------------------------------------------  
 
text {* ---------------------------------------------------------------  
Línea 639: Línea 1275:
 
     ¬p ∧ ¬q ⊢ ¬(p ∨ q)
 
     ¬p ∧ ¬q ⊢ ¬(p ∨ q)
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
 +
 +
lemma ej47a: "¬p ∧ ¬q ⟹ ¬(p ∨ q)"
 +
  apply (rule notI)              (* ⟦¬ p ∧ ¬ q; p ∨ q⟧ ⟹ False *)
 +
  apply (erule disjE)            (* ⟦¬ p ∧ ¬ q; p⟧ ⟹ False
 +
                                    ⟦¬ p ∧ ¬ q; q⟧ ⟹ False *)
 +
  apply (drule conjunct1)      (* ⟦p; ¬ p⟧ ⟹ False
 +
                                    ⟦¬ p ∧ ¬ q; q⟧ ⟹ False *)
 +
  apply (erule notE)            (* p ⟹ p
 +
                                    ⟦¬ p ∧ ¬ q; q⟧ ⟹ False *)
 +
  apply assumption              (* ⟦¬ p ∧ ¬ q; q⟧ ⟹ False*)
 +
  apply (drule conjunct2)        (* ⟦q; ¬ q⟧ ⟹ False *)
 +
  apply (erule notE)            (* q ⟹ q *)
 +
  apply assumption              (* *)
 +
 +
lemma ej47b: "¬p ∧ ¬q ⟹ ¬(p ∨ q)"
 +
  apply (rule notI)              (* ⟦¬ p ∧ ¬ q; p ∨ q⟧ ⟹ False *)
 +
  apply (erule disjE)            (* ⟦¬ p ∧ ¬ q; p⟧ ⟹ False
 +
                                    ⟦¬ p ∧ ¬ q; q⟧ ⟹ False *)
 +
  apply ((drule conjunct1 |
 +
          drule conjunct2),
 +
        erule notE,
 +
        assumption)+            (* *)
  
 
lemma ej47: "¬p ∧ ¬q ⟹ ¬(p ∨ q)"
 
lemma ej47: "¬p ∧ ¬q ⟹ ¬(p ∨ q)"
   apply (rule notI)
+
   apply (rule notI)    (* ⟦¬ p ∧ ¬ q; p ∨ q⟧ ⟹ False *)
   apply (erule conjE)
+
   apply (erule conjE)  (* ⟦p ∨ q; ¬ p; ¬ q⟧ ⟹ False *)
 
   apply (erule disjE)
 
   apply (erule disjE)
   apply (erule notE, assumption)+
+
   apply (erule notE,  
 +
          assumption)+ (* *)
 
   done
 
   done
 
      
 
      
Línea 652: Línea 1311:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej48: "¬p ∨ ¬q ⟹ ¬(p ∧ q)"
+
lemma ej48a: "¬p ∨ ¬q ⟹ ¬(p ∧ q)"
   apply (rule notI)
+
   apply (rule notI)        (* ⟦¬ p ∨ ¬ q; p ∧ q⟧ ⟹ False *)
   apply (erule conjE)
+
  apply (erule disjE)      (* ⟦p ∧ q; ¬ p⟧ ⟹ False
   apply (erule disjE)
+
                              ⟦p ∧ q; ¬ q⟧ ⟹ False *)
   apply (erule notE, assumption)+
+
  apply (drule conjunct1)  (* ⟦¬ p; p⟧ ⟹ False
 +
                              ⟦p ∧ q; ¬ q⟧ ⟹ False *)
 +
  apply (erule notE)      (* p ⟹ p
 +
                              ⟦p ∧ q; ¬ q⟧ ⟹ False *)
 +
  apply assumption        (* ⟦p ∧ q; ¬ q⟧ ⟹ False *)
 +
  apply (drule conjunct2)  (* ⟦¬ q; q⟧ ⟹ False *)
 +
  apply (erule notE)        (* q ⟹ q *)
 +
  apply assumption          (* *)
 +
  done
 +
 
 +
lemma ej48b: "¬p ∨ ¬q ⟹ ¬(p ∧ q)"
 +
  apply (rule notI)    (* ⟦¬ p ∨ ¬ q; p ∧ q⟧ ⟹ False *)
 +
   apply (erule conjE)  (* ⟦¬ p ∨ ¬ q; p; q⟧ ⟹ False *)
 +
   apply (erule disjE)  (* ⟦p; q; ¬ p⟧ ⟹ False
 +
                          ⟦p; q; ¬ q⟧ ⟹ False *)
 +
   apply (erule notE,  
 +
          assumption)+ (* *)
 
   done
 
   done
 
      
 
      
Línea 665: Línea 1340:
  
 
lemma ej49: "¬(p ∧ ¬p)"
 
lemma ej49: "¬(p ∧ ¬p)"
   apply (rule notI)
+
   apply (rule notI)    (* p ∧ ¬ p ⟹ False *)
   apply (erule conjE)
+
   apply (erule conjE)  (* ⟦p; ¬ p⟧ ⟹ False *)
   apply (erule notE)
+
   apply (erule notE)    (* ⟦p; ¬ p⟧ ⟹ False *)
   apply assumption
+
   apply assumption     (* *)
 
   done
 
   done
 
      
 
      
Línea 677: Línea 1352:
  
 
lemma ej50: "p ∧ ¬p ⟹ q"
 
lemma ej50: "p ∧ ¬p ⟹ q"
   apply (erule conjE)
+
   apply (erule conjE)  (* ⟦p; ¬ p⟧ ⟹ q *)
   apply (erule notE)
+
   apply (erule notE)  (* p ⟹ p *)
   apply assumption
+
   apply assumption     (* *)
 
   done
 
   done
 
      
 
      
Línea 688: Línea 1363:
  
 
lemma ej51: "¬¬p ⟹ p"
 
lemma ej51: "¬¬p ⟹ p"
   apply (erule notnotD)
+
   apply (erule notnotD)  (* *)
 
   done
 
   done
 
      
 
      
Línea 697: Línea 1372:
  
 
lemma ej52: "p ∨ ¬p"
 
lemma ej52: "p ∨ ¬p"
   apply (cut_tac P="¬p" in excluded_middle)
+
   apply (cut_tac P="¬p" in excluded_middle) (* ¬¬p ∨ ¬p ⟹ p ∨ ¬p*)
   apply (erule disjE)
+
   apply (erule disjE)                      (* ¬ ¬ p ⟹ p ∨ ¬ p
   apply (rule disjI1)
+
                                              ¬ p ⟹ p ∨ ¬ p *)  
   apply (erule notnotD)
+
   apply (rule disjI1)                      (* ¬ ¬ p ⟹ p
   apply (erule disjI2)
+
                                              ¬ p ⟹ p ∨ ¬ p *)
 +
   apply (erule notnotD)                    (* ¬ p ⟹ p ∨ ¬ p *)  
 +
   apply (erule disjI2)                      (* *)
 
   done
 
   done
 
      
 
      
Línea 710: Línea 1387:
  
 
lemma ej53: "((p ⟶ q) ⟶ p) ⟶ p"
 
lemma ej53: "((p ⟶ q) ⟶ p) ⟶ p"
  apply (rule impI)
 
  apply (rule ccontr)
 
 
   apply (cut_tac P="p ⟶ q" in excluded_middle)
 
   apply (cut_tac P="p ⟶ q" in excluded_middle)
   apply (erule disjE)
+
                      (* ¬ (p ⟶ q) ∨ (p ⟶ q) ⟹
 +
                          ((p ⟶ q) ⟶ p) ⟶ p *)
 +
   apply (erule disjE)  (* ¬ (p ⟶ q) ⟹ ((p ⟶ q) ⟶ p) ⟶ p
 +
                          p ⟶ q ⟹ ((p ⟶ q) ⟶ p) ⟶ p *)
 +
  apply (rule impI)  (* ⟦¬ (p ⟶ q); (p ⟶ q) ⟶ p⟧ ⟹ p
 +
                          p ⟶ q ⟹ ((p ⟶ q) ⟶ p) ⟶ p *)
 +
  apply (rule ccontr)  (* ⟦¬ (p ⟶ q); (p ⟶ q) ⟶ p; ¬ p⟧ ⟹ False
 +
                          p ⟶ q ⟹ ((p ⟶ q) ⟶ p) ⟶ p *)
 
   apply (erule_tac P="p ⟶ q" in notE)
 
   apply (erule_tac P="p ⟶ q" in notE)
   apply (rule impI)
+
                      (* ⟦(p ⟶ q) ⟶ p; ¬ p⟧ ⟹ p ⟶ q
   apply (erule notE)
+
                          p ⟶ q ⟹ ((p ⟶ q) ⟶ p) ⟶ p *)
   apply assumption
+
   apply (rule impI)  (* ⟦(p ⟶ q) ⟶ p; ¬ p; p⟧ ⟹ q
   apply (erule impE)
+
                          p ⟶ q ⟹ ((p ⟶ q) ⟶ p) ⟶ p *)
   apply assumption
+
   apply (erule notE)  (* ⟦(p ⟶ q) ⟶ p; p⟧ ⟹ p
   apply (erule notE)
+
                          p ⟶ q ⟹ ((p ⟶ q) ⟶ p) ⟶ p *)  
   apply assumption
+
   apply assumption   (* p ⟶ q ⟹ ((p ⟶ q) ⟶ p) ⟶ p *)
  done
+
   apply (rule impI)    (* ⟦p ⟶ q; (p ⟶ q) ⟶ p⟧ ⟹ p *)
   
+
   apply (erule_tac P="p ⟶q" in mp)
 +
                      (*  p ⟶ q ⟹ p ⟶ q *)
 +
   apply assumption     (* *)
 +
 
 
text {* ---------------------------------------------------------------  
 
text {* ---------------------------------------------------------------  
 
   Ejercicio 54. Demostrar
 
   Ejercicio 54. Demostrar
Línea 730: Línea 1415:
  
 
lemma ej54: "¬q ⟶ ¬p ⟹ p ⟶ q"
 
lemma ej54: "¬q ⟶ ¬p ⟹ p ⟶ q"
   apply (rule impI)
+
   apply (rule impI)      (* ⟦¬ q ⟶ ¬ p; p⟧ ⟹ q *)
   apply (rule ccontr)
+
   apply (rule notnotD)  (* ⟦¬ q ⟶ ¬ p; p⟧ ⟹ ¬ ¬ q *)
   apply (erule impE)
+
   apply (erule mt)      (* p ⟹ ¬ ¬ p *)
  apply assumption
+
   apply (erule notnotI)  (* *)
   apply (erule notE)+
 
  apply assumption
 
 
   done
 
   done
   
+
 
 
text {* ---------------------------------------------------------------  
 
text {* ---------------------------------------------------------------  
 
   Ejercicio 55. Demostrar
 
   Ejercicio 55. Demostrar
Línea 745: Línea 1428:
 
lemma ej55: "¬(¬p ∧ ¬q) ⟹ p ∨ q"
 
lemma ej55: "¬(¬p ∧ ¬q) ⟹ p ∨ q"
 
   apply (cut_tac P=p in excluded_middle)
 
   apply (cut_tac P=p in excluded_middle)
   apply (erule disjE)
+
                        (* ⟦¬ (¬ p ∧ ¬ q); ¬ p ∨ p⟧ ⟹ p ∨ q *) 
    apply (cut_tac P=q in excluded_middle)
+
   apply (erule disjE)  (* ⟦¬ (¬ p ∧ ¬ q); ¬ p⟧ ⟹ p ∨ q
   apply (erule disjE)
+
                          ⟦¬ (¬ p ∧ ¬ q); p⟧ ⟹ p ∨ q *)
     apply (erule notE)
+
  apply (cut_tac P=q in excluded_middle)
     apply (rule conjI)
+
                        (* ⟦¬ (¬ p ∧ ¬ q); ¬ p; ¬ q ∨ q⟧ ⟹ p ∨ q
     apply assumption+
+
                          ⟦¬ (¬ p ∧ ¬ q); p⟧ ⟹ p ∨ q *)
   apply (erule disjI2)
+
   apply (erule disjE)  (* ⟦¬ (¬ p ∧ ¬ q); ¬ p; ¬ q⟧ ⟹ p ∨ q
   apply (erule disjI1)
+
                          ⟦¬ (¬ p ∧ ¬ q); ¬ p; q⟧ ⟹ p ∨ q
 +
                          ⟦¬ (¬ p ∧ ¬ q); p⟧ ⟹ p ∨ q *)
 +
     apply (erule notE)  (* ⟦¬ p; ¬ q⟧ ⟹ ¬ p ∧ ¬ q
 +
                          ⟦¬ (¬ p ∧ ¬ q); ¬ p; q⟧ ⟹ p ∨ q
 +
                          ⟦¬ (¬ p ∧ ¬ q); p⟧ ⟹ p ∨ q *)
 +
     apply (rule conjI)  (* ⟦¬ p; ¬ q⟧ ⟹ ¬ p
 +
                          ⟦¬ p; ¬ q⟧ ⟹ ¬ q
 +
                          ⟦¬ (¬ p ∧ ¬ q); ¬ p; q⟧ ⟹ p ∨ q
 +
                          ⟦¬ (¬ p ∧ ¬ q); p⟧ ⟹ p ∨ q *)
 +
     apply assumption+ (* ⟦¬ (¬ p ∧ ¬ q); ¬ p; q⟧ ⟹ p ∨ q
 +
                          ⟦¬ (¬ p ∧ ¬ q); p⟧ ⟹ p ∨ q *)
 +
   apply (erule disjI2) (* ⟦¬ (¬ p ∧ ¬ q); p⟧ ⟹ p ∨ q *)
 +
   apply (erule disjI1)  (* *)
 
   done
 
   done
 
      
 
      
Línea 760: Línea 1455:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej56: "¬(¬p ∨ ¬q) ⟹ p ∧ q"
+
lemma ej56a: "¬(¬p ∨ ¬q) ⟹ p ∧ q"
   apply (rule conjI)
+
   apply (rule conjI)    (* ¬ (¬ p ∨ ¬ q) ⟹ p
   apply (rule ccontr)
+
                            ¬ (¬ p ∨ ¬ q) ⟹ q *)
   apply (erule notE)
+
   apply (rule ccontr)  (* ⟦¬ (¬ p ∨ ¬ q); ¬ p⟧ ⟹ False
   apply (erule disjI1)
+
                            ¬ (¬ p ∨ ¬ q) ⟹ q *)
   apply (rule ccontr)
+
   apply (erule notE)    (* ¬ p ⟹ ¬ p ∨ ¬ q
   apply (erule notE)
+
                            ¬ (¬ p ∨ ¬ q) ⟹ q *)
   apply (erule disjI2)
+
   apply (erule disjI1)  (* ¬ (¬ p ∨ ¬ q) ⟹ q *)
 +
   apply (rule ccontr)    (* ⟦¬ (¬ p ∨ ¬ q); ¬ q⟧ ⟹ False *)
 +
   apply (erule notE)    (* ¬ q ⟹ ¬ p ∨ ¬ q *)
 +
   apply (erule disjI2)  (* *)
 
   done
 
   done
 
      
 
      
Línea 777: Línea 1475:
 
lemma ej57: "¬(p ∧ q) ⟹ ¬p ∨ ¬q"
 
lemma ej57: "¬(p ∧ q) ⟹ ¬p ∨ ¬q"
 
   apply (cut_tac P=p in excluded_middle)
 
   apply (cut_tac P=p in excluded_middle)
   apply (erule disjE)
+
                        (* ⟦¬ (p ∧ q); ¬ p ∨ p⟧ ⟹ ¬ p ∨ ¬ q *)
   apply (erule disjI1)
+
   apply (erule disjE)    (* ⟦¬ (p ∧ q); ¬ p⟧ ⟹ ¬ p ∨ ¬ q
 +
                            ⟦¬ (p ∧ q); p⟧ ⟹ ¬ p ∨ ¬ q *)
 +
   apply (erule disjI1)  (* ⟦¬ (p ∧ q); p⟧ ⟹ ¬ p ∨ ¬ q *)
 
   apply (cut_tac P=q in excluded_middle)
 
   apply (cut_tac P=q in excluded_middle)
   apply (erule disjE)
+
                        (* ⟦¬ (p ∧ q); p; ¬ q ∨ q⟧ ⟹ ¬ p ∨ ¬ q *)
   apply (erule disjI2)
+
   apply (erule disjE)    (* ⟦¬ (p ∧ q); p; ¬ q⟧ ⟹ ¬ p ∨ ¬ q
   apply (erule notE)
+
                            ⟦¬ (p ∧ q); p; q⟧ ⟹ ¬ p ∨ ¬ q *)
   apply (rule conjI)
+
   apply (erule disjI2)  (* ⟦¬ (p ∧ q); p; q⟧ ⟹ ¬ p ∨ ¬ q *)  
   apply assumption+
+
   apply (erule notE)    (* ⟦p; q⟧ ⟹ p ∧ q *)
 +
   apply (rule conjI)    (* ⟦p; q⟧ ⟹ p
 +
                            ⟦p; q⟧ ⟹ q *)
 +
   apply assumption+     (* *)
 
   done
 
   done
 
      
 
      
Línea 792: Línea 1495:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
lemma ej58: "(p ⟶ q) ∨ (q ⟶ p)"
+
lemma ej58a: "(p ⟶ q) ∨ (q ⟶ p)"
 
   apply (cut_tac P=p in excluded_middle)
 
   apply (cut_tac P=p in excluded_middle)
   apply (erule disjE)
+
                        (* ¬ p ∨ p ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
   apply (rule disjI1)
+
   apply (erule disjE)  (* ¬ p ⟹ (p ⟶ q) ∨ (q ⟶ p)
   apply (rule impI)
+
                          p ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
   apply (erule notE)
+
   apply (rule disjI1)  (* ¬ p ⟹ p ⟶ q
   apply assumption
+
                          p ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
   apply (rule disjI2)
+
  apply (rule impI)    (* ⟦¬ p; p⟧ ⟹ q
   apply (rule impI)
+
                          p ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
   apply assumption
+
  apply (erule notE)    (* p ⟹ p
 +
                          p ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
 +
  apply assumption    (* p ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
 +
  apply (rule disjI2)  (* p ⟹ q ⟶ p *)
 +
   apply (rule impI)    (* ⟦p; q⟧ ⟹ p *)
 +
  apply assumption      (* *)
 +
  done
 +
 
 +
lemma ej58b: "(p ⟶ q) ∨ (q ⟶ p)"
 +
  apply (cut_tac P="p ⟶ q" in excluded_middle)
 +
                        (* ¬ (p ⟶ q) ∨ (p ⟶ q) ⟹
 +
                          (p ⟶ q) ∨ (q ⟶ p) *)
 +
  apply (erule disjE)  (* ¬ (p ⟶ q) ⟹ (p ⟶ q) ∨ (q ⟶ p)
 +
                          p ⟶ q ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
 +
  apply (rule disjI2)  (* ¬ (p ⟶ q) ⟹ q ⟶ p
 +
                          p ⟶ q ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
 +
  apply (rule impI)    (* ⟦¬ (p ⟶ q); q⟧ ⟹ p
 +
                          p ⟶ q ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
 +
   apply (erule notE)    (* q ⟹ p ⟶ q
 +
                          p ⟶ q ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
 +
  apply (rule impI)    (* ⟦q; p⟧ ⟹ q
 +
                          p ⟶ q ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
 +
   apply assumption     (* p ⟶ q ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
 +
  apply (erule disjI1)  (* *)
 +
  done
 +
 
 +
lemma ej58c: "(p ⟶ q) ∨ (q ⟶ p)"
 +
  apply (cut_tac P="¬(p ⟶ q)" in excluded_middle)
 +
        (* ¬ ¬ (p ⟶ q) ∨ ¬ (p ⟶ q) ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
 +
  apply (erule disjE)    (* ¬ ¬ (p ⟶ q) ⟹ (p ⟶ q) ∨ (q ⟶ p)
 +
                            ¬ (p ⟶ q) ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
 +
  apply (drule notnotD)  (* p ⟶ q ⟹ (p ⟶ q) ∨ (q ⟶ p)
 +
                            ¬ (p ⟶ q) ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
 +
  apply (erule disjI1)  (* ¬ (p ⟶ q) ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
 +
   apply (rule disjI2)    (* ¬ (p ⟶ q) ⟹ q ⟶ p *)
 +
  apply (rule impI)      (* ⟦¬ (p ⟶ q); q⟧ ⟹ p *)
 +
  apply (erule notE)      (* q ⟹ p ⟶ q *)
 +
   apply (rule impI)      (* ⟦q; p⟧ ⟹ q *)
 +
   apply assumption       (* *)
 
   done
 
   done
  
 
end
 
end
 
 
</source>
 
</source>

Revisión actual del 14:03 20 abr 2019

theory R7_sol

imports Main 
begin

text {*
  --------------------------------------------------------------------- 
  El objetivo de esta relación es escribir demostraciones usando sólo
  las reglas básicas de deducción natural de la lógica proposicional y
  los métodos rule, erule, frule, drule y assumption.

  Las reglas básicas de la deducción natural son las siguientes:
  · conjI:          ⟦P; Q⟧ ⟹ P ∧ Q
  · conjunct1:      P ∧ Q ⟹ P
  · conjunct2:      P ∧ Q ⟹ Q
  · conjE:          ⟦P ∧ Q; ⟦P; Q⟧ ⟹ R⟧ ⟹ R
  · notE:           ⟦¬P; P⟧ ⟹ R
  · notI:           (P ⟹ False) ⟹ ¬P
  · mp:             ⟦P ⟶ Q; P⟧ ⟹ Q 
  · mt:             ⟦F ⟶ G; ¬G⟧ ⟹ ¬F 
  · impI:           (P ⟹ Q) ⟹ P ⟶ Q
  · impE:           ⟦P ⟶ Q; P; Q ⟹ R⟧ ⟹ R
  · disjI1:         P ⟹ P ∨ Q
  · disjI2:         Q ⟹ P ∨ Q
  · disjE:          ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R 
  · FalseE:         False ⟹ P
  · iffI:           ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P = Q
  · iffD1:          ⟦Q = P; Q⟧ ⟹ P 
  · iffD2:          ⟦P = Q; Q⟧ ⟹ P
  · iffE:           ⟦P = Q; ⟦P ⟶ Q; Q ⟶ P⟧ ⟹ R⟧ ⟹ R
  · notnotD:        ¬¬ P ⟹ P
  · not_not:        P = ¬¬P
  · ccontr:         (¬P ⟹ False) ⟹ P
  · excluded_midle: ¬P ∨ P
  · classical:      (¬ P ⟹ P) ⟹ P
  · contrapos_nn    ⟦¬Q; P ⟹ Q⟧ ⟹ ¬P
  --------------------------------------------------------------------- 
*}

text {*
  Se usarán las reglas notnotI y mt que demostramos a continuación.
  *}

lemma notnotI: "P ⟹ ¬¬ P"
by auto

lemma mt: "⟦F ⟶ G; ¬G⟧ ⟹ ¬F"
  by auto

section {* Implicaciones *}

text {* --------------------------------------------------------------- 
  Ejercicio 1. Demostrar
       p ⟶ q, p ⊢ q
  ------------------------------------------------------------------ *}

lemma ej1a: "⟦p ⟶ q; p⟧ ⟹ q" 
  apply (erule mp)   (* p ⟹ p *)
   apply assumption  (* *)
  done

lemma ej1b: "⟦p ⟶ q; p⟧ ⟹ q" 
  apply (erule mp, assumption)
  done

lemma ej1c: "⟦p ⟶ q; p⟧ ⟹ q" 
  by (erule mp, assumption)

text {* --------------------------------------------------------------- 
  Ejercicio 2. Demostrar
     p ⟶ q, q ⟶ r, p ⊢ r
  ------------------------------------------------------------------ *}

lemma ej2a: "⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r"
  apply (erule mp)    (* ⟦p ⟶ q; p⟧ ⟹ q *)
    apply (erule mp)  (* p ⟹ p *)
  apply assumption    (* *)
  done  

lemma ej2b: "⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r"
  apply (erule mp)+  (* p ⟹ p *)
  apply assumption   (* *)
  done  

lemma ej2c: "⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r"
  apply ((erule mp)+, assumption) 
  done

lemma ej2d: "⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r"
  by ((erule mp)+, assumption) 

text {* --------------------------------------------------------------- 
  Ejercicio 3. Demostrar
     p ⟶ (q ⟶ r), p ⟶ q, p ⊢ r
  ------------------------------------------------------------------ *}

lemma ej3a: "⟦p ⟶ (q ⟶ r); p ⟶ q; p⟧ ⟹ r"
  apply (drule mp)   (* ⟦p ⟶ q; p⟧ ⟹ p
                        ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
   apply assumption  (* ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *) 
  apply (drule mp)   (* ⟦p; q ⟶ r⟧ ⟹ p
                        ⟦p; q ⟶ r; q⟧ ⟹ r *)
   apply assumption  (* ⟦p; q ⟶ r; q⟧ ⟹ r *)
  apply (drule mp)   (* ⟦p; q⟧ ⟹ q
                        ⟦p; q; r⟧ ⟹ r *)
   apply assumption  (* ⟦p; q; r⟧ ⟹ r *)
  apply assumption   (* *)
  done

lemma ej3b: "⟦p ⟶ (q ⟶ r); p ⟶ q; p⟧ ⟹ r"
  apply (drule mp, assumption) (* ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
  apply (drule mp, assumption) (* ⟦p; q ⟶ r; q⟧ ⟹ r *)
  apply (drule mp, assumption) (* ⟦p; q; r⟧ ⟹ r *)
  apply assumption             (* *)
  done

lemma ej3c: "⟦p ⟶ (q ⟶ r); p ⟶ q; p⟧ ⟹ r"
  apply (drule mp, assumption)+ (* ⟦p; q; r⟧ ⟹ r *)
  apply assumption              (* *)
  done

lemma ej3d: "⟦p ⟶ (q ⟶ r); p ⟶ q; p⟧ ⟹ r"
  apply (drule mp, assumption+)+
  done

lemma ej3e: "⟦p ⟶ (q ⟶ r); p ⟶ q; p⟧ ⟹ r"
  by (drule mp, assumption+)+

text {* --------------------------------------------------------------- 
  Ejercicio 4. Demostrar
     p ⟶ q, q ⟶ r ⊢ p ⟶ r
  ------------------------------------------------------------------ *}

lemma ej4a: "⟦p ⟶ q; q ⟶ r⟧ ⟹ p ⟶ r"
  apply (rule impI)  (* ⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r *)
  apply (erule mp)   (* ⟦p ⟶ q; p⟧ ⟹ q *)
  apply (erule mp)   (* p ⟹ p *)
  apply assumption   (* *)
  done

lemma ej4b: "⟦p ⟶ q; q ⟶ r⟧ ⟹ p ⟶ r"
  apply (rule impI)  (* ⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r *)
  apply (erule mp)+  (* p ⟹ p *)
  apply assumption   (* *)
  done

text {* --------------------------------------------------------------- 
  Ejercicio 5. Demostrar
     p ⟶ (q ⟶ r) ⊢ q ⟶ (p ⟶ r)
  ------------------------------------------------------------------ *}

lemma ej5a: "p ⟶ (q ⟶ r) ⟹ q ⟶ (p ⟶ r)"
  apply (rule impI)   (* ⟦p ⟶ q ⟶ r; q⟧ ⟹ p ⟶ r *)
  apply (rule impI)   (* ⟦p ⟶ q ⟶ r; q; p⟧ ⟹ r *)
  apply (erule impE)  (* ⟦q; p⟧ ⟹ p
                         ⟦q; p; q ⟶ r⟧ ⟹ r *)
   apply assumption   (* ⟦q; p; q ⟶ r⟧ ⟹ r *)
  apply (erule impE)  (* ⟦q; p⟧ ⟹ q
                         ⟦q; p; r⟧ ⟹ r *)
   apply assumption   (* ⟦q; p; r⟧ ⟹ r *)
  apply assumption    (* *)
  done  
  
lemma ej5b: "p ⟶ (q ⟶ r) ⟹ q ⟶ (p ⟶ r)"
  apply (rule impI)               (* ⟦p ⟶ q ⟶ r; q⟧ ⟹ p ⟶ r *)
  apply (rule impI)               (* ⟦p ⟶ q ⟶ r; q; p⟧ ⟹ r *) 
  apply (erule impE, assumption)  (* ⟦q; p; q ⟶ r⟧ ⟹ r *)
  apply (erule impE, assumption+) (* *)
  done  
  
lemma ej5c: "p ⟶ (q ⟶ r) ⟹ q ⟶ (p ⟶ r)"
  apply (rule impI)+              (* ⟦p ⟶ q ⟶ r; q; p⟧ ⟹ r *) 
  apply (erule impE, assumption)  (* ⟦q; p; q ⟶ r⟧ ⟹ r *)
  apply (erule impE, assumption+) (* *)
  done  
  
lemma ej5d: "p ⟶ (q ⟶ r) ⟹ q ⟶ (p ⟶ r)"
  apply (rule impI)+                (* ⟦p ⟶ q ⟶ r; q; p⟧ ⟹ r *) 
  apply (erule impE, assumption+)+  (* ⟦q; p; q ⟶ r⟧ ⟹ r *)
  done  
  
text {* --------------------------------------------------------------- 
  Ejercicio 6. Demostrar
     p ⟶ (q ⟶ r) ⊢ (p ⟶ q) ⟶ (p ⟶ r)
  ------------------------------------------------------------------ *}

lemma ej6a: "p ⟶ (q ⟶ r) ⟹ (p ⟶ q) ⟶ (p ⟶ r)"
  apply (rule impI)   (* ⟦p ⟶ q ⟶ r; p ⟶ q⟧ ⟹ p ⟶ r *)
  apply (rule impI)   (* ⟦p ⟶ q ⟶ r; p ⟶ q; p⟧ ⟹ r *)
  apply (erule impE)  (* ⟦p ⟶ q; p⟧ ⟹ p
                         ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
   apply assumption   (* ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
  apply (erule impE)  (* ⟦p; q ⟶ r⟧ ⟹ p
                         ⟦p; q ⟶ r; q⟧ ⟹ r *)
   apply assumption   (* ⟦p; q ⟶ r; q⟧ ⟹ r *)
  apply (erule impE)  (* ⟦p; q⟧ ⟹ q
                         ⟦p; q; r⟧ ⟹ r *)
   apply assumption   (* ⟦p; q; r⟧ ⟹ r *)
  apply assumption    (* *)
  done

lemma ej6b: "p ⟶ (q ⟶ r) ⟹ (p ⟶ q) ⟶ (p ⟶ r)"
  apply (rule impI)               (* ⟦p ⟶ q ⟶ r; p ⟶ q⟧ ⟹ p ⟶ r *)
  apply (rule impI)               (* ⟦p ⟶ q ⟶ r; p ⟶ q; p⟧ ⟹ r *)
  apply (erule impE, assumption)  (* ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
  apply (erule impE, assumption)  (* ⟦p; q ⟶ r; q⟧ ⟹ r *)
  apply (erule impE, assumption+) (* *)
  done

lemma ej6c: "p ⟶ (q ⟶ r) ⟹ (p ⟶ q) ⟶ (p ⟶ r)"
  apply (rule impI)+               (* ⟦p ⟶ q ⟶ r; p ⟶ q; p⟧ ⟹ r *)
  apply (erule impE, assumption+)+ (* *)
  done

text {* --------------------------------------------------------------- 
  Ejercicio 7. Demostrar
     p ⊢ q ⟶ p
  ------------------------------------------------------------------ *}

lemma ej7a: "p ⟹ q ⟶ p"
  apply (rule impI)  (* ⟦p; q⟧ ⟹ p *)
  apply assumption   (* *)
  done
    
lemma ej7b: "p ⟹ q ⟶ p"
  apply (rule impI, assumption)  (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 8. Demostrar
     ⊢ p ⟶ (q ⟶ p)
  ------------------------------------------------------------------ *}

lemma ej8a: "p ⟶ (q ⟶ p)"
  apply (rule impI)  (* p ⟹ q ⟶ p *)
  apply (rule impI)  (* ⟦p; q⟧ ⟹ p *)
  apply assumption   (* *)
  done

lemma ej8b: "p ⟶ (q ⟶ p)"
  apply (rule impI)+  (* ⟦p; q⟧ ⟹ p *)
  apply assumption    (* *)
  done

lemma ej8c: "p ⟶ (q ⟶ p)"
  by (rule impI)+ 

text {* ---------------------------------------------------------------
  Ejercicio 9. Demostrar
     p ⟶ q ⊢ (q ⟶ r) ⟶ (p ⟶ r)
  ------------------------------------------------------------------ *}

lemma ej9a: "p ⟶ q ⟹ (q ⟶ r) ⟶ (p ⟶ r)"
  apply (rule impI) (* ⟦p ⟶ q; q ⟶ r⟧ ⟹ p ⟶ r *)
  apply (rule impI) (* ⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r *)
  apply (erule mp)  (* ⟦p ⟶ q; p⟧ ⟹ q *)
  apply (erule mp)  (* p ⟹ p *)
  apply assumption  (* *)
  done

lemma ej9b: "p ⟶ q ⟹ (q ⟶ r) ⟶ (p ⟶ r)"
  apply (rule impI)+ (* ⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r *)
  apply (erule mp)+  (* p ⟹ p *)
  apply assumption   (* *)
  done

text {* --------------------------------------------------------------- 
  Ejercicio 10. Demostrar
     p ⟶ (q ⟶ (r ⟶ s)) ⊢ r ⟶ (q ⟶ (p ⟶ s))
  ------------------------------------------------------------------ *}

lemma ej10a: "p ⟶ (q ⟶ (r ⟶ s)) ⟹ r ⟶ (q ⟶ (p ⟶ s))"
  apply (rule impI)  (* ⟦p ⟶ q ⟶ r ⟶ s; r⟧ ⟹ q ⟶ p ⟶ s *)
  apply (rule impI)  (* ⟦p ⟶ q ⟶ r ⟶ s; r; q⟧ ⟹ p ⟶ s *)
  apply (rule impI)  (* ⟦p ⟶ q ⟶ r ⟶ s; r; q; p⟧ ⟹ s *)
  apply (drule mp)   (* ⟦r; q; p⟧ ⟹ p
                        ⟦r; q; p; q ⟶ r ⟶ s⟧ ⟹ s *)
   apply assumption  (* ⟦r; q; p; q ⟶ r ⟶ s⟧ ⟹ s *)
  apply (drule mp)   (* ⟦r; q; p⟧ ⟹ q
                        ⟦r; q; p; r ⟶ s⟧ ⟹ s *)
   apply assumption  (* ⟦r; q; p; r ⟶ s⟧ ⟹ s *)
  apply (erule mp)   (* ⟦r; q; p⟧ ⟹ r *)
  apply assumption   (* *)
  done
    
lemma ej10b: "p ⟶ (q ⟶ (r ⟶ s)) ⟹ r ⟶ (q ⟶ (p ⟶ s))"
  apply (rule impI)  (* ⟦p ⟶ q ⟶ r ⟶ s; r⟧ ⟹ q ⟶ p ⟶ s *)
  apply (rule impI)  (* ⟦p ⟶ q ⟶ r ⟶ s; r; q⟧ ⟹ p ⟶ s *)
  apply (rule impI)  (* ⟦p ⟶ q ⟶ r ⟶ s; r; q; p⟧ ⟹ s *)
  apply (drule mp, assumption)  (* ⟦r; q; p; q ⟶ r ⟶ s⟧ ⟹ s *)
  apply (drule mp, assumption)  (* ⟦r; q; p; r ⟶ s⟧ ⟹ s *)
  apply (erule mp, assumption)  (* *)
  done
    
lemma ej10c: "p ⟶ (q ⟶ (r ⟶ s)) ⟹ r ⟶ (q ⟶ (p ⟶ s))"
  apply (rule impI)+  (* ⟦p ⟶ q ⟶ r ⟶ s; r; q; p⟧ ⟹ s *)
  apply (drule mp, assumption+)+  (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 11. Demostrar
     ⊢ (p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))
  ------------------------------------------------------------------ *}

lemma ej11a: "(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))"
  apply (rule impI)  (* p ⟶ q ⟶ r ⟹ (p ⟶ q) ⟶ p ⟶ r *)
  apply (rule impI)  (* ⟦p ⟶ q ⟶ r; p ⟶ q⟧ ⟹ p ⟶ r *)
  apply (rule impI)  (* ⟦p ⟶ q ⟶ r; p ⟶ q; p⟧ ⟹ r *)
  apply (drule mp)   (* ⟦p ⟶ q; p⟧ ⟹ p
                        ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
   apply assumption  (* ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
  apply (drule mp)   (* ⟦p; q ⟶ r⟧ ⟹ p
                        ⟦p; q ⟶ r; q⟧ ⟹ r *)
   apply assumption  (* ⟦p; q ⟶ r; q⟧ ⟹ r *)
  apply (erule mp)   (* ⟦p; q⟧ ⟹ q *)
   apply assumption  (* *)
  done
    
lemma ej11b: "(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))"
  apply (rule impI)+             (* ⟦p ⟶ q ⟶ r; p ⟶ q; p⟧ ⟹ r *)
  apply (drule mp, assumption+)+ (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 12. Demostrar
     (p ⟶ q) ⟶ r ⊢ p ⟶ (q ⟶ r)
  ------------------------------------------------------------------ *}

lemma ej12a: "(p ⟶ q) ⟶ r ⟹ p ⟶ (q ⟶ r)"
  apply (rule impI)  (* ⟦(p ⟶ q) ⟶ r; p⟧ ⟹ q ⟶ r *)
  apply (rule impI)  (* ⟦(p ⟶ q) ⟶ r; p; q⟧ ⟹ r *)
  apply (drule mp)   (* ⟦p; q⟧ ⟹ p ⟶ q
                        ⟦p; q; r⟧ ⟹ r *)
  apply (rule impI)  (* ⟦p; q; p⟧ ⟹ q
                        ⟦p; q; r⟧ ⟹ r *)
   apply assumption  (* ⟦p; q; r⟧ ⟹ r *)
  apply assumption   (* *)
  done
  
lemma ej12b: "(p ⟶ q) ⟶ r ⟹ p ⟶ (q ⟶ r)"
  apply (rule impI)+  (* ⟦(p ⟶ q) ⟶ r; p; q⟧ ⟹ r *)
  apply (drule mp)    (* ⟦p; q⟧ ⟹ p ⟶ q
                         ⟦p; q; r⟧ ⟹ r *)
  apply (rule impI)   (* ⟦p; q; p⟧ ⟹ q
                        ⟦p; q; r⟧ ⟹ r *)
   apply assumption+  (* *)
  done
  
lemma ej12c: "(p ⟶ q) ⟶ r ⟹ p ⟶ (q ⟶ r)"
  apply (rule impI)+  (* ⟦(p ⟶ q) ⟶ r; p; q⟧ ⟹ r *)
  apply (drule mp)    (* ⟦p; q⟧ ⟹ p ⟶ q
                         ⟦p; q; r⟧ ⟹ r *)
  apply (rule impI,
         assumption+) (* *)
  done
  
lemma ej12e: "(p ⟶ q) ⟶ r ⟹ p ⟶ (q ⟶ r)"
  apply (rule impI)+                 (* ⟦(p ⟶ q) ⟶ r; p; q⟧ ⟹ r *)
  apply (rule_tac P="p ⟶ q" in mp) 
                         (* ⟦(p ⟶ q) ⟶ r; p; q⟧ ⟹ (p ⟶ q) ⟶ r
                            ⟦(p ⟶ q) ⟶ r; p; q⟧ ⟹ p ⟶ q *)
   apply assumption      (* ⟦(p ⟶ q) ⟶ r; p; q⟧ ⟹ p ⟶ q *)
  apply (rule impI)      (* ⟦(p ⟶ q) ⟶ r; p; q; p⟧ ⟹ q *)
  apply assumption       (* *)
  done
  
section {* Conjunciones *}

text {* --------------------------------------------------------------- 
  Ejercicio 13. Demostrar
     p, q ⊢  p ∧ q
  ------------------------------------------------------------------ *}

lemma ej13: "⟦p; q⟧ ⟹ p ∧ q"
  apply (rule conjI)   (* ⟦p; q⟧ ⟹ p 
                          ⟦p; q⟧ ⟹ q *)
   apply assumption    (* ⟦p; q⟧ ⟹ q *)
  apply assumption     (* *)
  done
    
lemma ej13b: "⟦p; q⟧ ⟹ p ∧ q"
  apply (rule conjI)   (* ⟦p; q⟧ ⟹ p 
                          ⟦p; q⟧ ⟹ q *)
   apply assumption+   (* *)
  done
    
lemma ej13c: "⟦p; q⟧ ⟹ p ∧ q"
  apply (rule conjI, assumption+)
  done
    
lemma ej13d: "⟦p; q⟧ ⟹ p ∧ q"
  by (rule conjI, assumption+)
    
text {* --------------------------------------------------------------- 
  Ejercicio 14. Demostrar
     p ∧ q ⊢ p
  ------------------------------------------------------------------ *}

lemma ej14a: "p ∧ q ⟹ p"
  apply (erule conjunct1)
  done
    
lemma ej14b: "p ∧ q ⟹ p"
  by (erule conjunct1)
    
text {* --------------------------------------------------------------- 
  Ejercicio 15. Demostrar
     p ∧ q ⊢ q
  ------------------------------------------------------------------ *}

lemma ej15a: "p ∧ q ⟹ q"
  apply (erule conjunct2)
  done
    
lemma ej15b: "p ∧ q ⟹ q"
  by (erule conjunct2)
    
text {* --------------------------------------------------------------- 
  Ejercicio 16. Demostrar
     p ∧ (q ∧ r) ⊢ (p ∧ q) ∧ r
  ------------------------------------------------------------------ *}

lemma ej16a: "p ∧ (q ∧ r) ⟹ (p ∧ q) ∧ r"
  apply (rule conjI)          (* p ∧ (q ∧ r) ⟹ p ∧ q
                                 p ∧ (q ∧ r) ⟹ r *)
   apply (rule conjI)         (* p ∧ (q ∧ r) ⟹ p
                                 p ∧ (q ∧ r) ⟹ q
                                 p ∧ (q ∧ r) ⟹ r *)
    apply (erule conjunct1)   (* p ∧ (q ∧ r) ⟹ q
                                 p ∧ (q ∧ r) ⟹ r *)
   apply (drule conjunct2)    (* q ∧ r ⟹ q
                                 p ∧ (q ∧ r) ⟹ r *)
   apply (erule conjunct1)    (* p ∧ (q ∧ r) ⟹ r *)
  apply (drule conjunct2)     (* q ∧ r ⟹ r *)
  apply (erule conjunct2)     (* *)
  done
    
lemma ej16b: "p ∧ (q ∧ r) ⟹ (p ∧ q) ∧ r"
  apply (rule conjI)+         (* p ∧ (q ∧ r) ⟹ p
                                 p ∧ (q ∧ r) ⟹ q
                                 p ∧ (q ∧ r) ⟹ r *)
    apply (erule conjE)       (* ⟦p; q ∧ r⟧ ⟹ p
                                 p ∧ (q ∧ r) ⟹ q
                                 p ∧ (q ∧ r) ⟹ r *)
  apply assumption            (* p ∧ (q ∧ r) ⟹ q
                                 p ∧ (q ∧ r) ⟹ r *)
   apply (erule conjE)+       (* ⟦p; q; r⟧ ⟹ q
                                 p ∧ (q ∧ r) ⟹ r *)
  apply assumption            (* p ∧ (q ∧ r) ⟹ r *)
  apply (erule conjE)+        (* ⟦p; q; r⟧ ⟹ r *)
  apply assumption            (* *)
  done
    
lemma ej16c: "p ∧ (q ∧ r) ⟹ (p ∧ q) ∧ r"
  apply (rule conjI)+         (* p ∧ (q ∧ r) ⟹ p
                                 p ∧ (q ∧ r) ⟹ q
                                 p ∧ (q ∧ r) ⟹ r *)
    apply (erule conjE,
           assumption)        (* p ∧ (q ∧ r) ⟹ q
                                 p ∧ (q ∧ r) ⟹ r *)
   apply ((erule conjE)+, 
          assumption)         (* p ∧ (q ∧ r) ⟹ r *)
  apply ((erule conjE)+,
         assumption)          (* *)
  done
    
lemma ej16d: "p ∧ (q ∧ r) ⟹ (p ∧ q) ∧ r"
  apply (rule conjI)+         (* p ∧ (q ∧ r) ⟹ p
                                 p ∧ (q ∧ r) ⟹ q
                                 p ∧ (q ∧ r) ⟹ r *)
    apply ((erule conjE)+,
           assumption)+       (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 17. Demostrar
     (p ∧ q) ∧ r ⊢ p ∧ (q ∧ r)
  ------------------------------------------------------------------ *}

lemma ej17a: "(p ∧ q) ∧ r ⟹ p ∧ (q ∧ r)"
  apply (rule conjI)        (* (p ∧ q) ∧ r ⟹ p
                               (p ∧ q) ∧ r ⟹ q ∧ r *)
   apply (drule conjunct1)  (* p ∧ q ⟹ p
                               (p ∧ q) ∧ r ⟹ q ∧ r *)
   apply (erule conjunct1)  (* (p ∧ q) ∧ r ⟹ q ∧ r *)
  apply (rule conjI)        (* (p ∧ q) ∧ r ⟹ q
                               (p ∧ q) ∧ r ⟹ r *)
   apply (drule conjunct1)  (* p ∧ q ⟹ q
                               (p ∧ q) ∧ r ⟹ r *)
   apply (erule conjunct2)  (* (p ∧ q) ∧ r ⟹ r *)
  apply (erule conjunct2)   (* *)
  done
    
lemma ej17b: "(p ∧ q) ∧ r ⟹ p ∧ (q ∧ r)"
  apply (erule conjE)   (* ⟦p ∧ q; r⟧ ⟹ p ∧ (q ∧ r) *)
  apply (erule conjE)   (* ⟦r; p; q⟧ ⟹ p ∧ (q ∧ r) *) 
  apply (erule conjI)   (* ⟦r; q⟧ ⟹ q ∧ r *)
  apply (erule conjI)   (* r ⟹ r *)
  apply assumption      (* *)
  done

lemma ej17c: "(p ∧ q) ∧ r ⟹ p ∧ (q ∧ r)"
  apply (erule conjE)+  (* ⟦r; p; q⟧ ⟹ p ∧ (q ∧ r) *) 
  apply (erule conjI)+  (* r ⟹ r *)
  apply assumption      (* *)
  done

text {* --------------------------------------------------------------- 
  Ejercicio 18. Demostrar
     p ∧ q ⊢ p ⟶ q
  ------------------------------------------------------------------ *}

lemma ej18: "p ∧ q ⟹ p ⟶ q"
  apply (rule impI)         (* ⟦p ∧ q; p⟧ ⟹ q *)
  apply (erule conjunct2)   (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 19. Demostrar
     (p ⟶ q) ∧ (p ⟶ r) ⊢ p ⟶ q ∧ r   
  ------------------------------------------------------------------ *}

lemma ej19a: "(p ⟶ q) ∧ (p ⟶ r) ⟹ p ⟶ q ∧ r"
  apply (rule impI)          (* ⟦(p ⟶ q) ∧ (p ⟶ r); p⟧ ⟹ q ∧ r *)
  apply (rule conjI)         (* ⟦(p ⟶ q) ∧ (p ⟶ r); p⟧ ⟹ q
                                ⟦(p ⟶ q) ∧ (p ⟶ r); p⟧ ⟹ r *)
   apply (drule conjunct1)   (* ⟦p; p ⟶ q⟧ ⟹ q *)
   apply (erule mp)          (* p ⟹ p
                                ⟦(p ⟶ q) ∧ (p ⟶ r); p⟧ ⟹ r *)
    apply assumption         (* ⟦(p ⟶ q) ∧ (p ⟶ r); p⟧ ⟹ r *) 
  apply (drule conjunct2)    (* ⟦p; p ⟶ r⟧ ⟹ r *)
  apply (erule mp)           (* p ⟹ p *)
   apply assumption          (* *) 
  done
    
lemma ej19b: "(p ⟶ q) ∧ (p ⟶ r) ⟹ p ⟶ q ∧ r"
  apply (erule conjE)  (* ⟦p ⟶ q; p ⟶ r⟧ ⟹ p ⟶ q ∧ r *)
  apply (rule impI)    (* ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ q ∧ r *)
  apply (rule conjI)   (* ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ q
                          ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ r *)
   apply (erule mp)    (* ⟦p ⟶ r; p⟧ ⟹ p
                          ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ r *)
   apply assumption    (* ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ r *)
  apply (erule mp)     (* ⟦p ⟶ q; p⟧ ⟹ p *)
  apply assumption     (* *)
  done

lemma ej19c: "(p ⟶ q) ∧ (p ⟶ r) ⟹ p ⟶ q ∧ r"
  apply (erule conjE)  (* ⟦p ⟶ q; p ⟶ r⟧ ⟹ p ⟶ q ∧ r *)
  apply (rule impI)    (* ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ q ∧ r *)
  apply (rule conjI)   (* ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ q
                          ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ r *)
  apply (erule mp,
         assumption)   (* ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ r *)
  apply (erule mp,
         assumption)   (* *)
  done

lemma ej19d: "(p ⟶ q) ∧ (p ⟶ r) ⟹ p ⟶ q ∧ r"
  apply (erule conjE)  (* ⟦p ⟶ q; p ⟶ r⟧ ⟹ p ⟶ q ∧ r *)
  apply (rule impI)    (* ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ q ∧ r *)
  apply (rule conjI)   (* ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ q
                          ⟦p ⟶ q; p ⟶ r; p⟧ ⟹ r *)
  apply (erule mp,
         assumption)+  (* *)
  done

text {* --------------------------------------------------------------- 
  Ejercicio 20. Demostrar
     p ⟶ q ∧ r ⊢ (p ⟶ q) ∧ (p ⟶ r)
  ------------------------------------------------------------------ *}

lemma ej20a: "p ⟶ q ∧ r ⟹ (p ⟶ q) ∧ (p ⟶ r)"
  apply (rule conjI)          (* p ⟶ q ∧ r ⟹ p ⟶ q
                                 p ⟶ q ∧ r ⟹ p ⟶ r *)
   apply (rule impI)          (* ⟦p ⟶ q ∧ r; p⟧ ⟹ q
                                 p ⟶ q ∧ r ⟹ p ⟶ r *)
   apply (drule mp)           (* p ⟹ p
                                 ⟦p; q ∧ r⟧ ⟹ q
                                 p ⟶ q ∧ r ⟹ p ⟶ r *)
    apply assumption          (* ⟦p; q ∧ r⟧ ⟹ q
                                 p ⟶ q ∧ r ⟹ p ⟶ r *)
    apply (erule conjunct1)   (* p ⟶ q ∧ r ⟹ p ⟶ r *)
  apply (rule impI)           (* ⟦p ⟶ q ∧ r; p⟧ ⟹ r *)
  apply (drule mp)            (* p ⟹ p
                                 ⟦p; q ∧ r⟧ ⟹ r *)
   apply assumption           (* ⟦p; q ∧ r⟧ ⟹ r *)
  apply (erule conjunct2)     (* *)
  done
    
lemma ej20b: "p ⟶ q ∧ r ⟹ (p ⟶ q) ∧ (p ⟶ r)"
  apply (rule conjI)          (* p ⟶ q ∧ r ⟹ p ⟶ q
                                 p ⟶ q ∧ r ⟹ p ⟶ r *)
   apply (rule impI)          (* ⟦p ⟶ q ∧ r; p⟧ ⟹ q
                                 p ⟶ q ∧ r ⟹ p ⟶ r *)
  apply (drule mp,
         assumption)          (* ⟦p; q ∧ r⟧ ⟹ q
                                 p ⟶ q ∧ r ⟹ p ⟶ r *)
    apply (erule conjunct1)   (* p ⟶ q ∧ r ⟹ p ⟶ r *)
  apply (rule impI)           (* ⟦p ⟶ q ∧ r; p⟧ ⟹ r *)
  apply (drule mp,
         assumption)          (* ⟦p; q ∧ r⟧ ⟹ r *)
  apply (erule conjunct2)     (* *)
  done
    
lemma ej20c: "p ⟶ q ∧ r ⟹ (p ⟶ q) ∧ (p ⟶ r)"
  apply (rule conjI)          (* p ⟶ q ∧ r ⟹ p ⟶ q
                                 p ⟶ q ∧ r ⟹ p ⟶ r *)
   apply (rule impI)          (* ⟦p ⟶ q ∧ r; p⟧ ⟹ q
                                 p ⟶ q ∧ r ⟹ p ⟶ r *)
  apply (drule mp,
         assumption,
         erule conjunct1)     (* p ⟶ q ∧ r ⟹ p ⟶ r *)
  apply (rule impI)           (* ⟦p ⟶ q ∧ r; p⟧ ⟹ r *)
  apply (drule mp,
         assumption,
         erule conjunct2)     (* *)
  done
    
lemma ej20d: "p ⟶ q ∧ r ⟹ (p ⟶ q) ∧ (p ⟶ r)"
  apply (rule conjI)          (* p ⟶ q ∧ r ⟹ p ⟶ q
                                 p ⟶ q ∧ r ⟹ p ⟶ r *)
  apply (rule impI,
         drule mp,
         assumption,
         erule conjunct1)     (* p ⟶ q ∧ r ⟹ p ⟶ r *)
  apply (rule impI,
         drule mp,
         assumption,
         erule conjunct2)     (* *)
  done
    
lemma ej20e: "p ⟶ q ∧ r ⟹ (p ⟶ q) ∧ (p ⟶ r)"
  apply (rule conjI)    (* p ⟶ q ∧ r ⟹ p ⟶ q
                           p ⟶ q ∧ r ⟹ p ⟶ r *)
  apply (rule impI,
         drule mp,
         assumption,
         erule conjE)   (* ⟦p; q; r⟧ ⟹ q
                           p ⟶ q ∧ r ⟹ p ⟶ r *)
   apply assumption     (* p ⟶ q ∧ r ⟹ p ⟶ r *)
   apply (rule impI,
         drule mp,
         assumption,
         erule conjE)   (* ⟦p; q; r⟧ ⟹ r *)
  apply assumption      (* *)
  done
    
lemma ej20f: "p ⟶ q ∧ r ⟹ (p ⟶ q) ∧ (p ⟶ r)"
  apply (rule conjI)          (* p ⟶ q ∧ r ⟹ p ⟶ q
                                 p ⟶ q ∧ r ⟹ p ⟶ r *)
  apply (rule impI,
         drule mp,
         assumption,
         erule conjE,
         assumption)+         (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 21. Demostrar
     p ⟶ (q ⟶ r) ⊢ p ∧ q ⟶ r
  ------------------------------------------------------------------ *}

lemma ej21a: "p ⟶ (q ⟶ r) ⟹ p ∧ q ⟶ r"
  apply (rule impI)         (* ⟦p ⟶ (q ⟶ r); p ∧ q⟧ ⟹ r *)
  apply (frule conjunct1)   (* ⟦p ⟶ (q ⟶ r); p ∧ q; p⟧ ⟹ r *)
  apply (drule mp)          (* ⟦p ∧ q; p⟧ ⟹ p
                               ⟦p ∧ q; p; q ⟶ r⟧ ⟹ r *)
   apply assumption         (* ⟦p ∧ q; p; q ⟶ r⟧ ⟹ r *)
  apply (drule conjunct2)   (* ⟦p; q ⟶ r; q⟧ ⟹ r *)
  apply (erule mp)          (* ⟦p; q⟧ ⟹ q *)
   apply assumption         (* *)
  done
    
lemma ej21b: "p ⟶ (q ⟶ r) ⟹ p ∧ q ⟶ r"
  apply (rule impI)         (* ⟦p ⟶ (q ⟶ r); p ∧ q⟧ ⟹ r *)
  apply (erule conjE)       (* ⟦p ⟶ (q ⟶ r); p; q⟧ ⟹ r *)
  apply (drule mp)          (* ⟦p; q⟧ ⟹ p
                               ⟦p; q; q ⟶ r⟧ ⟹ r *)
   apply assumption         (* ⟦p; q; q ⟶ r⟧ ⟹ r *)
  apply (erule mp)          (* ⟦p; q⟧ ⟹ q *)
   apply assumption         (* *)
  done
    
lemma ej21c: "p ⟶ (q ⟶ r) ⟹ p ∧ q ⟶ r"
  apply (rule impI)         (* ⟦p ⟶ (q ⟶ r); p ∧ q⟧ ⟹ r *)
  apply (erule conjE)       (* ⟦p ⟶ (q ⟶ r); p; q⟧ ⟹ r *)
  apply (drule mp,
         assumption)        (* ⟦p; q; q ⟶ r⟧ ⟹ r *)
  apply (erule mp,
         assumption)        (* *)
  done
    
lemma ej21d: "p ⟶ (q ⟶ r) ⟹ p ∧ q ⟶ r"
  apply (rule impI)         (* ⟦p ⟶ (q ⟶ r); p ∧ q⟧ ⟹ r *)
  apply (erule conjE)       (* ⟦p ⟶ (q ⟶ r); p; q⟧ ⟹ r *)
  apply (drule mp,
         assumption+)+      (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 22. Demostrar
     p ∧ q ⟶ r ⊢ p ⟶ (q ⟶ r)
  ------------------------------------------------------------------ *}

lemma ej22a: "p ∧ q ⟶ r ⟹ p ⟶ (q ⟶ r)"
  apply (rule impI)      (* ⟦p ∧ q ⟶ r; p⟧ ⟹ q ⟶ r *)
  apply (rule impI)      (* ⟦p ∧ q ⟶ r; p; q⟧ ⟹ r *)
  apply (erule mp)       (* ⟦p; q⟧ ⟹ p ∧ q *)
  apply (rule conjI)     (* ⟦p; q⟧ ⟹ p
                            ⟦p; q⟧ ⟹ q *)
   apply assumption     (* ⟦p; q⟧ ⟹ q *)
  apply assumption      (* *)
  done
    
lemma ej22b: "p ∧ q ⟶ r ⟹ p ⟶ (q ⟶ r)"
  apply (rule impI)+     (* ⟦p ∧ q ⟶ r; p; q⟧ ⟹ r *)
  apply (erule mp)       (* ⟦p; q⟧ ⟹ p ∧ q *)
  apply (erule conjI)    (* q ⟹ q *)
  apply assumption       (* *)
  done
    
lemma ej22c: "p ∧ q ⟶ r ⟹ p ⟶ (q ⟶ r)"
  apply (rule impI)+     (* ⟦p ∧ q ⟶ r; p; q⟧ ⟹ r *)
  apply (erule mp)       (* ⟦p; q⟧ ⟹ p ∧ q *)
  apply (erule conjI,
         assumption)     (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 23. Demostrar
     (p ⟶ q) ⟶ r ⊢ p ∧ q ⟶ r
  ------------------------------------------------------------------ *}

lemma ej23a: "(p ⟶ q) ⟶ r ⟹ p ∧ q ⟶ r"
  apply (rule impI)         (* ⟦(p ⟶ q) ⟶ r; p ∧ q⟧ ⟹ r *)
  apply (erule mp)          (* p ∧ q ⟹ p ⟶ q *)
  apply (rule impI)         (* ⟦p ∧ q; p⟧ ⟹ q *)
  apply (erule conjunct2)   (*  *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 24. Demostrar
     p ∧ (q ⟶ r) ⊢ (p ⟶ q) ⟶ r
  ------------------------------------------------------------------ *}

lemma ej24a: "p ∧ (q ⟶ r) ⟹ (p ⟶ q) ⟶ r"
  apply (rule impI)         (* ⟦p ∧ (q ⟶ r); p ⟶ q⟧ ⟹ r *)
  apply (frule conjunct1)   (* ⟦p ∧ (q ⟶ r); p ⟶ q; p⟧ ⟹ r *)
  apply (drule mp)          (* ⟦p ∧ (q ⟶ r); p⟧ ⟹ p
                               ⟦p ∧ (q ⟶ r); p; q⟧ ⟹ r *)
   apply assumption         (* ⟦p ∧ (q ⟶ r); p; q⟧ ⟹ r *)
  apply (drule conjunct2)   (* p; q; q ⟶ r⟧ ⟹ r *)
  apply (erule mp)          (* ⟦p; q⟧ ⟹ q *)
  apply assumption          (* *)
  done
    
lemma ej24b: "p ∧ (q ⟶ r) ⟹ (p ⟶ q) ⟶ r"
  apply (rule impI)         (* ⟦p ∧ (q ⟶ r); p ⟶ q⟧ ⟹ r *)
  apply (erule conjE)       (* ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
  apply (drule mp)          (* ⟦p; q ⟶ r⟧ ⟹ p
                               ⟦p; q ⟶ r; q⟧ ⟹ r *)
   apply assumption         (* ⟦p; q ⟶ r; q⟧ ⟹ r *)
  apply (erule mp)          (* ⟦p; q⟧ ⟹ q *)
  apply assumption          (* *)
  done
    
lemma ej24c: "p ∧ (q ⟶ r) ⟹ (p ⟶ q) ⟶ r"
  apply (rule impI)         (* ⟦p ∧ (q ⟶ r); p ⟶ q⟧ ⟹ r *)
  apply (erule conjE)       (* ⟦p ⟶ q; p; q ⟶ r⟧ ⟹ r *)
  apply (drule mp,
         assumption+)+      (* *)
  done
    
section {* Disyunciones *}

text {* --------------------------------------------------------------- 
  Ejercicio 25. Demostrar
     p ⊢ p ∨ q
  ------------------------------------------------------------------ *}

lemma ej25: "p ⟹ p ∨ q"
  apply (erule disjI1)   (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 26. Demostrar
     q ⊢ p ∨ q
  ------------------------------------------------------------------ *}

lemma ej26: "q ⟹ p ∨ q"
  apply (erule disjI2)   (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 27. Demostrar
     p ∨ q ⊢ q ∨ p
  ------------------------------------------------------------------ *}

lemma ej27: "p ∨ q ⟹ q ∨ p"
  apply (erule disjE)     (* p ⟹ q ∨ p
                             q ⟹ q ∨ p *)
   apply (erule disjI2)   (* q ⟹ q ∨ p *)
  apply (erule disjI1)    (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 28. Demostrar
     q ⟶ r ⊢ p ∨ q ⟶ p ∨ r
  ------------------------------------------------------------------ *}

lemma ej28: "q ⟶ r ⟹ p ∨ q ⟶ p ∨ r"
  apply (rule impI)       (* ⟦q ⟶ r; p ∨ q⟧ ⟹ p ∨ r *)
  apply (erule disjE)     (* ⟦q ⟶ r; p⟧ ⟹ p ∨ r
                             ⟦q ⟶ r; q⟧ ⟹ p ∨ r *)
   apply (erule disjI1)   (* ⟦q ⟶ r; q⟧ ⟹ p ∨ r *)
  apply (drule mp)        (* q ⟹ q
                             ⟦q; r⟧ ⟹ p ∨ r *)
   apply assumption       (* ⟦q; r⟧ ⟹ p ∨ r *)
  apply (erule disjI2)    (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 29. Demostrar
     p ∨ p ⊢ p
  ------------------------------------------------------------------ *}

lemma ej29: "p ∨ p ⟹ p"
  apply (erule disjE)   (* p ⟹ p
                           p ⟹ p *)
   apply assumption+
  done

text {* --------------------------------------------------------------- 
  Ejercicio 30. Demostrar
     p ⊢ p ∨ p
  ------------------------------------------------------------------ *}

lemma ej30: "p ⟹ p ∨ p"
  apply (erule disjI1)   (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 31. Demostrar
     p ∨ (q ∨ r) ⊢ (p ∨ q) ∨ r
  ------------------------------------------------------------------ *}

lemma ej31a: "p ∨ (q ∨ r) ⟹ (p ∨ q) ∨ r"
  apply (erule disjE)     (* p ⟹ (p ∨ q) ∨ r
                             q ∨ r ⟹ (p ∨ q) ∨ r *)
   apply (rule disjI1)    (* p ⟹ p ∨ q
                             q ∨ r ⟹ (p ∨ q) ∨ r *)
   apply (erule disjI1)   (* q ∨ r ⟹ (p ∨ q) ∨ r *)
  apply (erule disjE)     (* q ⟹ (p ∨ q) ∨ r
                             r ⟹ (p ∨ q) ∨ r *)
   apply (rule disjI1)    (* q ⟹ p ∨ q
                             r ⟹ (p ∨ q) ∨ r *)
   apply (erule disjI2)   (* r ⟹ (p ∨ q) ∨ r *)
  apply (erule disjI2)    (* *)
  done
    
lemma ej31b: "p ∨ (q ∨ r) ⟹ (p ∨ q) ∨ r"
  apply (erule disjE)     (* p ⟹ (p ∨ q) ∨ r
                             q ∨ r ⟹ (p ∨ q) ∨ r *)
   apply (rule disjI1)    (* p ⟹ p ∨ q
                             q ∨ r ⟹ (p ∨ q) ∨ r *)
   apply (erule disjI1)   (* q ∨ r ⟹ (p ∨ q) ∨ r *)
  apply (erule disjE)     (* q ⟹ (p ∨ q) ∨ r
                             r ⟹ (p ∨ q) ∨ r *)
  apply (rule disjI1,
         erule disjI2)    (* r ⟹ (p ∨ q) ∨ r *)
  apply (erule disjI2)    (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 32. Demostrar
     (p ∨ q) ∨ r ⊢ p ∨ (q ∨ r)
  ------------------------------------------------------------------ *}

lemma ej32a: "(p ∨ q) ∨ r ⟹ p ∨ (q ∨ r)"
  apply (erule disjE)      (* p ∨ q ⟹ p ∨ (q ∨ r)
                              r ⟹ p ∨ (q ∨ r) *)
   apply (erule disjE)     (* p ⟹ p ∨ (q ∨ r)
                              q ⟹ p ∨ (q ∨ r)
                              r ⟹ p ∨ (q ∨ r) *)
    apply (erule disjI1)   (* q ⟹ p ∨ (q ∨ r)
                              r ⟹ p ∨ (q ∨ r) *)
   apply (rule disjI2)     (* q ⟹ q ∨ r
                              r ⟹ p ∨ (q ∨ r) *)
   apply (erule disjI1)    (* r ⟹ p ∨ (q ∨ r) *)
  apply (rule disjI2)      (* r ⟹ q ∨ r *)
  apply (erule disjI2)     (* *)
  done
    
lemma ej32b: "(p ∨ q) ∨ r ⟹ p ∨ (q ∨ r)"
  apply (erule disjE)      (* p ∨ q ⟹ p ∨ (q ∨ r)
                              r ⟹ p ∨ (q ∨ r) *)
   apply (erule disjE)     (* p ⟹ p ∨ (q ∨ r)
                              q ⟹ p ∨ (q ∨ r)
                              r ⟹ p ∨ (q ∨ r) *)
    apply (erule disjI1)   (* q ⟹ p ∨ (q ∨ r)
                              r ⟹ p ∨ (q ∨ r) *)
  apply (rule disjI2,
         erule disjI1)     (* r ⟹ p ∨ (q ∨ r) *)
  apply (rule disjI2,
         erule disjI2)     (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 33. Demostrar
     p ∧ (q ∨ r) ⊢ (p ∧ q) ∨ (p ∧ r)
  ------------------------------------------------------------------ *}

lemma ej33a: "p ∧ (q ∨ r) ⟹ (p ∧ q) ∨ (p ∧ r)"
  apply (erule conjE)    (* ⟦p; q ∨ r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
  apply (erule disjE)    (* ⟦p; q⟧ ⟹ (p ∧ q) ∨ (p ∧ r)
                            ⟦p; r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
   apply (rule disjI1)   (* ⟦p; q⟧ ⟹ p ∧ q
                            ⟦p; r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
   apply (rule conjI)    (* ⟦p; q⟧ ⟹ p
                            ⟦p; q⟧ ⟹ q
                            ⟦p; r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
    apply assumption     (* ⟦p; q⟧ ⟹ q
                            ⟦p; r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
   apply assumption      (* ⟦p; r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
  apply (rule disjI2)    (* ⟦p; r⟧ ⟹ p ∧ r *)
  apply (rule conjI)     (* ⟦p; r⟧ ⟹ p 
                            ⟦p; r⟧ ⟹ r *)
   apply assumption      (* ⟦p; r⟧ ⟹ r *)
  apply assumption       (* *)
  done
    
lemma ej33b: "p ∧ (q ∨ r) ⟹ (p ∧ q) ∨ (p ∧ r)"
  apply (erule conjE)    (* ⟦p; q ∨ r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
  apply (erule disjE)    (* ⟦p; q⟧ ⟹ (p ∧ q) ∨ (p ∧ r)
                            ⟦p; r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
   apply (rule disjI1)   (* ⟦p; q⟧ ⟹ p ∧ q
                            ⟦p; r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
   apply (erule conjI,
          assumption)    (* ⟦p; r⟧ ⟹ (p ∧ q) ∨ (p ∧ r) *)
  apply (rule disjI2)    (* ⟦p; r⟧ ⟹ p ∧ r *)
  apply (erule conjI,
         assumption)     (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 34. Demostrar
     (p ∧ q) ∨ (p ∧ r) ⊢ p ∧ (q ∨ r)
  ------------------------------------------------------------------ *}

lemma ej34a: "(p ∧ q) ∨ (p ∧ r) ⟹ p ∧ (q ∨ r)"
  apply (erule disjE)    (* p ∧ q ⟹ p ∧ (q ∨ r)
                            p ∧ r ⟹ p ∧ (q ∨ r) *)
   apply (erule conjE)   (* ⟦p; q⟧ ⟹ p ∧ (q ∨ r)
                            p ∧ r ⟹ p ∧ (q ∨ r) *)
   apply (rule conjI)    (* ⟦p; q⟧ ⟹ p
                            ⟦p; q⟧ ⟹ q ∨ r
                            p ∧ r ⟹ p ∧ (q ∨ r) *)
    apply assumption     (* ⟦p; q⟧ ⟹ q ∨ r
                            p ∧ r ⟹ p ∧ (q ∨ r) *)
   apply (rule disjI1)   (* ⟦p; q⟧ ⟹ q
                            p ∧ r ⟹ p ∧ (q ∨ r) *)
   apply assumption      (* p ∧ r ⟹ p ∧ (q ∨ r) *)
  apply (erule conjE)    (* ⟦p; r⟧ ⟹ p ∧ (q ∨ r) *)
  apply (rule conjI)     (* ⟦p; r⟧ ⟹ p
                            ⟦p; r⟧ ⟹ q ∨ r *)
   apply assumption      (* ⟦p; r⟧ ⟹ q ∨ r *)
  apply (erule disjI2)   (* *)
  done
    
lemma ej34b: "(p ∧ q) ∨ (p ∧ r) ⟹ p ∧ (q ∨ r)"
  apply (erule disjE)    (* p ∧ q ⟹ p ∧ (q ∨ r)
                            p ∧ r ⟹ p ∧ (q ∨ r) *)
   apply (erule conjE)   (* ⟦p; q⟧ ⟹ p ∧ (q ∨ r)
                            p ∧ r ⟹ p ∧ (q ∨ r) *)
  apply (rule conjI,
         assumption)     (* ⟦p; q⟧ ⟹ q ∨ r
                            p ∧ r ⟹ p ∧ (q ∨ r) *)
  apply (rule disjI1,
         assumption)     (* p ∧ r ⟹ p ∧ (q ∨ r) *)
  apply (erule conjE)    (* ⟦p; r⟧ ⟹ p ∧ (q ∨ r) *)
  apply (rule conjI,
         assumption)     (* ⟦p; r⟧ ⟹ q ∨ r *)
  apply (erule disjI2)   (* *)
  done
    
lemma ej34c: "(p ∧ q) ∨ (p ∧ r) ⟹ p ∧ (q ∨ r)"
  apply (rule conjI)          (* (p ∧ q) ∨ (p ∧ r) ⟹ p
                                 (p ∧ q) ∨ (p ∧ r) ⟹ q ∨ r *)
   apply (erule disjE)        (* p ∧ q ⟹ p
                                 p ∧ r ⟹ p
                                 (p ∧ q) ∨ (p ∧ r) ⟹ q ∨ r *)
    apply (erule conjunct1)   (* p ∧ r ⟹ p
                                 (p ∧ q) ∨ (p ∧ r) ⟹ q ∨ r *)
   apply (erule conjunct1)    (* (p ∧ q) ∨ (p ∧ r) ⟹ q ∨ r *)
  apply (erule disjE)         (* p ∧ q ⟹ q ∨ r
                                 p ∧ r ⟹ q ∨ r *)
   apply (drule conjunct2)    (* q ⟹ q ∨ r
                                 p ∧ r ⟹ q ∨ r *)
   apply (rule disjI1)        (* q ⟹ q
                                 p ∧ r ⟹ q ∨ r *)
   apply assumption           (* p ∧ r ⟹ q ∨ r *)
  apply (drule conjunct2)     (* r ⟹ q ∨ r *)
  apply (erule disjI2)        (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 35. Demostrar
     p ∨ (q ∧ r) ⊢ (p ∨ q) ∧ (p ∨ r)
  ------------------------------------------------------------------ *}

lemma ej35a: "p ∨ (q ∧ r) ⟹ (p ∨ q) ∧ (p ∨ r)"
  apply (erule disjE)      (* p ⟹ (p ∨ q) ∧ (p ∨ r)
                              q ∧ r ⟹ (p ∨ q) ∧ (p ∨ r) *)
   apply (rule conjI)      (* p ⟹ p ∨ q
                              p ⟹ p ∨ r
                              q ∧ r ⟹ (p ∨ q) ∧ (p ∨ r) *)
    apply (erule disjI1)   (* p ⟹ p ∨ r
                              q ∧ r ⟹ (p ∨ q) ∧ (p ∨ r) *)
   apply (erule disjI1)    (* q ∧ r ⟹ (p ∨ q) ∧ (p ∨ r) *)
  apply (erule conjE)      (* ⟦q; r⟧ ⟹ (p ∨ q) ∧ (p ∨ r) *)
  apply (rule conjI)       (* ⟦q; r⟧ ⟹ p ∨ q
                              ⟦q; r⟧ ⟹ p ∨ r *)
   apply (erule disjI2)    (* ⟦q; r⟧ ⟹ p ∨ r *)
  apply (erule disjI2)     (* *)
  done
    
lemma ej35b: "p ∨ (q ∧ r) ⟹ (p ∨ q) ∧ (p ∨ r)"
  apply (rule conjI)         (* p ∨ (q ∧ r) ⟹ p ∨ q
                                p ∨ (q ∧ r) ⟹ p ∨ r *)
   apply (erule disjE)       (* p ⟹ p ∨ q
                                q ∧ r ⟹ p ∨ q
                                p ∨ (q ∧ r) ⟹ p ∨ r *)
    apply (erule disjI1)     (* q ∧ r ⟹ p ∨ q
                                p ∨ (q ∧ r) ⟹ p ∨ r *)
   apply (drule conjunct1)   (* q ⟹ p ∨ q
                                p ∨ (q ∧ r) ⟹ p ∨ r *)
   apply (erule disjI2)      (* p ∨ (q ∧ r) ⟹ p ∨ r *)
  apply (erule disjE)        (* p ⟹ p ∨ r
                                q ∧ r ⟹ p ∨ r *)
   apply (erule disjI1)      (* q ∧ r ⟹ p ∨ r *)
  apply (drule conjunct2)    (* r ⟹ p ∨ r *)
  apply (erule disjI2)       (* *)
  done

text {* --------------------------------------------------------------- 
  Ejercicio 36. Demostrar
     (p ∨ q) ∧ (p ∨ r) ⊢ p ∨ (q ∧ r)
  ------------------------------------------------------------------ *}

lemma ej36a: "(p ∨ q) ∧ (p ∨ r) ⟹ p ∨ (q ∧ r)"
  apply (erule conjE)     (* ⟦p ∨ q; p ∨ r⟧ ⟹ p ∨ (q ∧ r) *)
  apply (erule disjE)     (* ⟦p ∨ r; p⟧ ⟹ p ∨ (q ∧ r)
                             ⟦p ∨ r; q⟧ ⟹ p ∨ (q ∧ r) *)
   apply (erule disjI1)   (* ⟦p ∨ r; q⟧ ⟹ p ∨ (q ∧ r) *)
  apply (erule disjE)     (* ⟦q; p⟧ ⟹ p ∨ (q ∧ r)
                             ⟦q; r⟧ ⟹ p ∨ (q ∧ r) *)
   apply (erule disjI1)   (* ⟦q; r⟧ ⟹ p ∨ (q ∧ r) *)
  apply (rule disjI2)     (* ⟦q; r⟧ ⟹ q ∧ r *)
  apply (rule conjI)      (* ⟦q; r⟧ ⟹ q
                             ⟦q; r⟧ ⟹ r *)
   apply assumption       (* ⟦q; r⟧ ⟹ r *)
  apply assumption        (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 37. Demostrar
     (p ⟶ r) ∧ (q ⟶ r) ⊢ p ∨ q ⟶ r
  ------------------------------------------------------------------ *}

lemma ej37a: "(p ⟶ r) ∧ (q ⟶ r) ⟹ p ∨ q ⟶ r"
  apply (rule impI)           (* ⟦(p ⟶ r) ∧ (q ⟶ r); p ∨ q⟧ ⟹ r *)
  apply (erule conjE)         (* ⟦p ∨ q; p ⟶ r; q ⟶ r⟧ ⟹ r *)
  apply (erule disjE)         (* ⟦p ⟶ r; q ⟶ r; p⟧ ⟹ r
                                 ⟦p ⟶ r; q ⟶ r; q⟧ ⟹ r *)
   apply (erule mp)           (* ⟦q ⟶ r; p⟧ ⟹ p
                                 ⟦p ⟶ r; q ⟶ r; q⟧ ⟹ r *)
   apply assumption           (* ⟦p ⟶ r; q ⟶ r; q⟧ ⟹ r *) 
  apply (erule_tac P=q in mp) (* ⟦p ⟶ r; q⟧ ⟹ q *)
  apply assumption            (* *)
  done
    
lemma ej37b: "(p ⟶ r) ∧ (q ⟶ r) ⟹ p ∨ q ⟶ r"
  apply (rule impI)       (* (p ⟶ r) ∧ (q ⟶ r) ⟹ p ∨ q ⟹ r *)     
  apply (erule conjE)     (* ⟦p ∨ q; p ⟶ r; q ⟶ r⟧ ⟹ r *)
  apply (erule disjE)     (* ⟦p ⟶ r; q ⟶ r; p⟧ ⟹ r
                             ⟦p ⟶ r; q ⟶ r; q⟧ ⟹ r *)
   apply (erule mp,    
          assumption+)+   (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 38. Demostrar
     p ∨ q ⟶ r ⊢ (p ⟶ r) ∧ (q ⟶ r)
  ------------------------------------------------------------------ *}

lemma ej38a: "p ∨ q ⟶ r ⟹ (p ⟶ r) ∧ (q ⟶ r)"
  apply (rule conjI)      (* p ∨ q ⟶ r ⟹ p ⟶ r
                             p ∨ q ⟶ r ⟹ q ⟶ r *)
   apply (rule impI)      (* ⟦p ∨ q ⟶ r; p⟧ ⟹ r
                             p ∨ q ⟶ r ⟹ q ⟶ r *)
   apply (erule mp)       (* p ⟹ p ∨ q
                             p ∨ q ⟶ r ⟹ q ⟶ r *)
    apply (erule disjI1)  (* p ∨ q ⟶ r ⟹ q ⟶ r *)
  apply (rule impI)       (* ⟦p ∨ q ⟶ r; q⟧ ⟹ r *)
  apply (erule mp)        (* q ⟹ p ∨ q *)
  apply (erule disjI2)    (* *)
  done
    
section {* Negación *}

text {* --------------------------------------------------------------- 
  Ejercicio 39. Demostrar
     p ⊢ ¬¬p
  ------------------------------------------------------------------ *}

lemma ej39: "p ⟹ ¬¬p"
  apply (rule notI)    (* ⟦p; ¬ p⟧ ⟹ False *)
  apply (erule notE)   (* p ⟹ p *)
  apply assumption     (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 40. Demostrar
     ¬p ⊢ p ⟶ q
  ------------------------------------------------------------------ *}

lemma ej40: "¬p ⟹ p ⟶ q"
  apply (rule impI)   (* ⟦¬ p; p⟧ ⟹ q *)
  apply (erule notE)  (* p ⟹ p *)
  apply assumption    (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 41. Demostrar
     p ⟶ q ⊢ ¬q ⟶ ¬p
  ------------------------------------------------------------------ *}

lemma ej41: "p ⟶ q ⟹ ¬q ⟶ ¬p"
  apply (rule impI)    (* ⟦p ⟶ q; ¬ q⟧ ⟹ ¬ p *)  
  apply (rule notI)    (* ⟦p ⟶ q; ¬ q; p⟧ ⟹ False *)
  apply (drule mp)     (* ⟦¬ q; p⟧ ⟹ p
                          ⟦¬ q; p; q⟧ ⟹ False *)
   apply assumption    (* ⟦¬ q; p; q⟧ ⟹ False *)
  apply (erule notE)   (* ⟦p; q⟧ ⟹ q *)
  apply assumption     (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 42. Demostrar
     p ∨ q, ¬q ⊢ p
  ------------------------------------------------------------------ *}

lemma ej42: "⟦p ∨ q; ¬q⟧ ⟹ p"
  apply (erule disjE)   (* ⟦¬ q; p⟧ ⟹ p
                           ⟦¬ q; q⟧ ⟹ p *)
   apply assumption     (* ⟦¬ q; q⟧ ⟹ p  *)
  apply (erule notE)    (* q ⟹ q *)
  apply assumption      (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 43. Demostrar
     p ∨ q, ¬p ⊢ q
  ------------------------------------------------------------------ *}

lemma ej43: "⟦p ∨ q; ¬p⟧ ⟹ q"
  apply (erule disjE)   (* ⟦¬ p; p⟧ ⟹ q
                           ⟦¬ p; q⟧ ⟹ q *)
   apply (erule notE)   (* p ⟹ p
                           ⟦¬ p; q⟧ ⟹ q *)
   apply assumption     (* ⟦¬ p; q⟧ ⟹ q *)
  apply assumption      (* ⟦¬ p; q⟧ ⟹ q *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 44. Demostrar
     p ∨ q ⊢ ¬(¬p ∧ ¬q)
  ------------------------------------------------------------------ *}

lemma ej44a: "p ∨ q ⟹ ¬(¬p ∧ ¬q)"
  apply (rule notI)              (* ⟦p ∨ q; ¬ p ∧ ¬ q⟧ ⟹ False *)
  apply (erule conjE)            (* ⟦p ∨ q; ¬ p; ¬ q⟧ ⟹ False *)
  apply (erule disjE)            (* ⟦¬ p; ¬ q; p⟧ ⟹ False
                                    ⟦¬ p; ¬ q; q⟧ ⟹ False *)
   apply (erule notE)            (* ⟦¬ q; p⟧ ⟹ p
                                    ⟦¬ p; ¬ q; q⟧ ⟹ False *)
   apply assumption              (* ⟦¬ p; ¬ q; q⟧ ⟹ False *)
  apply (erule_tac P=q in notE)  (* ⟦¬ p; q⟧ ⟹ q *)
  apply assumption               (* *)
  done
    
lemma ej44: "p ∨ q ⟹ ¬(¬p ∧ ¬q)"
  apply (rule notI)                (* ⟦p ∨ q; ¬ p ∧ ¬ q⟧ ⟹ False *)
  apply (erule conjE)              (* ⟦p ∨ q; ¬ p; ¬ q⟧ ⟹ False *)
  apply (erule disjE)              (* ⟦¬ p; ¬ q; p⟧ ⟹ False
                                      ⟦¬ p; ¬ q; q⟧ ⟹ False *)
   apply (erule notE, assumption)+ (* *)
  done                            
    
text {* --------------------------------------------------------------- 
  Ejercicio 45. Demostrar
     p ∧ q ⊢ ¬(¬p ∨ ¬q)
  ------------------------------------------------------------------ *}

lemma ej45a: "p ∧ q ⟹ ¬(¬p ∨ ¬q)"
  apply (rule notI)     (* ⟦p ∧ q; ¬ p ∨ ¬ q⟧ ⟹ False *)
  apply (erule conjE)   (* ⟦¬ p ∨ ¬ q; p; q⟧ ⟹ False *) 
  apply (erule disjE)   (* ⟦p; q; ¬ p⟧ ⟹ False
                           ⟦p; q; ¬ q⟧ ⟹ False *)
   apply (erule notE)   (* ⟦p; q⟧ ⟹ p
                           ⟦p; q; ¬ q⟧ ⟹ False *)
   apply assumption     (* ⟦p; q; ¬ q⟧ ⟹ False *)
  apply (erule notE)    (* ⟦p; q⟧ ⟹ q *)
  apply assumption      (* *)
  done
    
lemma ej45b: "p ∧ q ⟹ ¬(¬p ∨ ¬q)"
  apply (rule notI)     (* ⟦p ∧ q; ¬ p ∨ ¬ q⟧ ⟹ False *)
  apply (erule conjE)   (* ⟦¬ p ∨ ¬ q; p; q⟧ ⟹ False *) 
  apply (erule disjE)   (* ⟦p; q; ¬ p⟧ ⟹ False
                           ⟦p; q; ¬ q⟧ ⟹ False *)
  apply (erule notE,
         assumption)    (* ⟦p; q; ¬ q⟧ ⟹ False *)
  apply (erule notE,
         assumption)    (* *)
  done
    
lemma ej45c: "p ∧ q ⟹ ¬(¬p ∨ ¬q)"
  apply (rule notI)     (* ⟦p ∧ q; ¬ p ∨ ¬ q⟧ ⟹ False *)
  apply (erule conjE)   (* ⟦¬ p ∨ ¬ q; p; q⟧ ⟹ False *) 
  apply (erule disjE)   (* ⟦p; q; ¬ p⟧ ⟹ False
                           ⟦p; q; ¬ q⟧ ⟹ False *)
  apply (erule notE,
         assumption)+   (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 46. Demostrar
     ¬(p ∨ q) ⊢ ¬p ∧ ¬q
  ------------------------------------------------------------------ *}

lemma ej46b: "¬(p ∨ q) ⟹ ¬p ∧ ¬q"
  apply (rule conjI)     (* ¬ (p ∨ q) ⟹ ¬ p
                            ¬ (p ∨ q) ⟹ ¬ q *)
   apply (rule notI)     (* ⟦¬ (p ∨ q); p⟧ ⟹ False
                            ¬ (p ∨ q) ⟹ ¬ q *)
   apply (erule notE)    (* p ⟹ p ∨ q
                            ¬ (p ∨ q) ⟹ ¬ q *)
   apply (erule disjI1)  (* ¬ (p ∨ q) ⟹ ¬ q *)
  apply (rule notI)      (* ⟦¬ (p ∨ q); q⟧ ⟹ False *)
  apply (erule notE)     (* q ⟹ p ∨ q *)
  apply (erule disjI2)   (* *) 
  done
    
lemma ej46b: "¬(p ∨ q) ⟹ ¬p ∧ ¬q"
  apply (rule conjI)       (* ¬ (p ∨ q) ⟹ ¬ p
                              ¬ (p ∨ q) ⟹ ¬ q *)
  apply (rule notI,
         erule notE,
         (erule disjI1 |
          erule disjI2))+  (* *)
  done
    
lemma ej46c: "¬(p ∨ q) ⟹ ¬p ∧ ¬q"
  by (rule conjI,
      (rule notI,
       erule notE,
       (erule disjI1 |
        erule disjI2))+)
    
text {* --------------------------------------------------------------- 
  Ejercicio 47. Demostrar
     ¬p ∧ ¬q ⊢ ¬(p ∨ q)
  ------------------------------------------------------------------ *}

lemma ej47a: "¬p ∧ ¬q ⟹ ¬(p ∨ q)"
  apply (rule notI)              (* ⟦¬ p ∧ ¬ q; p ∨ q⟧ ⟹ False *) 
  apply (erule disjE)            (* ⟦¬ p ∧ ¬ q; p⟧ ⟹ False
                                    ⟦¬ p ∧ ¬ q; q⟧ ⟹ False *)
   apply (drule conjunct1)       (* ⟦p; ¬ p⟧ ⟹ False
                                    ⟦¬ p ∧ ¬ q; q⟧ ⟹ False *)
   apply (erule notE)            (* p ⟹ p
                                    ⟦¬ p ∧ ¬ q; q⟧ ⟹ False *)
   apply assumption              (* ⟦¬ p ∧ ¬ q; q⟧ ⟹ False*)
  apply (drule conjunct2)        (* ⟦q; ¬ q⟧ ⟹ False *)
  apply (erule notE)             (* q ⟹ q *)
  apply assumption               (* *)

lemma ej47b: "¬p ∧ ¬q ⟹ ¬(p ∨ q)"
  apply (rule notI)              (* ⟦¬ p ∧ ¬ q; p ∨ q⟧ ⟹ False *) 
  apply (erule disjE)            (* ⟦¬ p ∧ ¬ q; p⟧ ⟹ False
                                    ⟦¬ p ∧ ¬ q; q⟧ ⟹ False *)
  apply ((drule conjunct1 |
          drule conjunct2),
         erule notE,
         assumption)+            (* *)

lemma ej47: "¬p ∧ ¬q ⟹ ¬(p ∨ q)"
  apply (rule notI)     (* ⟦¬ p ∧ ¬ q; p ∨ q⟧ ⟹ False *)
  apply (erule conjE)   (* ⟦p ∨ q; ¬ p; ¬ q⟧ ⟹ False *)
  apply (erule disjE)
   apply (erule notE, 
          assumption)+  (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 48. Demostrar
     ¬p ∨ ¬q ⊢ ¬(p ∧ q)
  ------------------------------------------------------------------ *}

lemma ej48a: "¬p ∨ ¬q ⟹ ¬(p ∧ q)"
  apply (rule notI)         (* ⟦¬ p ∨ ¬ q; p ∧ q⟧ ⟹ False *)
  apply (erule disjE)       (* ⟦p ∧ q; ¬ p⟧ ⟹ False
                               ⟦p ∧ q; ¬ q⟧ ⟹ False *)
   apply (drule conjunct1)  (* ⟦¬ p; p⟧ ⟹ False
                               ⟦p ∧ q; ¬ q⟧ ⟹ False *)
   apply (erule notE)       (* p ⟹ p
                               ⟦p ∧ q; ¬ q⟧ ⟹ False *)
   apply assumption         (* ⟦p ∧ q; ¬ q⟧ ⟹ False *)
  apply (drule conjunct2)   (* ⟦¬ q; q⟧ ⟹ False *)
  apply (erule notE)        (* q ⟹ q *)
  apply assumption          (* *)
  done

lemma ej48b: "¬p ∨ ¬q ⟹ ¬(p ∧ q)"
  apply (rule notI)     (* ⟦¬ p ∨ ¬ q; p ∧ q⟧ ⟹ False *)
  apply (erule conjE)   (* ⟦¬ p ∨ ¬ q; p; q⟧ ⟹ False *)
  apply (erule disjE)   (* ⟦p; q; ¬ p⟧ ⟹ False
                           ⟦p; q; ¬ q⟧ ⟹ False *)
   apply (erule notE, 
          assumption)+  (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 49. Demostrar
     ⊢ ¬(p ∧ ¬p)
  ------------------------------------------------------------------ *}

lemma ej49: "¬(p ∧ ¬p)"
  apply (rule notI)     (* p ∧ ¬ p ⟹ False *)
  apply (erule conjE)   (* ⟦p; ¬ p⟧ ⟹ False *)
  apply (erule notE)    (* ⟦p; ¬ p⟧ ⟹ False *)
  apply assumption      (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 50. Demostrar
     p ∧ ¬p ⊢ q
  ------------------------------------------------------------------ *}

lemma ej50: "p ∧ ¬p ⟹ q"
  apply (erule conjE)  (* ⟦p; ¬ p⟧ ⟹ q *)
  apply (erule notE)   (* p ⟹ p *)
  apply assumption     (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 51. Demostrar
     ¬¬p ⊢ p
  ------------------------------------------------------------------ *}

lemma ej51: "¬¬p ⟹ p"
  apply (erule notnotD)  (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 52. Demostrar
     ⊢ p ∨ ¬p
  ------------------------------------------------------------------ *}

lemma ej52: "p ∨ ¬p"
  apply (cut_tac P="¬p" in excluded_middle) (* ¬¬p ∨ ¬p ⟹ p ∨ ¬p*)
  apply (erule disjE)                       (* ¬ ¬ p ⟹ p ∨ ¬ p
                                               ¬ p ⟹ p ∨ ¬ p *) 
  apply (rule disjI1)                       (* ¬ ¬ p ⟹ p
                                               ¬ p ⟹ p ∨ ¬ p *)
   apply (erule notnotD)                    (* ¬ p ⟹ p ∨ ¬ p *) 
  apply (erule disjI2)                      (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 53. Demostrar
     ⊢ ((p ⟶ q) ⟶ p) ⟶ p
  ------------------------------------------------------------------ *}

lemma ej53: "((p ⟶ q) ⟶ p) ⟶ p"
  apply (cut_tac P="p ⟶ q" in excluded_middle)
                       (* ¬ (p ⟶ q) ∨ (p ⟶ q) ⟹
                          ((p ⟶ q) ⟶ p) ⟶ p *)
  apply (erule disjE)  (* ¬ (p ⟶ q) ⟹ ((p ⟶ q) ⟶ p) ⟶ p
                          p ⟶ q ⟹ ((p ⟶ q) ⟶ p) ⟶ p *)
   apply (rule impI)   (* ⟦¬ (p ⟶ q); (p ⟶ q) ⟶ p⟧ ⟹ p
                          p ⟶ q ⟹ ((p ⟶ q) ⟶ p) ⟶ p *)
  apply (rule ccontr)  (* ⟦¬ (p ⟶ q); (p ⟶ q) ⟶ p; ¬ p⟧ ⟹ False
                          p ⟶ q ⟹ ((p ⟶ q) ⟶ p) ⟶ p *)
   apply (erule_tac P="p ⟶ q" in notE)
                       (* ⟦(p ⟶ q) ⟶ p; ¬ p⟧ ⟹ p ⟶ q
                          p ⟶ q ⟹ ((p ⟶ q) ⟶ p) ⟶ p *) 
   apply (rule impI)   (* ⟦(p ⟶ q) ⟶ p; ¬ p; p⟧ ⟹ q
                          p ⟶ q ⟹ ((p ⟶ q) ⟶ p) ⟶ p *)
   apply (erule notE)  (* ⟦(p ⟶ q) ⟶ p; p⟧ ⟹ p
                          p ⟶ q ⟹ ((p ⟶ q) ⟶ p) ⟶ p *) 
   apply assumption    (* p ⟶ q ⟹ ((p ⟶ q) ⟶ p) ⟶ p *)
  apply (rule impI)    (* ⟦p ⟶ q; (p ⟶ q) ⟶ p⟧ ⟹ p *)
  apply (erule_tac P="p ⟶q" in mp)
                       (*  p ⟶ q ⟹ p ⟶ q *)
  apply assumption     (* *)

text {* --------------------------------------------------------------- 
  Ejercicio 54. Demostrar
     ¬q ⟶ ¬p ⊢ p ⟶ q
  ------------------------------------------------------------------ *}

lemma ej54: "¬q ⟶ ¬p ⟹ p ⟶ q"
  apply (rule impI)      (* ⟦¬ q ⟶ ¬ p; p⟧ ⟹ q *)
  apply (rule notnotD)   (* ⟦¬ q ⟶ ¬ p; p⟧ ⟹ ¬ ¬ q *)
  apply (erule mt)       (* p ⟹ ¬ ¬ p *)
  apply (erule notnotI)  (* *)
  done

text {* --------------------------------------------------------------- 
  Ejercicio 55. Demostrar
     ¬(¬p ∧ ¬q) ⊢ p ∨ q
  ------------------------------------------------------------------ *}

lemma ej55: "¬(¬p ∧ ¬q) ⟹ p ∨ q"
  apply (cut_tac P=p in excluded_middle)
                        (* ⟦¬ (¬ p ∧ ¬ q); ¬ p ∨ p⟧ ⟹ p ∨ q *)  
  apply (erule disjE)   (* ⟦¬ (¬ p ∧ ¬ q); ¬ p⟧ ⟹ p ∨ q
                           ⟦¬ (¬ p ∧ ¬ q); p⟧ ⟹ p ∨ q *)
   apply (cut_tac P=q in excluded_middle)
                        (* ⟦¬ (¬ p ∧ ¬ q); ¬ p; ¬ q ∨ q⟧ ⟹ p ∨ q
                           ⟦¬ (¬ p ∧ ¬ q); p⟧ ⟹ p ∨ q *)
   apply (erule disjE)  (* ⟦¬ (¬ p ∧ ¬ q); ¬ p; ¬ q⟧ ⟹ p ∨ q
                           ⟦¬ (¬ p ∧ ¬ q); ¬ p; q⟧ ⟹ p ∨ q
                           ⟦¬ (¬ p ∧ ¬ q); p⟧ ⟹ p ∨ q *)
    apply (erule notE)  (* ⟦¬ p; ¬ q⟧ ⟹ ¬ p ∧ ¬ q
                           ⟦¬ (¬ p ∧ ¬ q); ¬ p; q⟧ ⟹ p ∨ q
                           ⟦¬ (¬ p ∧ ¬ q); p⟧ ⟹ p ∨ q *)
    apply (rule conjI)  (* ⟦¬ p; ¬ q⟧ ⟹ ¬ p
                           ⟦¬ p; ¬ q⟧ ⟹ ¬ q
                           ⟦¬ (¬ p ∧ ¬ q); ¬ p; q⟧ ⟹ p ∨ q
                           ⟦¬ (¬ p ∧ ¬ q); p⟧ ⟹ p ∨ q *)
     apply assumption+  (* ⟦¬ (¬ p ∧ ¬ q); ¬ p; q⟧ ⟹ p ∨ q
                           ⟦¬ (¬ p ∧ ¬ q); p⟧ ⟹ p ∨ q *)
   apply (erule disjI2) (* ⟦¬ (¬ p ∧ ¬ q); p⟧ ⟹ p ∨ q *)
  apply (erule disjI1)  (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 56. Demostrar
     ¬(¬p ∨ ¬q) ⊢ p ∧ q
  ------------------------------------------------------------------ *}

lemma ej56a: "¬(¬p ∨ ¬q) ⟹ p ∧ q"
  apply (rule conjI)     (* ¬ (¬ p ∨ ¬ q) ⟹ p
                            ¬ (¬ p ∨ ¬ q) ⟹ q *)
   apply (rule ccontr)   (* ⟦¬ (¬ p ∨ ¬ q); ¬ p⟧ ⟹ False
                            ¬ (¬ p ∨ ¬ q) ⟹ q *)
   apply (erule notE)    (* ¬ p ⟹ ¬ p ∨ ¬ q
                            ¬ (¬ p ∨ ¬ q) ⟹ q *)
   apply (erule disjI1)  (* ¬ (¬ p ∨ ¬ q) ⟹ q *)
  apply (rule ccontr)    (* ⟦¬ (¬ p ∨ ¬ q); ¬ q⟧ ⟹ False *)
  apply (erule notE)     (* ¬ q ⟹ ¬ p ∨ ¬ q *)
  apply (erule disjI2)   (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 57. Demostrar
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q
  ------------------------------------------------------------------ *}

lemma ej57: "¬(p ∧ q) ⟹ ¬p ∨ ¬q"
  apply (cut_tac P=p in excluded_middle)
                         (* ⟦¬ (p ∧ q); ¬ p ∨ p⟧ ⟹ ¬ p ∨ ¬ q *)
  apply (erule disjE)    (* ⟦¬ (p ∧ q); ¬ p⟧ ⟹ ¬ p ∨ ¬ q
                            ⟦¬ (p ∧ q); p⟧ ⟹ ¬ p ∨ ¬ q *)
   apply (erule disjI1)  (* ⟦¬ (p ∧ q); p⟧ ⟹ ¬ p ∨ ¬ q *)
  apply (cut_tac P=q in excluded_middle)
                         (* ⟦¬ (p ∧ q); p; ¬ q ∨ q⟧ ⟹ ¬ p ∨ ¬ q *)
  apply (erule disjE)    (* ⟦¬ (p ∧ q); p; ¬ q⟧ ⟹ ¬ p ∨ ¬ q
                            ⟦¬ (p ∧ q); p; q⟧ ⟹ ¬ p ∨ ¬ q *)
   apply (erule disjI2)  (* ⟦¬ (p ∧ q); p; q⟧ ⟹ ¬ p ∨ ¬ q *) 
  apply (erule notE)     (* ⟦p; q⟧ ⟹ p ∧ q *)
  apply (rule conjI)     (* ⟦p; q⟧ ⟹ p
                            ⟦p; q⟧ ⟹ q *)
   apply assumption+     (* *)
  done
    
text {* --------------------------------------------------------------- 
  Ejercicio 58. Demostrar
     ⊢ (p ⟶ q) ∨ (q ⟶ p)
  ------------------------------------------------------------------ *}

lemma ej58a: "(p ⟶ q) ∨ (q ⟶ p)"
  apply (cut_tac P=p in excluded_middle)
                        (* ¬ p ∨ p ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
  apply (erule disjE)   (* ¬ p ⟹ (p ⟶ q) ∨ (q ⟶ p)
                           p ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
   apply (rule disjI1)  (* ¬ p ⟹ p ⟶ q
                           p ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
  apply (rule impI)     (* ⟦¬ p; p⟧ ⟹ q
                           p ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
  apply (erule notE)    (* p ⟹ p
                           p ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
   apply assumption     (* p ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
  apply (rule disjI2)   (* p ⟹ q ⟶ p *)
  apply (rule impI)     (* ⟦p; q⟧ ⟹ p *)
  apply assumption      (* *)
  done

lemma ej58b: "(p ⟶ q) ∨ (q ⟶ p)"
  apply (cut_tac P="p ⟶ q" in excluded_middle)
                        (* ¬ (p ⟶ q) ∨ (p ⟶ q) ⟹
                           (p ⟶ q) ∨ (q ⟶ p) *)
  apply (erule disjE)   (* ¬ (p ⟶ q) ⟹ (p ⟶ q) ∨ (q ⟶ p)
                           p ⟶ q ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
   apply (rule disjI2)  (* ¬ (p ⟶ q) ⟹ q ⟶ p
                           p ⟶ q ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
   apply (rule impI)    (* ⟦¬ (p ⟶ q); q⟧ ⟹ p
                           p ⟶ q ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
  apply (erule notE)    (* q ⟹ p ⟶ q
                           p ⟶ q ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
   apply (rule impI)    (* ⟦q; p⟧ ⟹ q
                           p ⟶ q ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
   apply assumption     (* p ⟶ q ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
  apply (erule disjI1)  (* *)
  done

lemma ej58c: "(p ⟶ q) ∨ (q ⟶ p)"
  apply (cut_tac P="¬(p ⟶ q)" in excluded_middle)
         (* ¬ ¬ (p ⟶ q) ∨ ¬ (p ⟶ q) ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
  apply (erule disjE)     (* ¬ ¬ (p ⟶ q) ⟹ (p ⟶ q) ∨ (q ⟶ p)
                             ¬ (p ⟶ q) ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
   apply (drule notnotD)  (* p ⟶ q ⟹ (p ⟶ q) ∨ (q ⟶ p)
                             ¬ (p ⟶ q) ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
   apply (erule disjI1)   (* ¬ (p ⟶ q) ⟹ (p ⟶ q) ∨ (q ⟶ p) *)
  apply (rule disjI2)     (* ¬ (p ⟶ q) ⟹ q ⟶ p *)
  apply (rule impI)       (* ⟦¬ (p ⟶ q); q⟧ ⟹ p *)
  apply (erule notE)      (* q ⟹ p ⟶ q *)
  apply (rule impI)       (* ⟦q; p⟧ ⟹ q *)
  apply assumption        (* *)
  done

end