<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/LMF2019/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mjoseh</id>
	<title>Lógica matemática y fundamentos (2018-19) - Contribuciones del usuario [es]</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/LMF2019/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mjoseh"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php/Especial:Contribuciones/Mjoseh"/>
	<updated>2026-07-18T07:36:33Z</updated>
	<subtitle>Contribuciones del usuario</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_13&amp;diff=806</id>
		<title>Sol 13</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_13&amp;diff=806"/>
		<updated>2019-06-26T16:02:22Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R13: Definiciones inductivas: clausuras *}&lt;br /&gt;
&lt;br /&gt;
theory R13_sol&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* La clausura reflexiva transitiva *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · Las definiciones inductivas aceptan parámetros; por tanto, permite&lt;br /&gt;
    expresar funciones que construyen conjuntos.&lt;br /&gt;
&lt;br /&gt;
  · La relaciones binarias son conjuntos de pares; por tanto, se pueden&lt;br /&gt;
   definir inductivamente.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · La clausura reflexiva y transitiva de una relación r es la menor&lt;br /&gt;
   relación reflexiva y transitiva que contiene a r. &lt;br /&gt;
&lt;br /&gt;
  · Se representa por r*.&lt;br /&gt;
&lt;br /&gt;
  · Se puede definir inductivamente, como conjunto:&lt;br /&gt;
    · (x,x) ∈ r*&lt;br /&gt;
    · Si (x,y) ∈ r e (y,z) ∈ r*, entonces (x,z) ∈ r*&lt;br /&gt;
&lt;br /&gt;
  · La definición inductiva, como conjunto, se puede expresar en &lt;br /&gt;
   Isabelle/HOL como sigue: &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set&lt;br /&gt;
  crt :: &amp;quot;(&amp;#039;a × &amp;#039;a) set ⇒ (&amp;#039;a × &amp;#039;a) set&amp;quot;   (&amp;quot;_*&amp;quot; [1000] 999)&lt;br /&gt;
  for r :: &amp;quot;(&amp;#039;a × &amp;#039;a) set&amp;quot;&lt;br /&gt;
where&lt;br /&gt;
  crt_refl [iff]: &amp;quot;(x,x) ∈ r*&amp;quot;&lt;br /&gt;
| crt_paso:       &amp;quot;⟦(x,y) ∈ r; (y,z) ∈ r* ⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La sintaxis concreta permite escribir r* en lugar de (crt r).&lt;br /&gt;
  · La definición consta de dos reglas.&lt;br /&gt;
  · A la regla reflexiva se le añade el atributo iff para aumentar la&lt;br /&gt;
    automatización. &lt;br /&gt;
  · A la regla del paso no se le añade ningún atributo, porque r* ocurre&lt;br /&gt;
   en la izquierda. &lt;br /&gt;
  · En el resto de esta sección se demuestra que esta definición&lt;br /&gt;
   coincide con la menor relación reflexiva y transitiva que contiene a&lt;br /&gt;
   r.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* es reflexiva.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x,x) ∈ r*&amp;quot;&lt;br /&gt;
  by (rule crt_refl)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* contiene a r.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;  &lt;br /&gt;
  apply (erule crt_paso)&lt;br /&gt;
    (* (y, y) ∈ r**)&lt;br /&gt;
  apply (rule crt_refl)&lt;br /&gt;
    (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma r_contenida_clausura [intro]: &lt;br /&gt;
  &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  by (simp add: crt_paso) &lt;br /&gt;
(* by (auto intro: crt_paso) *)&lt;br /&gt;
    &lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;  &lt;br /&gt;
proof -&lt;br /&gt;
  assume 1: &amp;quot;(x, y) ∈ r&amp;quot;&lt;br /&gt;
  have  2: &amp;quot;(y, y) ∈ r*&amp;quot; by simp&lt;br /&gt;
  show &amp;quot;(x,y) ∈ r*&amp;quot; using 1 2 by (rule crt_paso)&lt;br /&gt;
  qed&lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La ventaja del lema es que se puede declarar como regla de&lt;br /&gt;
    introducción, porque r* ocurre sólo en la derecha.&lt;br /&gt;
  · Con la declaración, algunas demostraciones que usan crt_paso se&lt;br /&gt;
    hacen de manera automática.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El esquema de inducción de la clausura reflexiva transitiva es&lt;br /&gt;
  · crt.induct:&lt;br /&gt;
    ⟦(x1, x2) ∈ r*; &lt;br /&gt;
     ⋀x. P x x; &lt;br /&gt;
     ⋀x y z. ⟦(x,y) ∈ r; (y,z) ∈ r*; P y z⟧ ⟹ P x z⟧&lt;br /&gt;
    ⟹ P x1 x2&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* es transitiva.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;⟦(x,y) ∈ r*; (y,z) ∈ r*⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  apply (induction rule:crt.induct)&lt;br /&gt;
    (* 1. ⋀x. (x, z) ∈ r* ⟹ (x, z) ∈ r*&lt;br /&gt;
       2. ⋀x y za. ⟦(x, y) ∈ r; (y, za) ∈ r*;&lt;br /&gt;
                    (za, z) ∈ r* ⟹ (y, z) ∈ r*;&lt;br /&gt;
                    (za, z) ∈ r*⟧&lt;br /&gt;
                   ⟹ (x, z) ∈ r* *)&lt;br /&gt;
  apply simp&lt;br /&gt;
    (* 1. ⋀x y za. ⟦(x, y) ∈ r; (y, za) ∈ r*;&lt;br /&gt;
                    (za, z) ∈ r* ⟹ (y, z) ∈ r*;&lt;br /&gt;
                    (za, z) ∈ r*⟧&lt;br /&gt;
                   ⟹ (x, z) ∈ r**)&lt;br /&gt;
  apply (simp add: crt_paso)&lt;br /&gt;
    (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;⟦ (x,y) ∈ r*; (y,z) ∈ r* ⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  by (induction rule: crt.induct)&lt;br /&gt;
     (simp_all add: crt_paso)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Otra formulación del lema, con la variable y a la derecha.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  apply (induction rule: crt.induct)&lt;br /&gt;
     (* 1. ⋀x. (x, z) ∈ r* ⟶ (x, z) ∈ r*&lt;br /&gt;
        2. ⋀x y za. ⟦(x, y) ∈ r; &lt;br /&gt;
                     (y, za) ∈ r*;&lt;br /&gt;
                     (za, z) ∈ r* ⟶ (y, z) ∈ r*⟧&lt;br /&gt;
                    ⟹ (za, z) ∈ r* ⟶ (x, z) ∈ r* *)&lt;br /&gt;
   apply simp&lt;br /&gt;
     (* ⋀x y za. ⟦(x, y) ∈ r; &lt;br /&gt;
                  (y, za) ∈ r*;&lt;br /&gt;
                  (za, z) ∈ r* ⟶ (y, z) ∈ r*⟧&lt;br /&gt;
                 ⟹ (za, z) ∈ r* ⟶ (x, z) ∈ r* *)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
     (* ⋀x y za. ⟦(x, y) ∈ r; &lt;br /&gt;
                  (y, za) ∈ r*;&lt;br /&gt;
                  (za, z) ∈ r* ⟶ (y, z) ∈ r*;&lt;br /&gt;
                  (za, z) ∈ r*⟧&lt;br /&gt;
                 ⟹ (za, z) ∈ r* ⟶ (x, z) ∈ r* *)&lt;br /&gt;
  apply (drule mp)&lt;br /&gt;
     (* 1. ⋀x y za. ⟦(x, y) ∈ r; (y, za) ∈ r*; (za, z) ∈ r*⟧&lt;br /&gt;
                    ⟹ (za, z) ∈ r*&lt;br /&gt;
        2. ⋀x y za. ⟦(x, y) ∈ r; &lt;br /&gt;
                     (y, za) ∈ r*; &lt;br /&gt;
                     (za, z) ∈ r*;&lt;br /&gt;
                     (y, z) ∈ r*⟧&lt;br /&gt;
                    ⟹ (x, z) ∈ r* *)&lt;br /&gt;
   apply assumption&lt;br /&gt;
     (* ⋀x y za. ⟦(x, y) ∈ r; &lt;br /&gt;
                  (y, za) ∈ r*; &lt;br /&gt;
                  (za, z) ∈ r*;&lt;br /&gt;
                  (y, z) ∈ r*⟧&lt;br /&gt;
                 ⟹ (x, z) ∈ r* *)&lt;br /&gt;
  apply (erule crt_paso)&lt;br /&gt;
     (* ⋀x y za. ⟦(y, za) ∈ r*; (za, z) ∈ r*; (y, z) ∈ r*⟧&lt;br /&gt;
                 ⟹ (y, z) ∈ r**)&lt;br /&gt;
  apply assumption&lt;br /&gt;
     (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  by (induction rule:crt.induct)&lt;br /&gt;
     (auto simp add: crt_paso)&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma crt_trans [rule_format]:&lt;br /&gt;
  &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
proof (induction rule:crt.induct)&lt;br /&gt;
  show &amp;quot;⋀x. (x,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y u&lt;br /&gt;
  assume H1: &amp;quot;(x,y) ∈ r&amp;quot; and&lt;br /&gt;
         H2: &amp;quot;(y,u) ∈ r*&amp;quot; and&lt;br /&gt;
         H3: &amp;quot;(u,z) ∈ r* ⟶ (y,z) ∈ r*&amp;quot;&lt;br /&gt;
  show &amp;quot;(u,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;(u,z) ∈ r*&amp;quot;&lt;br /&gt;
    with H3 have &amp;quot;(y,z) ∈ r*&amp;quot; ..&lt;br /&gt;
    with H1 show &amp;quot;(x,z) ∈ r*&amp;quot; by (rule crt_paso) &lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La reformulación anterior es un caso particular de la siguiente&lt;br /&gt;
    heurística:&lt;br /&gt;
       &amp;quot;Para probar una fórmula por inducción sobre (x1,...,xn) ∈ R,&lt;br /&gt;
       poner todas las premisas conteniendo cualquiera de lax xi en la&lt;br /&gt;
       conclusión usando ⟶&amp;quot;. &lt;br /&gt;
  · El atributo &amp;quot;rule_format&amp;quot; transforma ⟶ en ⟹.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La relación r* está contenida en cualquier relación reflexiva y &lt;br /&gt;
  transitiva que contenga a r.&lt;br /&gt;
&lt;br /&gt;
  Mediante (crt2 r) se define la menor relación reflexiva y transitiva &lt;br /&gt;
  que contiene a r.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set&lt;br /&gt;
  crt2 :: &amp;quot;(&amp;#039;a × &amp;#039;a)set ⇒ (&amp;#039;a × &amp;#039;a)set&amp;quot;&lt;br /&gt;
  for r :: &amp;quot;(&amp;#039;a × &amp;#039;a)set&amp;quot;&lt;br /&gt;
where&lt;br /&gt;
  &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ crt2 r&amp;quot;                      (* contiene a r *) &lt;br /&gt;
| &amp;quot;(x,x) ∈ crt2 r&amp;quot;                                      (* reflexiva *)&lt;br /&gt;
| &amp;quot;⟦(x,y) ∈ crt2 r; (y,z) ∈ crt2 r⟧ ⟹ (x,z) ∈ crt2 r&amp;quot; (* transitiva *)&lt;br /&gt;
&lt;br /&gt;
text {* Probaremos que r* coincide con (crt2 r) *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación (crt2 r) está contenida en r*.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  apply (induction rule: crt2.induct)&lt;br /&gt;
      (*  1. ⋀x y. (x, y) ∈ r ⟹ (x, y) ∈ r*&lt;br /&gt;
          2. ⋀x. (x, x) ∈ r*&lt;br /&gt;
          3. ⋀x y z. ⟦(x, y) ∈ crt2 r; (x, y) ∈ r*;&lt;br /&gt;
                      (y, z) ∈ crt2 r; (y, z) ∈ r*⟧&lt;br /&gt;
                     ⟹ (x, z) ∈ r* *)&lt;br /&gt;
    apply (erule r_contenida_clausura)&lt;br /&gt;
      (* 1. ⋀x. (x, x) ∈ r*&lt;br /&gt;
         2. ⋀x y z. ⟦(x, y) ∈ crt2 r; (x, y) ∈ r*;&lt;br /&gt;
                     (y, z) ∈ crt2 r; (y, z) ∈ r*⟧&lt;br /&gt;
                    ⟹ (x, z) ∈ r* *)&lt;br /&gt;
   apply simp&lt;br /&gt;
      (* ⋀x y z. ⟦(x, y) ∈ crt2 r; (x, y) ∈ r*;&lt;br /&gt;
                  (y, z) ∈ crt2 r; (y, z) ∈ r*⟧&lt;br /&gt;
                 ⟹ (x, z) ∈ r* *)&lt;br /&gt;
  apply (erule crt_trans)&lt;br /&gt;
      (* ⋀x y z. ⟦(x, y) ∈ crt2 r; (y, z) ∈ crt2 r; (y, z) ∈ r*⟧&lt;br /&gt;
                 ⟹ (y, z) ∈ r* *)&lt;br /&gt;
  apply assumption&lt;br /&gt;
      (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  by (induction rule: crt2.induct)&lt;br /&gt;
     (auto simp add: r_contenida_clausura &lt;br /&gt;
                     crt_trans)&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
proof (induction rule: crt2.induct)&lt;br /&gt;
  fix x y&lt;br /&gt;
  assume &amp;quot;(x,y) ∈ r&amp;quot;&lt;br /&gt;
  then show &amp;quot;(x,y) ∈ r*&amp;quot; by (rule r_contenida_clausura) (* blast*)&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;(x,x) ∈ r*&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume H1: &amp;quot;(x,y) ∈ crt2 r&amp;quot; and&lt;br /&gt;
         H2: &amp;quot;(x,y) ∈ r*&amp;quot;     and&lt;br /&gt;
         H3: &amp;quot;(y,z) ∈ crt2 r&amp;quot; and &lt;br /&gt;
         H4: &amp;quot;(y,z) ∈ r*&amp;quot;&lt;br /&gt;
  show &amp;quot;(x,z) ∈ r*&amp;quot; using H2 H4 by (rule crt_trans)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* está contenida en (crt2 r).&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  apply (induction rule: crt.induct)&lt;br /&gt;
     (* 1. ⋀x. (x, x) ∈ crt2 r&lt;br /&gt;
        2. ⋀x y z. ⟦(x, y) ∈ r; (y, z) ∈ r*; (y, z) ∈ crt2 r⟧&lt;br /&gt;
                   ⟹ (x, z) ∈ crt2 r *)&lt;br /&gt;
   apply (rule crt2.intros(2))&lt;br /&gt;
     (* ⋀x y z. ⟦(x, y) ∈ r; (y, z) ∈ r*; (y, z) ∈ crt2 r⟧&lt;br /&gt;
                ⟹ (x, z) ∈ crt2 r *)&lt;br /&gt;
  apply (drule crt2.intros(1))&lt;br /&gt;
     (* ⋀x y z. ⟦(y, z) ∈ r*; (y, z) ∈ crt2 r; (x, y) ∈ crt2 r⟧&lt;br /&gt;
                ⟹ (x, z) ∈ crt2 r *)&lt;br /&gt;
  apply (drule_tac x=x and z=z in crt2.intros(3))&lt;br /&gt;
     (* 1. ⋀x y z. ⟦(y, z) ∈ r*; (y, z) ∈ crt2 r⟧&lt;br /&gt;
                   ⟹ (y, z) ∈ crt2 r&lt;br /&gt;
        2. ⋀x y z. ⟦(y, z) ∈ r*; (y, z) ∈ crt2 r; (x, z) ∈ crt2 r⟧&lt;br /&gt;
                   ⟹ (x, z) ∈ crt2 r *)&lt;br /&gt;
   apply assumption+&lt;br /&gt;
     (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  by (induction rule: crt.induct)&lt;br /&gt;
     (auto intro: crt2.intros)&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
proof (induction rule:crt.induct)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;(x,x) ∈ crt2 r&amp;quot; by (rule crt2.intros(2))&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume H1: &amp;quot;(x,y) ∈ r&amp;quot; and &lt;br /&gt;
         H2: &amp;quot;(y,z) ∈ r*&amp;quot; and &lt;br /&gt;
         H3: &amp;quot;(y,z) ∈ crt2 r&amp;quot;&lt;br /&gt;
  have &amp;quot;(x,y) ∈ crt2 r&amp;quot; using H1 by (rule crt2.intros(1))&lt;br /&gt;
  then show &amp;quot;(x,z) ∈ crt2 r&amp;quot; using H3 by (rule crt2.intros(3))&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar que si (x,y) ∈ r* e (y,z) ∈ r, entonces &lt;br /&gt;
  (x,z) ∈ r*&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  apply (induction rule: crt.induct)&lt;br /&gt;
     (* 1. ⋀x. (x, z) ∈ r ⟶ (x, z) ∈ r*&lt;br /&gt;
        2. ⋀x y za. ⟦(x, y) ∈ r; &lt;br /&gt;
                     (y, za) ∈ r*; &lt;br /&gt;
                     (za, z) ∈ r ⟶ (y, z) ∈ r*⟧&lt;br /&gt;
                    ⟹ (za, z) ∈ r ⟶ (x, z) ∈ r* *)&lt;br /&gt;
   apply (simp add: r_contenida_clausura)&lt;br /&gt;
     (* ⋀x y za. ⟦(x, y) ∈ r; &lt;br /&gt;
                  (y, za) ∈ r*; &lt;br /&gt;
                  (za, z) ∈ r ⟶ (y, z) ∈ r*⟧&lt;br /&gt;
                 ⟹ (za, z) ∈ r ⟶ (x, z) ∈ r* *)&lt;br /&gt;
  apply (simp add: crt_paso)&lt;br /&gt;
     (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  by (induction rule: crt.induct)&lt;br /&gt;
     (auto simp add: r_contenida_clausura&lt;br /&gt;
                     crt_paso)&lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma crt_paso2 [rule_format]: &lt;br /&gt;
  &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
proof (induction rule: crt.induct)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;(x,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot; by (simp add: r_contenida_clausura)&lt;br /&gt;
next&lt;br /&gt;
  fix x y u&lt;br /&gt;
  assume H1: &amp;quot;(x,y) ∈ r&amp;quot; and &lt;br /&gt;
         H2: &amp;quot;(y,u) ∈ r*&amp;quot; and &lt;br /&gt;
         H3: &amp;quot;(u,z) ∈ r ⟶ (y,z) ∈ r*&amp;quot;&lt;br /&gt;
  show &amp;quot;(u,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;(u,z) ∈ r&amp;quot;&lt;br /&gt;
    with H3 have &amp;quot;(y,z) ∈ r*&amp;quot; ..&lt;br /&gt;
    with H1 show &amp;quot;(x,z) ∈ r*&amp;quot; by (rule crt_paso)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Considerar la siguiente definición de la clausura tran-&lt;br /&gt;
  sitiva de una relación r, y probar que es la menor relación reflexiva &lt;br /&gt;
  y transitiva que contiene a r.&lt;br /&gt;
&lt;br /&gt;
  Nota: Establecer los lemas necesarios.&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
inductive star&amp;#039; :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot; for r where&lt;br /&gt;
  refl&amp;#039;: &amp;quot;star&amp;#039; r x x&amp;quot; &lt;br /&gt;
| step&amp;#039;: &amp;quot;star&amp;#039; r x y ⟹ r y z ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Demostración de que (star&amp;#039; r) es reflexiva *)&lt;br /&gt;
lemma star&amp;#039;Refl: &amp;quot;star&amp;#039; r x x&amp;quot;&lt;br /&gt;
  by (simp add: refl&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  apply (rule_tac y=x in step&amp;#039;)&lt;br /&gt;
     (* 1. r x y ⟹ star&amp;#039; r x x&lt;br /&gt;
        2. r x y ⟹ r x y *)&lt;br /&gt;
   apply (rule refl&amp;#039;)&lt;br /&gt;
     (* r x y ⟹ r x y *)&lt;br /&gt;
  apply assumption&lt;br /&gt;
     (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  by (meson refl&amp;#039; step&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
lemma rsubsetStar&amp;#039;_b: &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
by (simp add:step&amp;#039;[OF refl&amp;#039;[of r x]])&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
(* Demostración declarativa de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma rsubsetStar&amp;#039;: &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  assume 1:&amp;quot;r x y&amp;quot;&lt;br /&gt;
  have 2: &amp;quot;star&amp;#039; r x x&amp;quot; by (simp add: refl&amp;#039;)&lt;br /&gt;
  show &amp;quot;star&amp;#039; r x y&amp;quot; using 2 1 by (simp add: step&amp;#039;)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* A continuación se prueba una vondición suficiente para star&amp;#039; r *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r y z; r x y⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  apply (induct rule: star&amp;#039;.induct)&lt;br /&gt;
    (* 1. ⋀xa. r x xa ⟹ star&amp;#039; r x xa&lt;br /&gt;
       2. ⋀xa y z. ⟦star&amp;#039; r xa y; r x xa ⟹ star&amp;#039; r x y; r y z; r x xa⟧&lt;br /&gt;
                   ⟹ star&amp;#039; r x z *)&lt;br /&gt;
  apply (simp add: rsubsetStar&amp;#039;)&lt;br /&gt;
    (* ⋀xa y z. ⟦star&amp;#039; r xa y; r x xa ⟹ star&amp;#039; r x y; r y z; r x xa⟧&lt;br /&gt;
                ⟹ star&amp;#039; r x z *)&lt;br /&gt;
  apply (simp add: step&amp;#039;)&lt;br /&gt;
    (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma star&amp;#039;_subset_star&amp;#039;_l1:&lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r y z; r x y⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  by (induct rule: star&amp;#039;.induct)&lt;br /&gt;
     (auto simp add: rsubsetStar&amp;#039; step&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
(* Demostraciones de que  (star&amp;#039; r) es transitiva *)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;⟦star&amp;#039; r x y; star&amp;#039; r y z⟧ ⟹ star&amp;#039; r x z&amp;quot;   &lt;br /&gt;
  apply  (induction rule: star&amp;#039;.induct)&lt;br /&gt;
     (* 1. ⋀x. star&amp;#039; r x z ⟹ star&amp;#039; r x z&lt;br /&gt;
        2. ⋀x y za. ⟦star&amp;#039; r x y; star&amp;#039; r y z ⟹ star&amp;#039; r x z; r y za;&lt;br /&gt;
                     star&amp;#039; r za z⟧&lt;br /&gt;
                    ⟹ star&amp;#039; r x z *)&lt;br /&gt;
   apply simp&lt;br /&gt;
     (* ⋀x y za. ⟦star&amp;#039; r x y; star&amp;#039; r y z ⟹ star&amp;#039; r x z; r y za;&lt;br /&gt;
                     star&amp;#039; r za z⟧&lt;br /&gt;
                    ⟹ star&amp;#039; r x z *)&lt;br /&gt;
  apply (simp add: star&amp;#039;_subset_star&amp;#039;_l1)&lt;br /&gt;
     (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma star&amp;#039;Trans: &lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r x y; star&amp;#039; r y z⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  by (induction rule: star&amp;#039;.induct) &lt;br /&gt;
      (auto simp add: star&amp;#039;_subset_star&amp;#039;_l1)&lt;br /&gt;
   &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Considerar la siguiente definición inductiva. Probar que &lt;br /&gt;
  &amp;quot;star&amp;#039; r x y syss (∃n. iter r n x y)&amp;quot;&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
inductive iter :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ nat ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;&lt;br /&gt;
for r where&lt;br /&gt;
  iterRefl: &amp;quot;iter r 0 x x&amp;quot;&lt;br /&gt;
| iterStep: &amp;quot;⟦iter r n x y; r y z⟧ ⟹ iter r (n+1) x z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* El esquema de inducción correspondiente es *)&lt;br /&gt;
thm iter.induct&lt;br /&gt;
(*&lt;br /&gt;
  ⟦iter ?r ?x1.0 ?x2.0 ?x3.0; &lt;br /&gt;
   ⋀x. ?P 0 x x;&lt;br /&gt;
   ⋀n x y z. ⟦iter ?r n x y; ?P n x y; ?r y z⟧ ⟹ ?P (n + 1) x z⟧&lt;br /&gt;
  ⟹ ?P ?x1.0 ?x2.0 ?x3.0&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(* Algunos teoremas derivados son *)&lt;br /&gt;
&lt;br /&gt;
thm iterRefl&lt;br /&gt;
(* iter ?r 0 ?x ?x *)&lt;br /&gt;
&lt;br /&gt;
thm iterRefl [of r y]&lt;br /&gt;
(* iter r 0 y y *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep&lt;br /&gt;
(* ⟦iter ?r ?n ?x ?y; ?r ?y ?z⟧ ⟹ iter ?r (?n + 1) ?x ?z *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep [of r x y n z]&lt;br /&gt;
(* ⟦iter r x y n; r n z⟧ ⟹ iter r (x + 1) y z *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep [of r x y 0 y]&lt;br /&gt;
(* ⟦iter r x y 0; r 0 y⟧ ⟹ iter r (x + 1) y y *)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Demostrar  &lt;br /&gt;
     star&amp;#039; r x y ⟹ (∃n. iter r n x y)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;&lt;br /&gt;
  apply (induct rule: star&amp;#039;.induct)&lt;br /&gt;
     (* 1. ⋀x. ∃n. iter r n x x&lt;br /&gt;
        2. ⋀x y z. ⟦star&amp;#039; r x y; ∃n. iter r n x y; r y z⟧&lt;br /&gt;
                   ⟹ ∃n. iter r n x z *)&lt;br /&gt;
   apply (rule_tac x=0 in exI)&lt;br /&gt;
     (* 1. ⋀x. iter r 0 x x&lt;br /&gt;
        2. ⋀x y z. ⟦star&amp;#039; r x y; ∃n. iter r n x y; r y z⟧&lt;br /&gt;
                   ⟹ ∃n. iter r n x z *)&lt;br /&gt;
   apply (rule iterRefl)&lt;br /&gt;
     (* ⋀x y z. ⟦star&amp;#039; r x y; ∃n. iter r n x y; r y z⟧&lt;br /&gt;
                ⟹ ∃n. iter r n x z *)&lt;br /&gt;
  apply (erule exE)&lt;br /&gt;
     (* ⋀x y z n. ⟦star&amp;#039; r x y; r y z; iter r n x y⟧&lt;br /&gt;
                  ⟹ ∃n. iter r n x z *)&lt;br /&gt;
  apply (rule_tac x=&amp;quot;n+1&amp;quot; in exI)&lt;br /&gt;
     (* ⋀x y z n. ⟦star&amp;#039; r x y; r y z; iter r n x y⟧&lt;br /&gt;
                  ⟹ iter r (n + 1) x z *)&lt;br /&gt;
  apply (erule iterStep)&lt;br /&gt;
     (*  ⋀x y z n. ⟦star&amp;#039; r x y; r y z⟧ ⟹ r y z *)&lt;br /&gt;
  apply assumption&lt;br /&gt;
     (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma [rule_format]: &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;    &lt;br /&gt;
  by (induct rule: star&amp;#039;.induct)&lt;br /&gt;
     (auto intro: iterRefl iterStep)&lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma [rule_format]: &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;    &lt;br /&gt;
proof (induct rule: star&amp;#039;.induct)&lt;br /&gt;
  fix x &lt;br /&gt;
  have &amp;quot;iter r 0 x x&amp;quot; by (rule iterRefl)&lt;br /&gt;
  then show &amp;quot;∃n. iter r n x x&amp;quot; ..&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume 1: &amp;quot;star&amp;#039; r x y&amp;quot; and&lt;br /&gt;
         2: &amp;quot;∃n. iter r n x y&amp;quot; and&lt;br /&gt;
         3: &amp;quot;r y z&amp;quot;&lt;br /&gt;
  from 2 obtain m where  &amp;quot;iter r m x y&amp;quot; ..      &lt;br /&gt;
  then have  &amp;quot;iter r (m+1) x z&amp;quot; using 3 by (rule iterStep)&lt;br /&gt;
  then show &amp;quot;∃n. iter r n x z&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
  &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Demostrar  &lt;br /&gt;
     (∃n. iter r n x y) ⟹ star&amp;#039; r x y&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* En la demostración se usará el siguiente lema:&lt;br /&gt;
      iter r n x y ⟹ star&amp;#039; r x y *)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa del lema *) &lt;br /&gt;
lemma iter_star&amp;#039;_subset: &amp;quot;iter r n x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  apply (induct rule: iter.induct)&lt;br /&gt;
     (* 1. ⋀x. star&amp;#039; r x x&lt;br /&gt;
        2. ⋀n x y z. ⟦iter r n x y; star&amp;#039; r x y; r y z⟧&lt;br /&gt;
                     ⟹ star&amp;#039; r x z *)&lt;br /&gt;
   apply (rule refl&amp;#039;)&lt;br /&gt;
     (* ⋀n x y z. ⟦iter r n x y; star&amp;#039; r x y; r y z⟧&lt;br /&gt;
                  ⟹ star&amp;#039; r x z *)&lt;br /&gt;
  apply (erule step&amp;#039;)&lt;br /&gt;
     (* ⋀n x y z. ⟦iter r n x y; r y z⟧ ⟹ r y z*)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática del lema *) &lt;br /&gt;
lemma &amp;quot;iter r n x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  by (induct rule: iter.induct)&lt;br /&gt;
     (auto simp add: refl&amp;#039; step&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(∃n. iter r n x y) ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  apply (erule exE)&lt;br /&gt;
    (* ⋀n. iter r n x y ⟹ star&amp;#039; r x y *)&lt;br /&gt;
  apply (erule iter_star&amp;#039;_subset)&lt;br /&gt;
    (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;(∃n. iter r n x y) ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  by (auto simp add: iter_star&amp;#039;_subset)&lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma assumes &amp;quot;(∃n. iter r n x y)&amp;quot;&lt;br /&gt;
      shows &amp;quot;star&amp;#039; r x y&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have  &amp;quot;∃n. iter r n x y&amp;quot; using assms .&lt;br /&gt;
  then obtain k where &amp;quot;iter r k x y&amp;quot; ..&lt;br /&gt;
  then show &amp;quot;star&amp;#039; r x y&amp;quot; by (rule iter_star&amp;#039;_subset)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_14&amp;diff=805</id>
		<title>Sol 14</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_14&amp;diff=805"/>
		<updated>2019-06-26T16:02:01Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
theory R14_sol&lt;br /&gt;
imports Main&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Hilbert publicó una axiomatización de la geometría que incluía los siguientes &lt;br /&gt;
  axiomas:&lt;br /&gt;
  1. Por dos puntos distintos pasa una línea recta.&lt;br /&gt;
  2. Por dos puntos distintos no pasa más de una línea recta.&lt;br /&gt;
  3. Toda línea tiene al menos dos puntos.&lt;br /&gt;
  4. Existen al menos tres puntos no alineados.&lt;br /&gt;
&lt;br /&gt;
  Usando la relacion en(p,l) para representar que el punto p está en la línea l, definir el entorno &lt;br /&gt;
  local Geom en el que se verifiquen los 4 axiomas anteriores.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
locale Geom =&lt;br /&gt;
  fixes en :: &amp;quot;&amp;#039;p ⇒ &amp;#039;l ⇒ bool&amp;quot;&lt;br /&gt;
  assumes linea_por_dos_puntos:       &amp;quot;a ≠ b ⟹ ∃l. en a l ∧ en b l&amp;quot; &lt;br /&gt;
      and linea_por_dos_puntos_unica: &amp;quot;⟦a ≠ b; en a l; en b l; en a m; en b m⟧ ⟹ l = m&amp;quot;&lt;br /&gt;
      and dos_puntos_de_la_linea:     &amp;quot;∃a b. a ≠ b ∧ en a l ∧ en b l&amp;quot;&lt;br /&gt;
      and tres_puntos_no_alineados:   &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ &lt;br /&gt;
                                               ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Demostrar que&lt;br /&gt;
    ∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot;&lt;br /&gt;
  using tres_puntos_no_alineados by auto&lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada *)&lt;br /&gt;
lemma tres_puntos_no_alineados_alt:&lt;br /&gt;
  &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain a b c where distintos: &amp;quot;a ≠ b ∧ a ≠ c ∧ b ≠ c&amp;quot; &lt;br /&gt;
                                &amp;quot;¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    using tres_puntos_no_alineados by blast&lt;br /&gt;
  then have &amp;quot;∀l. en a l ∧ en b l ⟶ ¬ en c l&amp;quot;&lt;br /&gt;
    by blast&lt;br /&gt;
  then show ?thesis using distintos by blast&lt;br /&gt;
qed        &lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. Demostrar que no todos los puntos pertenecen a la misma línea.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;∀l. ∃x. ¬ en x l&amp;quot;&lt;br /&gt;
  using tres_puntos_no_alineados_alt by auto&lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada sin auto *)&lt;br /&gt;
lemma punto_no_en_linea: &amp;quot;∀l. ∃x. ¬ en x l&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
   fix l&lt;br /&gt;
   obtain a b c where l3: &amp;quot;¬ (en a l ∧ en b l ∧ en c l)&amp;quot; using tres_puntos_no_alineados by blast &lt;br /&gt;
   then show &amp;quot;∃x. ¬ en x l&amp;quot; by blast &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 4. Demostrar que por cada punto pasa más de una línea.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;∃l m. en x l ∧ en x m ∧ l ≠ m&amp;quot;&lt;br /&gt;
  by (metis linea_por_dos_puntos tres_puntos_no_alineados_alt)&lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada *)&lt;br /&gt;
lemma dos_lineas_por_punto: &amp;quot;∃l m. en x l ∧ en x m ∧ l ≠ m&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain z where &amp;quot;z ≠ x&amp;quot; using dos_puntos_de_la_linea by metis&lt;br /&gt;
  then obtain l where xl: &amp;quot;en x l&amp;quot; and zl: &amp;quot;en z l&amp;quot; using linea_por_dos_puntos by blast &lt;br /&gt;
  obtain w where n_wl: &amp;quot;¬ en w l&amp;quot; using punto_no_en_linea by blast&lt;br /&gt;
  obtain m where wm: &amp;quot;en x m&amp;quot; and zm: &amp;quot;en w m&amp;quot; using linea_por_dos_puntos xl by metis&lt;br /&gt;
  then have &amp;quot;l ≠ m&amp;quot; using n_wl by blast  &lt;br /&gt;
  then show ?thesis using wm xl by blast &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 5. Demostrar que dos líneas distintas no pueden tener más de un punto común.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma  &lt;br /&gt;
   assumes &amp;quot;l ≠ m&amp;quot; &lt;br /&gt;
           &amp;quot;en x l&amp;quot; &lt;br /&gt;
           &amp;quot;en x m&amp;quot; &lt;br /&gt;
           &amp;quot;en y l&amp;quot; &lt;br /&gt;
           &amp;quot;en y m&amp;quot; &lt;br /&gt;
   shows &amp;quot;x = y&amp;quot;&lt;br /&gt;
  using assms linea_por_dos_puntos_unica by blast&lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada *)&lt;br /&gt;
lemma interseccion_lineas_distintas: &lt;br /&gt;
   assumes &amp;quot;l ≠ m&amp;quot; &lt;br /&gt;
           &amp;quot;en x l&amp;quot; &lt;br /&gt;
           &amp;quot;en x m&amp;quot; &lt;br /&gt;
           &amp;quot;en y l&amp;quot; &lt;br /&gt;
           &amp;quot;en y m&amp;quot; &lt;br /&gt;
   shows &amp;quot;x = y&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
   assume &amp;quot;x ≠ y&amp;quot; &lt;br /&gt;
   then have &amp;quot;l = m&amp;quot; using linea_por_dos_puntos_unica assms(2-5) by simp&lt;br /&gt;
   then show &amp;quot;False&amp;quot; using assms(1) by simp&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 6. Extender el ámbito (&amp;quot;locale&amp;quot;) Geom definiendo la relación colineal tal que&lt;br /&gt;
  (colineal a b c) se verifica si existe una línea recta que pasa por los puntos a, b y c.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition (in Geom) &lt;br /&gt;
  colineal :: &amp;quot;&amp;#039;p ⇒ &amp;#039;p ⇒ &amp;#039;p ⇒ bool&amp;quot; &lt;br /&gt;
  where &amp;quot;colineal a b c ≡ ∃l. en a l ∧ en b l ∧ en c l&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 7. Demostrar que existen tres puntos a, b y c tales que&lt;br /&gt;
     ¬ colineal a b c&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma (in Geom) &amp;quot;∃a b c. ¬ colineal a b c&amp;quot;&lt;br /&gt;
  using colineal_def tres_puntos_no_alineados by blast&lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada *)&lt;br /&gt;
lemma (in Geom) &amp;quot;∃a b c. ¬ colineal a b c&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ &lt;br /&gt;
                ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; by (rule tres_puntos_no_alineados)&lt;br /&gt;
  then have &amp;quot;∃a b c. ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; by blast&lt;br /&gt;
  then show ?thesis by (simp add: colineal_def)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_14&amp;diff=804</id>
		<title>Sol 14</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_14&amp;diff=804"/>
		<updated>2019-06-26T16:01:50Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
theory R14_sol&lt;br /&gt;
imports Main&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Hilbert publicó una axiomatización de la geometría que incluía los siguientes &lt;br /&gt;
  axiomas:&lt;br /&gt;
  1. Por dos puntos distintos pasa una línea recta.&lt;br /&gt;
  2. Por dos puntos distintos no pasa más de una línea recta.&lt;br /&gt;
  3. Toda línea tiene al menos dos puntos.&lt;br /&gt;
  4. Existen al menos tres puntos no alineados.&lt;br /&gt;
&lt;br /&gt;
  Usando la relacion en(p,l) para representar que el punto p está en la línea l, definir el entorno &lt;br /&gt;
  local Geom en el que se verifiquen los 4 axiomas anteriores.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
locale Geom =&lt;br /&gt;
  fixes en :: &amp;quot;&amp;#039;p ⇒ &amp;#039;l ⇒ bool&amp;quot;&lt;br /&gt;
  assumes linea_por_dos_puntos:       &amp;quot;a ≠ b ⟹ ∃l. en a l ∧ en b l&amp;quot; &lt;br /&gt;
      and linea_por_dos_puntos_unica: &amp;quot;⟦a ≠ b; en a l; en b l; en a m; en b m⟧ ⟹ l = m&amp;quot;&lt;br /&gt;
      and dos_puntos_de_la_linea:     &amp;quot;∃a b. a ≠ b ∧ en a l ∧ en b l&amp;quot;&lt;br /&gt;
      and tres_puntos_no_alineados:   &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ &lt;br /&gt;
                                               ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Demostrar que&lt;br /&gt;
    ∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot;&lt;br /&gt;
  using tres_puntos_no_alineados by auto&lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada *)&lt;br /&gt;
lemma tres_puntos_no_alineados_alt:&lt;br /&gt;
  &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain a b c where distintos: &amp;quot;a ≠ b ∧ a ≠ c ∧ b ≠ c&amp;quot; &lt;br /&gt;
                                &amp;quot;¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    using tres_puntos_no_alineados by blast&lt;br /&gt;
  then have &amp;quot;∀l. en a l ∧ en b l ⟶ ¬ en c l&amp;quot;&lt;br /&gt;
    by blast&lt;br /&gt;
  then show ?thesis using distintos by blast&lt;br /&gt;
qed        &lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. Demostrar que no todos los puntos pertenecen a la misma línea.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;∀l. ∃x. ¬ en x l&amp;quot;&lt;br /&gt;
  using tres_puntos_no_alineados_alt by auto&lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada sin auto *)&lt;br /&gt;
lemma punto_no_en_linea: &amp;quot;∀l. ∃x. ¬ en x l&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
   fix l&lt;br /&gt;
   obtain a b c where l3: &amp;quot;¬ (en a l ∧ en b l ∧ en c l)&amp;quot; using tres_puntos_no_alineados by blast &lt;br /&gt;
   then show &amp;quot;∃x. ¬ en x l&amp;quot; by blast &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 4. Demostrar que por cada punto pasa más de una línea.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;∃l m. en x l ∧ en x m ∧ l ≠ m&amp;quot;&lt;br /&gt;
  by (metis linea_por_dos_puntos tres_puntos_no_alineados_alt)&lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada *)&lt;br /&gt;
lemma dos_lineas_por_punto: &amp;quot;∃l m. en x l ∧ en x m ∧ l ≠ m&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain z where &amp;quot;z ≠ x&amp;quot; using dos_puntos_de_la_linea by metis&lt;br /&gt;
  then obtain l where xl: &amp;quot;en x l&amp;quot; and zl: &amp;quot;en z l&amp;quot; using linea_por_dos_puntos by blast &lt;br /&gt;
  obtain w where n_wl: &amp;quot;¬ en w l&amp;quot; using punto_no_en_linea by blast&lt;br /&gt;
  obtain m where wm: &amp;quot;en x m&amp;quot; and zm: &amp;quot;en w m&amp;quot; using linea_por_dos_puntos xl by metis&lt;br /&gt;
  then have &amp;quot;l ≠ m&amp;quot; using n_wl by blast  &lt;br /&gt;
  then show ?thesis using wm xl by blast &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 5. Demostrar que dos líneas distintas no pueden tener más de un punto común.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma  &lt;br /&gt;
   assumes &amp;quot;l ≠ m&amp;quot; &lt;br /&gt;
           &amp;quot;en x l&amp;quot; &lt;br /&gt;
           &amp;quot;en x m&amp;quot; &lt;br /&gt;
           &amp;quot;en y l&amp;quot; &lt;br /&gt;
           &amp;quot;en y m&amp;quot; &lt;br /&gt;
   shows &amp;quot;x = y&amp;quot;&lt;br /&gt;
  using assms linea_por_dos_puntos_unica by blast&lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada *)&lt;br /&gt;
lemma interseccion_lineas_distintas: &lt;br /&gt;
   assumes &amp;quot;l ≠ m&amp;quot; &lt;br /&gt;
           &amp;quot;en x l&amp;quot; &lt;br /&gt;
           &amp;quot;en x m&amp;quot; &lt;br /&gt;
           &amp;quot;en y l&amp;quot; &lt;br /&gt;
           &amp;quot;en y m&amp;quot; &lt;br /&gt;
   shows &amp;quot;x = y&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
   assume &amp;quot;x ≠ y&amp;quot; &lt;br /&gt;
   then have &amp;quot;l = m&amp;quot; using linea_por_dos_puntos_unica assms(2-5) by simp&lt;br /&gt;
   then show &amp;quot;False&amp;quot; using assms(1) by simp&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 6. Extender el ámbito (&amp;quot;locale&amp;quot;) Geom definiendo la relación colineal tal que&lt;br /&gt;
  (colineal a b c) se verifica si existe una línea recta que pasa por los puntos a, b y c.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition (in Geom) &lt;br /&gt;
  colineal :: &amp;quot;&amp;#039;p ⇒ &amp;#039;p ⇒ &amp;#039;p ⇒ bool&amp;quot; &lt;br /&gt;
  where &amp;quot;colineal a b c ≡ ∃l. en a l ∧ en b l ∧ en c l&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 7. Demostrar que existen tres puntos a, b y c tales que&lt;br /&gt;
     ¬ colineal a b c&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma (in Geom) &amp;quot;∃a b c. ¬ colineal a b c&amp;quot;&lt;br /&gt;
  using colineal_def tres_puntos_no_alineados by blast&lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada *)&lt;br /&gt;
lemma (in Geom) &amp;quot;∃a b c. ¬ colineal a b c&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ &lt;br /&gt;
                ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; by (rule tres_puntos_no_alineados)&lt;br /&gt;
  then have &amp;quot;∃a b c. ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; by blast&lt;br /&gt;
  then show ?thesis by (simp add: colineal_def)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_13&amp;diff=803</id>
		<title>Sol 13</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_13&amp;diff=803"/>
		<updated>2019-06-26T16:00:59Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R13: Definiciones inductivas: clausuras *}&lt;br /&gt;
&lt;br /&gt;
theory R13_sol&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* La clausura reflexiva transitiva *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · Las definiciones inductivas aceptan parámetros; por tanto, permite&lt;br /&gt;
    expresar funciones que construyen conjuntos.&lt;br /&gt;
&lt;br /&gt;
  · La relaciones binarias son conjuntos de pares; por tanto, se pueden&lt;br /&gt;
   definir inductivamente.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · La clausura reflexiva y transitiva de una relación r es la menor&lt;br /&gt;
   relación reflexiva y transitiva que contiene a r. &lt;br /&gt;
&lt;br /&gt;
  · Se representa por r*.&lt;br /&gt;
&lt;br /&gt;
  · Se puede definir inductivamente, como conjunto:&lt;br /&gt;
    · (x,x) ∈ r*&lt;br /&gt;
    · Si (x,y) ∈ r e (y,z) ∈ r*, entonces (x,z) ∈ r*&lt;br /&gt;
&lt;br /&gt;
  · La definición inductiva, como conjunto, se puede expresar en &lt;br /&gt;
   Isabelle/HOL como sigue: &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set&lt;br /&gt;
  crt :: &amp;quot;(&amp;#039;a × &amp;#039;a) set ⇒ (&amp;#039;a × &amp;#039;a) set&amp;quot;   (&amp;quot;_*&amp;quot; [1000] 999)&lt;br /&gt;
  for r :: &amp;quot;(&amp;#039;a × &amp;#039;a) set&amp;quot;&lt;br /&gt;
where&lt;br /&gt;
  crt_refl [iff]: &amp;quot;(x,x) ∈ r*&amp;quot;&lt;br /&gt;
| crt_paso:       &amp;quot;⟦(x,y) ∈ r; (y,z) ∈ r* ⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La sintaxis concreta permite escribir r* en lugar de (crt r).&lt;br /&gt;
  · La definición consta de dos reglas.&lt;br /&gt;
  · A la regla reflexiva se le añade el atributo iff para aumentar la&lt;br /&gt;
    automatización. &lt;br /&gt;
  · A la regla del paso no se le añade ningún atributo, porque r* ocurre&lt;br /&gt;
   en la izquierda. &lt;br /&gt;
  · En el resto de esta sección se demuestra que esta definición&lt;br /&gt;
   coincide con la menor relación reflexiva y transitiva que contiene a&lt;br /&gt;
   r.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* es reflexiva.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x,x) ∈ r*&amp;quot;&lt;br /&gt;
  by (rule crt_refl)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* contiene a r.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;  &lt;br /&gt;
  apply (erule crt_paso)&lt;br /&gt;
    (* (y, y) ∈ r**)&lt;br /&gt;
  apply (rule crt_refl)&lt;br /&gt;
    (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma r_contenida_clausura [intro]: &lt;br /&gt;
  &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  by (simp add: crt_paso) &lt;br /&gt;
(* by (auto intro: crt_paso) *)&lt;br /&gt;
    &lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;  &lt;br /&gt;
proof -&lt;br /&gt;
  assume 1: &amp;quot;(x, y) ∈ r&amp;quot;&lt;br /&gt;
  have  2: &amp;quot;(y, y) ∈ r*&amp;quot; by simp&lt;br /&gt;
  show &amp;quot;(x,y) ∈ r*&amp;quot; using 1 2 by (rule crt_paso)&lt;br /&gt;
  qed&lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La ventaja del lema es que se puede declarar como regla de&lt;br /&gt;
    introducción, porque r* ocurre sólo en la derecha.&lt;br /&gt;
  · Con la declaración, algunas demostraciones que usan crt_paso se&lt;br /&gt;
    hacen de manera automática.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El esquema de inducción de la clausura reflexiva transitiva es&lt;br /&gt;
  · crt.induct:&lt;br /&gt;
    ⟦(x1, x2) ∈ r*; &lt;br /&gt;
     ⋀x. P x x; &lt;br /&gt;
     ⋀x y z. ⟦(x,y) ∈ r; (y,z) ∈ r*; P y z⟧ ⟹ P x z⟧&lt;br /&gt;
    ⟹ P x1 x2&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* es transitiva.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;⟦(x,y) ∈ r*; (y,z) ∈ r*⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  apply (induction rule:crt.induct)&lt;br /&gt;
    (* 1. ⋀x. (x, z) ∈ r* ⟹ (x, z) ∈ r*&lt;br /&gt;
       2. ⋀x y za. ⟦(x, y) ∈ r; (y, za) ∈ r*;&lt;br /&gt;
                    (za, z) ∈ r* ⟹ (y, z) ∈ r*;&lt;br /&gt;
                    (za, z) ∈ r*⟧&lt;br /&gt;
                   ⟹ (x, z) ∈ r* *)&lt;br /&gt;
  apply simp&lt;br /&gt;
    (* 1. ⋀x y za. ⟦(x, y) ∈ r; (y, za) ∈ r*;&lt;br /&gt;
                    (za, z) ∈ r* ⟹ (y, z) ∈ r*;&lt;br /&gt;
                    (za, z) ∈ r*⟧&lt;br /&gt;
                   ⟹ (x, z) ∈ r**)&lt;br /&gt;
  apply (simp add: crt_paso)&lt;br /&gt;
    (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;⟦ (x,y) ∈ r*; (y,z) ∈ r* ⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  by (induction rule: crt.induct)&lt;br /&gt;
     (simp_all add: crt_paso)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Otra formulación del lema, con la variable y a la derecha.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  apply (induction rule: crt.induct)&lt;br /&gt;
     (* 1. ⋀x. (x, z) ∈ r* ⟶ (x, z) ∈ r*&lt;br /&gt;
        2. ⋀x y za. ⟦(x, y) ∈ r; &lt;br /&gt;
                     (y, za) ∈ r*;&lt;br /&gt;
                     (za, z) ∈ r* ⟶ (y, z) ∈ r*⟧&lt;br /&gt;
                    ⟹ (za, z) ∈ r* ⟶ (x, z) ∈ r* *)&lt;br /&gt;
   apply simp&lt;br /&gt;
     (* ⋀x y za. ⟦(x, y) ∈ r; &lt;br /&gt;
                  (y, za) ∈ r*;&lt;br /&gt;
                  (za, z) ∈ r* ⟶ (y, z) ∈ r*⟧&lt;br /&gt;
                 ⟹ (za, z) ∈ r* ⟶ (x, z) ∈ r* *)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
     (* ⋀x y za. ⟦(x, y) ∈ r; &lt;br /&gt;
                  (y, za) ∈ r*;&lt;br /&gt;
                  (za, z) ∈ r* ⟶ (y, z) ∈ r*;&lt;br /&gt;
                  (za, z) ∈ r*⟧&lt;br /&gt;
                 ⟹ (za, z) ∈ r* ⟶ (x, z) ∈ r* *)&lt;br /&gt;
  apply (drule mp)&lt;br /&gt;
     (* 1. ⋀x y za. ⟦(x, y) ∈ r; (y, za) ∈ r*; (za, z) ∈ r*⟧&lt;br /&gt;
                    ⟹ (za, z) ∈ r*&lt;br /&gt;
        2. ⋀x y za. ⟦(x, y) ∈ r; &lt;br /&gt;
                     (y, za) ∈ r*; &lt;br /&gt;
                     (za, z) ∈ r*;&lt;br /&gt;
                     (y, z) ∈ r*⟧&lt;br /&gt;
                    ⟹ (x, z) ∈ r* *)&lt;br /&gt;
   apply assumption&lt;br /&gt;
     (* ⋀x y za. ⟦(x, y) ∈ r; &lt;br /&gt;
                  (y, za) ∈ r*; &lt;br /&gt;
                  (za, z) ∈ r*;&lt;br /&gt;
                  (y, z) ∈ r*⟧&lt;br /&gt;
                 ⟹ (x, z) ∈ r* *)&lt;br /&gt;
  apply (erule crt_paso)&lt;br /&gt;
     (* ⋀x y za. ⟦(y, za) ∈ r*; (za, z) ∈ r*; (y, z) ∈ r*⟧&lt;br /&gt;
                 ⟹ (y, z) ∈ r**)&lt;br /&gt;
  apply assumption&lt;br /&gt;
     (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  by (induction rule:crt.induct)&lt;br /&gt;
     (auto simp add: crt_paso)&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma crt_trans [rule_format]:&lt;br /&gt;
  &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
proof (induction rule:crt.induct)&lt;br /&gt;
  show &amp;quot;⋀x. (x,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y u&lt;br /&gt;
  assume H1: &amp;quot;(x,y) ∈ r&amp;quot; and&lt;br /&gt;
         H2: &amp;quot;(y,u) ∈ r*&amp;quot; and&lt;br /&gt;
         H3: &amp;quot;(u,z) ∈ r* ⟶ (y,z) ∈ r*&amp;quot;&lt;br /&gt;
  show &amp;quot;(u,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;(u,z) ∈ r*&amp;quot;&lt;br /&gt;
    with H3 have &amp;quot;(y,z) ∈ r*&amp;quot; ..&lt;br /&gt;
    with H1 show &amp;quot;(x,z) ∈ r*&amp;quot; by (rule crt_paso) &lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La reformulación anterior es un caso particular de la siguiente&lt;br /&gt;
    heurística:&lt;br /&gt;
       &amp;quot;Para probar una fórmula por inducción sobre (x1,...,xn) ∈ R,&lt;br /&gt;
       poner todas las premisas conteniendo cualquiera de lax xi en la&lt;br /&gt;
       conclusión usando ⟶&amp;quot;. &lt;br /&gt;
  · El atributo &amp;quot;rule_format&amp;quot; transforma ⟶ en ⟹.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La relación r* está contenida en cualquier relación reflexiva y &lt;br /&gt;
  transitiva que contenga a r.&lt;br /&gt;
&lt;br /&gt;
  Mediante (crt2 r) se define la menor relación reflexiva y transitiva &lt;br /&gt;
  que contiene a r.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set&lt;br /&gt;
  crt2 :: &amp;quot;(&amp;#039;a × &amp;#039;a)set ⇒ (&amp;#039;a × &amp;#039;a)set&amp;quot;&lt;br /&gt;
  for r :: &amp;quot;(&amp;#039;a × &amp;#039;a)set&amp;quot;&lt;br /&gt;
where&lt;br /&gt;
  &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ crt2 r&amp;quot;                      (* contiene a r *) &lt;br /&gt;
| &amp;quot;(x,x) ∈ crt2 r&amp;quot;                                      (* reflexiva *)&lt;br /&gt;
| &amp;quot;⟦(x,y) ∈ crt2 r; (y,z) ∈ crt2 r⟧ ⟹ (x,z) ∈ crt2 r&amp;quot; (* transitiva *)&lt;br /&gt;
&lt;br /&gt;
text {* Probaremos que r* coincide con (crt2 r) *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación (crt2 r) está contenida en r*.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  apply (induction rule: crt2.induct)&lt;br /&gt;
      (*  1. ⋀x y. (x, y) ∈ r ⟹ (x, y) ∈ r*&lt;br /&gt;
          2. ⋀x. (x, x) ∈ r*&lt;br /&gt;
          3. ⋀x y z. ⟦(x, y) ∈ crt2 r; (x, y) ∈ r*;&lt;br /&gt;
                      (y, z) ∈ crt2 r; (y, z) ∈ r*⟧&lt;br /&gt;
                     ⟹ (x, z) ∈ r* *)&lt;br /&gt;
    apply (erule r_contenida_clausura)&lt;br /&gt;
      (* 1. ⋀x. (x, x) ∈ r*&lt;br /&gt;
         2. ⋀x y z. ⟦(x, y) ∈ crt2 r; (x, y) ∈ r*;&lt;br /&gt;
                     (y, z) ∈ crt2 r; (y, z) ∈ r*⟧&lt;br /&gt;
                    ⟹ (x, z) ∈ r* *)&lt;br /&gt;
   apply simp&lt;br /&gt;
      (* ⋀x y z. ⟦(x, y) ∈ crt2 r; (x, y) ∈ r*;&lt;br /&gt;
                  (y, z) ∈ crt2 r; (y, z) ∈ r*⟧&lt;br /&gt;
                 ⟹ (x, z) ∈ r* *)&lt;br /&gt;
  apply (erule crt_trans)&lt;br /&gt;
      (* ⋀x y z. ⟦(x, y) ∈ crt2 r; (y, z) ∈ crt2 r; (y, z) ∈ r*⟧&lt;br /&gt;
                 ⟹ (y, z) ∈ r* *)&lt;br /&gt;
  apply assumption&lt;br /&gt;
      (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  by (induction rule: crt2.induct)&lt;br /&gt;
     (auto simp add: r_contenida_clausura &lt;br /&gt;
                     crt_trans)&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
proof (induction rule: crt2.induct)&lt;br /&gt;
  fix x y&lt;br /&gt;
  assume &amp;quot;(x,y) ∈ r&amp;quot;&lt;br /&gt;
  then show &amp;quot;(x,y) ∈ r*&amp;quot; by (rule r_contenida_clausura) (* blast*)&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;(x,x) ∈ r*&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume H1: &amp;quot;(x,y) ∈ crt2 r&amp;quot; and&lt;br /&gt;
         H2: &amp;quot;(x,y) ∈ r*&amp;quot;     and&lt;br /&gt;
         H3: &amp;quot;(y,z) ∈ crt2 r&amp;quot; and &lt;br /&gt;
         H4: &amp;quot;(y,z) ∈ r*&amp;quot;&lt;br /&gt;
  show &amp;quot;(x,z) ∈ r*&amp;quot; using H2 H4 by (rule crt_trans)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* está contenida en (crt2 r).&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  apply (induction rule: crt.induct)&lt;br /&gt;
     (* 1. ⋀x. (x, x) ∈ crt2 r&lt;br /&gt;
        2. ⋀x y z. ⟦(x, y) ∈ r; (y, z) ∈ r*; (y, z) ∈ crt2 r⟧&lt;br /&gt;
                   ⟹ (x, z) ∈ crt2 r *)&lt;br /&gt;
   apply (rule crt2.intros(2))&lt;br /&gt;
     (* ⋀x y z. ⟦(x, y) ∈ r; (y, z) ∈ r*; (y, z) ∈ crt2 r⟧&lt;br /&gt;
                ⟹ (x, z) ∈ crt2 r *)&lt;br /&gt;
  apply (drule crt2.intros(1))&lt;br /&gt;
     (* ⋀x y z. ⟦(y, z) ∈ r*; (y, z) ∈ crt2 r; (x, y) ∈ crt2 r⟧&lt;br /&gt;
                ⟹ (x, z) ∈ crt2 r *)&lt;br /&gt;
  apply (drule_tac x=x and z=z in crt2.intros(3))&lt;br /&gt;
     (* 1. ⋀x y z. ⟦(y, z) ∈ r*; (y, z) ∈ crt2 r⟧&lt;br /&gt;
                   ⟹ (y, z) ∈ crt2 r&lt;br /&gt;
        2. ⋀x y z. ⟦(y, z) ∈ r*; (y, z) ∈ crt2 r; (x, z) ∈ crt2 r⟧&lt;br /&gt;
                   ⟹ (x, z) ∈ crt2 r *)&lt;br /&gt;
   apply assumption+&lt;br /&gt;
     (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  by (induction rule: crt.induct)&lt;br /&gt;
     (auto intro: crt2.intros)&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
proof (induction rule:crt.induct)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;(x,x) ∈ crt2 r&amp;quot; by (rule crt2.intros(2))&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume H1: &amp;quot;(x,y) ∈ r&amp;quot; and &lt;br /&gt;
         H2: &amp;quot;(y,z) ∈ r*&amp;quot; and &lt;br /&gt;
         H3: &amp;quot;(y,z) ∈ crt2 r&amp;quot;&lt;br /&gt;
  have &amp;quot;(x,y) ∈ crt2 r&amp;quot; using H1 by (rule crt2.intros(1))&lt;br /&gt;
  then show &amp;quot;(x,z) ∈ crt2 r&amp;quot; using H3 by (rule crt2.intros(3))&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar que si (x,y) ∈ r* e (y,z) ∈ r, entonces &lt;br /&gt;
  (x,z) ∈ r*&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  apply (induction rule: crt.induct)&lt;br /&gt;
     (* 1. ⋀x. (x, z) ∈ r ⟶ (x, z) ∈ r*&lt;br /&gt;
        2. ⋀x y za. ⟦(x, y) ∈ r; &lt;br /&gt;
                     (y, za) ∈ r*; &lt;br /&gt;
                     (za, z) ∈ r ⟶ (y, z) ∈ r*⟧&lt;br /&gt;
                    ⟹ (za, z) ∈ r ⟶ (x, z) ∈ r* *)&lt;br /&gt;
   apply (simp add: r_contenida_clausura)&lt;br /&gt;
     (* ⋀x y za. ⟦(x, y) ∈ r; &lt;br /&gt;
                  (y, za) ∈ r*; &lt;br /&gt;
                  (za, z) ∈ r ⟶ (y, z) ∈ r*⟧&lt;br /&gt;
                 ⟹ (za, z) ∈ r ⟶ (x, z) ∈ r* *)&lt;br /&gt;
  apply (simp add: crt_paso)&lt;br /&gt;
     (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  by (induction rule: crt.induct)&lt;br /&gt;
     (auto simp add: r_contenida_clausura&lt;br /&gt;
                     crt_paso)&lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma crt_paso2 [rule_format]: &lt;br /&gt;
  &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
proof (induction rule: crt.induct)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;(x,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot; by (simp add: r_contenida_clausura)&lt;br /&gt;
next&lt;br /&gt;
  fix x y u&lt;br /&gt;
  assume H1: &amp;quot;(x,y) ∈ r&amp;quot; and &lt;br /&gt;
         H2: &amp;quot;(y,u) ∈ r*&amp;quot; and &lt;br /&gt;
         H3: &amp;quot;(u,z) ∈ r ⟶ (y,z) ∈ r*&amp;quot;&lt;br /&gt;
  show &amp;quot;(u,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;(u,z) ∈ r&amp;quot;&lt;br /&gt;
    with H3 have &amp;quot;(y,z) ∈ r*&amp;quot; ..&lt;br /&gt;
    with H1 show &amp;quot;(x,z) ∈ r*&amp;quot; by (rule crt_paso)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Considerar la siguiente definición de la clausura tran-&lt;br /&gt;
  sitiva de una relación r, y probar que es la menor relación reflexiva &lt;br /&gt;
  y transitiva que contiene a r.&lt;br /&gt;
&lt;br /&gt;
  Nota: Establecer los lemas necesarios.&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
inductive star&amp;#039; :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot; for r where&lt;br /&gt;
  refl&amp;#039;: &amp;quot;star&amp;#039; r x x&amp;quot; &lt;br /&gt;
| step&amp;#039;: &amp;quot;star&amp;#039; r x y ⟹ r y z ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Demostración de que (star&amp;#039; r) es reflexiva *)&lt;br /&gt;
lemma star&amp;#039;Refl: &amp;quot;star&amp;#039; r x x&amp;quot;&lt;br /&gt;
  by (simp add: refl&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  apply (rule_tac y=x in step&amp;#039;)&lt;br /&gt;
     (* 1. r x y ⟹ star&amp;#039; r x x&lt;br /&gt;
        2. r x y ⟹ r x y *)&lt;br /&gt;
   apply (rule refl&amp;#039;)&lt;br /&gt;
     (* r x y ⟹ r x y *)&lt;br /&gt;
  apply assumption&lt;br /&gt;
     (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  by (meson refl&amp;#039; step&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
lemma rsubsetStar&amp;#039;_b: &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
by (simp add:step&amp;#039;[OF refl&amp;#039;[of r x]])&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
(* Demostración declarativa de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma rsubsetStar&amp;#039;: &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  assume 1:&amp;quot;r x y&amp;quot;&lt;br /&gt;
  have 2: &amp;quot;star&amp;#039; r x x&amp;quot; by (simp add: refl&amp;#039;)&lt;br /&gt;
  show &amp;quot;star&amp;#039; r x y&amp;quot; using 2 1 by (simp add: step&amp;#039;)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* A continuación se prueba una vondición suficiente para star&amp;#039; r *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r y z; r x y⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  apply (induct rule: star&amp;#039;.induct)&lt;br /&gt;
    (* 1. ⋀xa. r x xa ⟹ star&amp;#039; r x xa&lt;br /&gt;
       2. ⋀xa y z. ⟦star&amp;#039; r xa y; r x xa ⟹ star&amp;#039; r x y; r y z; r x xa⟧&lt;br /&gt;
                   ⟹ star&amp;#039; r x z *)&lt;br /&gt;
  apply (simp add: rsubsetStar&amp;#039;)&lt;br /&gt;
    (* ⋀xa y z. ⟦star&amp;#039; r xa y; r x xa ⟹ star&amp;#039; r x y; r y z; r x xa⟧&lt;br /&gt;
                ⟹ star&amp;#039; r x z *)&lt;br /&gt;
  apply (simp add: step&amp;#039;)&lt;br /&gt;
    (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma star&amp;#039;_subset_star&amp;#039;_l1:&lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r y z; r x y⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  by (induct rule: star&amp;#039;.induct)&lt;br /&gt;
     (auto simp add: rsubsetStar&amp;#039; step&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
(* Demostraciones de que  (star&amp;#039; r) es transitiva *)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;⟦star&amp;#039; r x y; star&amp;#039; r y z⟧ ⟹ star&amp;#039; r x z&amp;quot;   &lt;br /&gt;
  apply  (induction rule: star&amp;#039;.induct)&lt;br /&gt;
     (* 1. ⋀x. star&amp;#039; r x z ⟹ star&amp;#039; r x z&lt;br /&gt;
        2. ⋀x y za. ⟦star&amp;#039; r x y; star&amp;#039; r y z ⟹ star&amp;#039; r x z; r y za;&lt;br /&gt;
                     star&amp;#039; r za z⟧&lt;br /&gt;
                    ⟹ star&amp;#039; r x z *)&lt;br /&gt;
   apply simp&lt;br /&gt;
     (* ⋀x y za. ⟦star&amp;#039; r x y; star&amp;#039; r y z ⟹ star&amp;#039; r x z; r y za;&lt;br /&gt;
                     star&amp;#039; r za z⟧&lt;br /&gt;
                    ⟹ star&amp;#039; r x z *)&lt;br /&gt;
  apply (simp add: star&amp;#039;_subset_star&amp;#039;_l1)&lt;br /&gt;
     (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma star&amp;#039;Trans: &lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r x y; star&amp;#039; r y z⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  by (induction rule: star&amp;#039;.induct) &lt;br /&gt;
      (auto simp add: star&amp;#039;_subset_star&amp;#039;_l1)&lt;br /&gt;
   &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Considerar la siguiente definición inductiva. Probar que &lt;br /&gt;
  &amp;quot;star&amp;#039; r x y syss (∃n. iter r n x y)&amp;quot;&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
inductive iter :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ nat ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;&lt;br /&gt;
for r where&lt;br /&gt;
  iterRefl: &amp;quot;iter r 0 x x&amp;quot;&lt;br /&gt;
| iterStep: &amp;quot;⟦iter r n x y; r y z⟧ ⟹ iter r (n+1) x z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* El esquema de inducción correspondiente es *)&lt;br /&gt;
thm iter.induct&lt;br /&gt;
(*&lt;br /&gt;
  ⟦iter ?r ?x1.0 ?x2.0 ?x3.0; &lt;br /&gt;
   ⋀x. ?P 0 x x;&lt;br /&gt;
   ⋀n x y z. ⟦iter ?r n x y; ?P n x y; ?r y z⟧ ⟹ ?P (n + 1) x z⟧&lt;br /&gt;
  ⟹ ?P ?x1.0 ?x2.0 ?x3.0&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(* Algunos teoremas derivados son *)&lt;br /&gt;
&lt;br /&gt;
thm iterRefl&lt;br /&gt;
(* iter ?r 0 ?x ?x *)&lt;br /&gt;
&lt;br /&gt;
thm iterRefl [of r y]&lt;br /&gt;
(* iter r 0 y y *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep&lt;br /&gt;
(* ⟦iter ?r ?n ?x ?y; ?r ?y ?z⟧ ⟹ iter ?r (?n + 1) ?x ?z *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep [of r x y n z]&lt;br /&gt;
(* ⟦iter r x y n; r n z⟧ ⟹ iter r (x + 1) y z *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep [of r x y 0 y]&lt;br /&gt;
(* ⟦iter r x y 0; r 0 y⟧ ⟹ iter r (x + 1) y y *)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Demostrar  &lt;br /&gt;
     star&amp;#039; r x y ⟹ (∃n. iter r n x y)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;&lt;br /&gt;
  apply (induct rule: star&amp;#039;.induct)&lt;br /&gt;
     (* 1. ⋀x. ∃n. iter r n x x&lt;br /&gt;
        2. ⋀x y z. ⟦star&amp;#039; r x y; ∃n. iter r n x y; r y z⟧&lt;br /&gt;
                   ⟹ ∃n. iter r n x z *)&lt;br /&gt;
   apply (rule_tac x=0 in exI)&lt;br /&gt;
     (* 1. ⋀x. iter r 0 x x&lt;br /&gt;
        2. ⋀x y z. ⟦star&amp;#039; r x y; ∃n. iter r n x y; r y z⟧&lt;br /&gt;
                   ⟹ ∃n. iter r n x z *)&lt;br /&gt;
   apply (rule iterRefl)&lt;br /&gt;
     (* ⋀x y z. ⟦star&amp;#039; r x y; ∃n. iter r n x y; r y z⟧&lt;br /&gt;
                ⟹ ∃n. iter r n x z *)&lt;br /&gt;
  apply (erule exE)&lt;br /&gt;
     (* ⋀x y z n. ⟦star&amp;#039; r x y; r y z; iter r n x y⟧&lt;br /&gt;
                  ⟹ ∃n. iter r n x z *)&lt;br /&gt;
  apply (rule_tac x=&amp;quot;n+1&amp;quot; in exI)&lt;br /&gt;
     (* ⋀x y z n. ⟦star&amp;#039; r x y; r y z; iter r n x y⟧&lt;br /&gt;
                  ⟹ iter r (n + 1) x z *)&lt;br /&gt;
  apply (erule iterStep)&lt;br /&gt;
     (*  ⋀x y z n. ⟦star&amp;#039; r x y; r y z⟧ ⟹ r y z *)&lt;br /&gt;
  apply assumption&lt;br /&gt;
     (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma [rule_format]: &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;    &lt;br /&gt;
  by (induct rule: star&amp;#039;.induct)&lt;br /&gt;
     (auto intro: iterRefl iterStep)&lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma [rule_format]: &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;    &lt;br /&gt;
proof (induct rule: star&amp;#039;.induct)&lt;br /&gt;
  fix x &lt;br /&gt;
  have &amp;quot;iter r 0 x x&amp;quot; by (rule iterRefl)&lt;br /&gt;
  then show &amp;quot;∃n. iter r n x x&amp;quot; ..&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume 1: &amp;quot;star&amp;#039; r x y&amp;quot; and&lt;br /&gt;
         2: &amp;quot;∃n. iter r n x y&amp;quot; and&lt;br /&gt;
         3: &amp;quot;r y z&amp;quot;&lt;br /&gt;
  from 2 obtain m where  &amp;quot;iter r m x y&amp;quot; ..      &lt;br /&gt;
  then have  &amp;quot;iter r (m+1) x z&amp;quot; using 3 by (rule iterStep)&lt;br /&gt;
  then show &amp;quot;∃n. iter r n x z&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
  &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Demostrar  &lt;br /&gt;
     (∃n. iter r n x y) ⟹ star&amp;#039; r x y&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* En la demostración se usará el siguiente lema:&lt;br /&gt;
      iter r n x y ⟹ star&amp;#039; r x y *)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa del lema *) &lt;br /&gt;
lemma iter_star&amp;#039;_subset: &amp;quot;iter r n x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  apply (induct rule: iter.induct)&lt;br /&gt;
     (* 1. ⋀x. star&amp;#039; r x x&lt;br /&gt;
        2. ⋀n x y z. ⟦iter r n x y; star&amp;#039; r x y; r y z⟧&lt;br /&gt;
                     ⟹ star&amp;#039; r x z *)&lt;br /&gt;
   apply (rule refl&amp;#039;)&lt;br /&gt;
     (* ⋀n x y z. ⟦iter r n x y; star&amp;#039; r x y; r y z⟧&lt;br /&gt;
                  ⟹ star&amp;#039; r x z *)&lt;br /&gt;
  apply (erule step&amp;#039;)&lt;br /&gt;
     (* ⋀n x y z. ⟦iter r n x y; r y z⟧ ⟹ r y z*)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática del lema *) &lt;br /&gt;
lemma &amp;quot;iter r n x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  by (induct rule: iter.induct)&lt;br /&gt;
     (auto simp add: refl&amp;#039; step&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(∃n. iter r n x y) ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  apply (erule exE)&lt;br /&gt;
    (* ⋀n. iter r n x y ⟹ star&amp;#039; r x y *)&lt;br /&gt;
  apply (erule iter_star&amp;#039;_subset)&lt;br /&gt;
    (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;(∃n. iter r n x y) ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  by (auto simp add: iter_star&amp;#039;_subset)&lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma assumes &amp;quot;(∃n. iter r n x y)&amp;quot;&lt;br /&gt;
      shows &amp;quot;star&amp;#039; r x y&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have  &amp;quot;∃n. iter r n x y&amp;quot; using assms .&lt;br /&gt;
  then obtain k where &amp;quot;iter r k x y&amp;quot; ..&lt;br /&gt;
  then show &amp;quot;star&amp;#039; r x y&amp;quot; by (rule iter_star&amp;#039;_subset)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_11&amp;diff=802</id>
		<title>Sol 11</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_11&amp;diff=802"/>
		<updated>2019-06-26T15:59:23Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
chapter {* R11: Razonamiento sobre programas en Isabelle/HOL *}&lt;br /&gt;
 &lt;br /&gt;
theory R11_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
   En toda la relación de ejercicios las demostraciones han de realizarse&lt;br /&gt;
   de las formas siguientes:&lt;br /&gt;
    (*) detallada&lt;br /&gt;
    (*) estructurada&lt;br /&gt;
    (*) aplicativa&lt;br /&gt;
    (*) automática&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: nat ⇒ nat&lt;br /&gt;
  tal que &lt;br /&gt;
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaPotenciasDeDosMasUno 3  =  16&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot;&lt;br /&gt;
| &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
      sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;sumaPotenciasDeDosMasUno 3&amp;quot; ― ‹= 16›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que &lt;br /&gt;
     sumaPotenciasDeDosMasUno n = 2^(n+1)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma sumaPotenciasDeDosMasUno_d: &lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;sumaPotenciasDeDosMasUno 0 = 2^(0+1)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n &lt;br /&gt;
  assume HI: &amp;quot;sumaPotenciasDeDosMasUno n = 2 ^ (n + 1)&amp;quot;&lt;br /&gt;
  show &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = 2 ^ (Suc n + 1)&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
      have &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;... = 2 ^ (n + 1) + 2^(n+1)&amp;quot; using HI by simp&lt;br /&gt;
      also have &amp;quot;... = 2 ^ (Suc n + 1)&amp;quot; by simp&lt;br /&gt;
      finally show ?thesis .&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma sumaPotenciasDeDosMasUno_e: &lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma sumaPotenciasDeDosMasUno_a: &lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  apply (induct n)&lt;br /&gt;
   apply simp_all&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma sumaPotenciasDeDosMasUno_auto: &lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
 by (induct n) simp_all&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     copia :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (copia n x) es la lista formado por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     copia 3 x = [x,x,x]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun copia :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia 0 x       = []&amp;quot;&lt;br /&gt;
| &amp;quot;copia (Suc n) x = x # copia n x&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;copia 3 x&amp;quot; ― ‹= [x,x,x]›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&lt;br /&gt;
     todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&lt;br /&gt;
  Nota: La conjunción se representa por ∧&lt;br /&gt;
  ----------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos p (x#xs) = (p x ∧ todos p xs)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(1::nat)) [2,6,4]&amp;quot; ― ‹= True›&lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(2::nat)) [2,6,4]&amp;quot; ― ‹= False›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar que todos los elementos de (copia n x) son&lt;br /&gt;
  iguales a x. &lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
lemma todos_copia_d: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  proof (induct n)&lt;br /&gt;
  show &amp;quot;todos (λy. y = x) (copia 0 x)&amp;quot; by simp&lt;br /&gt;
 next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;todos (λy. y = x) (copia n x)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λy. y = x) (copia (Suc n) x) =&lt;br /&gt;
  todos (λy. y = x) (x # copia n x)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (x = x ∧ todos (λy. y = x) (copia n x))&amp;quot;&lt;br /&gt;
  by simp&lt;br /&gt;
  also have &amp;quot;... = True&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos (λy. y = x) (copia (Suc n) x)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
lemma todos_copia_e: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
lemma todos_copia_a: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  apply (induct n)    &lt;br /&gt;
  apply simp_all&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma todos_copia_auto: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  by (induct n) simp_all&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
    factR :: nat ⇒ nat&lt;br /&gt;
  tal que (factR n) es el factorial de n. Por ejemplo,&lt;br /&gt;
    factR 4 = 24&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun factR :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factR 0 = 1&amp;quot;&lt;br /&gt;
| &amp;quot;factR (Suc n) = Suc n * factR n&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;factR 4&amp;quot; ― ‹= 24›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Se considera la siguiente definición iterativa de la&lt;br /&gt;
  función factorial &lt;br /&gt;
     factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI n = factI&amp;#039; n 1&lt;br /&gt;
 &lt;br /&gt;
     factI&amp;#039; :: nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI&amp;#039; 0       x = x&lt;br /&gt;
     factI&amp;#039; (Suc n) x = factI&amp;#039; n (Suc n)*x&lt;br /&gt;
  Demostrar que, para todo n y todo x, se tiene &lt;br /&gt;
     factI&amp;#039; n x = x * factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun factI&amp;#039; :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI&amp;#039; 0       x = x&amp;quot;&lt;br /&gt;
| &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (x* (Suc n))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
fun factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI n = factI&amp;#039; n 1&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
lemma fact_d: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
proof (induct n arbitrary: x)&lt;br /&gt;
  show &amp;quot;⋀x. factI&amp;#039; 0 x = x * factR 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix  n&lt;br /&gt;
  assume HI: &amp;quot;⋀x. factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
  show &amp;quot;⋀x. factI&amp;#039; (Suc n) x = x * factR (Suc n)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
  fix x&lt;br /&gt;
  have &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (x * (Suc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (x * (Suc n)) * factR n&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = x * ((Suc n) * factR n)&amp;quot; by (simp only: mult.assoc)&lt;br /&gt;
  also have &amp;quot;... = x * factR (Suc n)&amp;quot; by simp                   &lt;br /&gt;
  finally show &amp;quot;factI&amp;#039; (Suc n) x = x * factR (Suc n)&amp;quot; by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma fact_e: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
thm mult_Suc&lt;br /&gt;
thm mult.assoc  &lt;br /&gt;
  &lt;br /&gt;
lemma fact_a: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
  apply (induct n arbitrary: x)  &lt;br /&gt;
   apply simp&lt;br /&gt;
  apply (simp del: mult_Suc)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma fact_auto: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
by (induct n arbitrary: x) (auto simp del: mult_Suc)&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que&lt;br /&gt;
     factI n = factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
corollary fact_equiv: &amp;quot;factI n = factR n&amp;quot;&lt;br /&gt;
by (simp add: fact_a)&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir, recursivamente y sin usar (@), la función&lt;br /&gt;
     amplia :: &amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al&lt;br /&gt;
  final de la lista xs. Por ejemplo,&lt;br /&gt;
     amplia [d,a] t = [d,a,t]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;amplia []     y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;amplia (x#xs) y = x # amplia xs y&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;amplia [d,a] t&amp;quot; ― ‹= [d,a,t]›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que &lt;br /&gt;
     amplia xs y = xs @ [y]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
lemma amplia_append_d: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  proof (induct xs)&lt;br /&gt;
  show &amp;quot;amplia [] y = [] @ [y]&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  have &amp;quot;amplia (x # xs) y = x # amplia xs y&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x # (xs @ [y])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (x # xs) @ [y]&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;amplia (x # xs) y = (x # xs) @ [y]&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma amplia_append_e: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
lemma amplia_append_a: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
   apply (induct xs)    &lt;br /&gt;
   apply simp_all&lt;br /&gt;
    done&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
lemma amplia_append_auto: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  by (induct xs) simp_all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun algunos  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;algunos p [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;algunos p (x#xs) = ((p x) ∨ (algunos p xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar&lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
    &lt;br /&gt;
  &lt;br /&gt;
lemma conjCommuta4: &amp;quot;a ∧ b ∧ c ∧ d ⟷ a ∧ c ∧ b ∧ d&amp;quot;    &lt;br /&gt;
  apply (rule iffI)&lt;br /&gt;
   apply (rule conjI)&lt;br /&gt;
    apply (erule conjunct1)&lt;br /&gt;
   apply (rule conjI)&lt;br /&gt;
    apply (drule conjunct2)&lt;br /&gt;
    apply (drule conjunct2)&lt;br /&gt;
    apply (erule conjunct1) &lt;br /&gt;
   apply (drule conjunct2)&lt;br /&gt;
   apply (frule conjunct1)&lt;br /&gt;
   apply (drule conjunct2)+&lt;br /&gt;
    apply (rule conjI, assumption+)&lt;br /&gt;
  apply auto&lt;br /&gt;
    done&lt;br /&gt;
&lt;br /&gt;
lemma todos_conj_d: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_conj_e: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos (λx. P x ∧ Q x) [] = (todos P [] ∧ todos Q [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
thm mult_Suc&lt;br /&gt;
thm mult.assoc  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
lemma todos_conj_a: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  apply (induct xs) &lt;br /&gt;
  apply simp&lt;br /&gt;
  apply simp&lt;br /&gt;
  apply (simp add: conjCommuta4)&lt;br /&gt;
    done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma todos_conj_auto: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
    by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar&lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma todos_append_d: &amp;quot;todos P (xs @ ys) = (todos P xs ∧ todos P ys)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos P ([] @ ys) = (todos P [] ∧ todos P ys)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;todos P (xs @ ys) = (todos P xs ∧ todos P ys)&amp;quot;&lt;br /&gt;
  show &amp;quot;todos P ((a # xs) @ ys) = (todos P (a # xs) ∧ todos P ys)&amp;quot; &lt;br /&gt;
    proof -&lt;br /&gt;
      have &amp;quot;todos P ((a#xs) @ ys) = ((P a) ∧ todos P (xs@ys))&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;... = ((P a) ∧ todos P xs ∧ todos P ys)&amp;quot; using HI by simp&lt;br /&gt;
      also have &amp;quot;... = (todos P (a#xs) ∧ todos P ys)&amp;quot; by simp&lt;br /&gt;
      finally show ?thesis .&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma todos_append_e: &amp;quot;todos P (xs @ ys) = (todos P xs ∧ todos P ys)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos P ([] @ ys) = (todos P [] ∧ todos P ys)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume &amp;quot;todos P (xs @ ys) = (todos P xs ∧ todos P ys)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos P ((a # xs) @ ys) = (todos P (a # xs) ∧ todos P ys)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma todos_append_a: &amp;quot;todos P (xs @ ys) = (todos P xs ∧ todos P ys)&amp;quot;&lt;br /&gt;
apply (induct xs)&lt;br /&gt;
apply simp_all&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
lemma todos_append_auto: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
by (induct x) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar&lt;br /&gt;
     todos P (rev xs) = todos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma todos_rev_d: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos P (rev []) = todos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  show &amp;quot;todos P (rev (a # xs)) = todos P (a # xs)&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
      have &amp;quot;todos P (rev (a#xs)) = todos P ((rev xs)@[a])&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;... = (todos P (rev xs) ∧ todos P [a])&amp;quot;&lt;br /&gt;
        by (simp add: todos_append_a)&lt;br /&gt;
      also have &amp;quot;... = (todos P xs ∧ todos P [a])&amp;quot; using HI by simp&lt;br /&gt;
      also have &amp;quot;... = (todos P [a] ∧ todos P xs)&amp;quot; by auto&lt;br /&gt;
      also have &amp;quot;... = (P a ∧ todos P xs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;... = todos P (a#xs)&amp;quot; by simp&lt;br /&gt;
      finally show ?thesis .&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma todos_rev_e: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos P (rev []) = todos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos P (rev (a#xs)) = todos P (a#xs)&amp;quot;&lt;br /&gt;
    by (auto simp add: todos_append_a)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma todos_rev_a: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_rev_auto: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: todos_append_a)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar:&lt;br /&gt;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma algunos_map_d: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (map f []) = algunos (P o f) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
  show &amp;quot;algunos P (map f (a#xs)) = algunos (P o f) (a#xs)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;algunos P (map f (a#xs)) = algunos P ((f a)#(map f xs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = ((P (f a)) ∨ (algunos P (map f xs)))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (((P o f) a) ∨ (algunos (P o f) xs))&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = algunos (P o f) (a#xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma algunos_map_e: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (map f []) = algunos (P o f) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;algunos P (map f (a#xs)) = algunos (P o f) (a#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
thm algunos.simps&lt;br /&gt;
&lt;br /&gt;
lemma algunos_map_a: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
  apply (induct xs)&lt;br /&gt;
   apply simp_all&lt;br /&gt;
    done&lt;br /&gt;
  &lt;br /&gt;
thm conj_commute&lt;br /&gt;
    &lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
lemma algunos_map_auto: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
by (induct xs) simp_all&lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar o refutar&lt;br /&gt;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma algunos_append_d: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P ([] @ ys) = (algunos P [] ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
  show &amp;quot;algunos P ((a#xs) @ ys) = (algunos P (a#xs) ∨ algunos P ys)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;algunos P ((a#xs) @ ys) = algunos P (a#(xs @ ys))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = ((P a) ∨ algunos P (xs @ ys))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = ((P a) ∨ algunos P xs ∨ algunos P ys)&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (algunos P (a#xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
thm Fun.comp_apply&lt;br /&gt;
  &lt;br /&gt;
lemma algunos_append_e: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P ([] @ ys) = (algunos P [] ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
  thus &amp;quot;algunos P ((a#xs) @ ys) = (algunos P (a#xs) ∨ algunos P ys)&amp;quot;&lt;br /&gt;
    by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma algunos_append_a: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_append_auto: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
by (induct xs) simp_all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar&lt;br /&gt;
     algunos P (rev xs) = algunos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma algunos_rev_d: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (rev []) = algunos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  show &amp;quot;algunos P (rev (a#xs)) = algunos P (a#xs)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;algunos P (rev (a#xs)) = algunos P ((rev xs) @ [a])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (algunos P (rev xs) ∨ algunos P [a])&amp;quot;&lt;br /&gt;
      by (simp add: algunos_append_auto)&lt;br /&gt;
    also have &amp;quot;... = (algunos P xs ∨ algunos P [a])&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (algunos P xs ∨ P a)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (P a ∨ algunos P xs)&amp;quot; by (rule disj_commute)&lt;br /&gt;
    also have &amp;quot;... = algunos P (a#xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma algunos_rev_e: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (rev []) = algunos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;algunos P (rev (a#xs)) = algunos P (a#xs)&amp;quot;&lt;br /&gt;
    by (auto simp add: algunos_append_auto)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma algunos_rev_a: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  apply (induct xs)&lt;br /&gt;
   apply simp&lt;br /&gt;
   apply (simp add: algunos_append_auto)&lt;br /&gt;
  apply (simp add: disj_commute)&lt;br /&gt;
   done &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma algunos_rev_auto: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: algunos_append_auto)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  y demostrar la equivalencia de forma automática y detallada.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
  apply (induct xs)&lt;br /&gt;
   apply simp&lt;br /&gt;
  apply simp&lt;br /&gt;
    by auto&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨algunos Q xs)&amp;quot;&lt;br /&gt;
  proof (induct xs) &lt;br /&gt;
    show &amp;quot;algunos (λx. P x ∨ Q x) [] = (algunos P []∨ algunos Q [])&amp;quot; by simp&lt;br /&gt;
   next&lt;br /&gt;
     fix a xs&lt;br /&gt;
     assume &amp;quot;algunos (λx. (P x ∨ Q x)) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
     thus &amp;quot;algunos (λx. P x ∨ Q x) (a#xs) = (algunos P(a#xs) ∨ algunos Q (a#xs))&amp;quot;&lt;br /&gt;
        by auto&lt;br /&gt;
    qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar o refutar&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma algunos_no_todos_d: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P [] = (¬ todos (λx. ¬ P x) [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P xs = (¬ todos (λx. ¬ P x) xs)&amp;quot;&lt;br /&gt;
  show &amp;quot;algunos P (a # xs) = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
      have &amp;quot;algunos P (a # xs) = ((P a) ∨ (algunos P xs))&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;... = ((P a) ∨ (¬ todos (λx. ¬ P x) xs))&amp;quot; using HI by simp&lt;br /&gt;
      also have &amp;quot;... = (¬ (¬ (P a) ∧ todos (λx. (¬ P x)) xs))&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;... = (¬ todos (λx. (¬ P x)) (a#xs))&amp;quot; by simp&lt;br /&gt;
      finally show ?thesis .&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma algunos_no_todos_e: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_no_todos_a: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_no_todos_auto: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
by (induct xs) simp_all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Definir la función&lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;estaEn x [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a#xs) = (x=a ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  Demostrar dicha relación de forma automática y detallada.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_algunos_auto:&lt;br /&gt;
&amp;quot;estaEn y xs = algunos (λx. y=x) xs&amp;quot;&lt;br /&gt;
  by (induct xs) simp_all&lt;br /&gt;
   &lt;br /&gt;
lemma estaEn_algunos_a:&lt;br /&gt;
&amp;quot;estaEn y xs = algunos (λx. y=x) xs&amp;quot;    &lt;br /&gt;
  apply (induct xs)&lt;br /&gt;
   apply simp&lt;br /&gt;
  apply simp&lt;br /&gt;
    done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_algunos_e:&lt;br /&gt;
&amp;quot;estaEn y xs = algunos (λ x. y=x) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn y [] = algunos (λ x. y=x) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume &amp;quot;estaEn y xs = algunos (λ x. y=x) xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;estaEn y (a#xs) = algunos (λ x. y=x) (a#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Definir la función&lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;sinDuplicados [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (a#xs) = ((¬ estaEn a xs) ∧ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Definir la función&lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida &lt;br /&gt;
  remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
&amp;quot;borraDuplicados [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (a#xs) = (if estaEn a xs&lt;br /&gt;
  then borraDuplicados xs&lt;br /&gt;
  else (a#borraDuplicados xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar o refutar&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma length_borraDuplicados_d:&lt;br /&gt;
&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados []) ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  show &amp;quot;length (borraDuplicados (a#xs)) ≤ length (a#xs)&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume &amp;quot;estaEn a xs&amp;quot;&lt;br /&gt;
    hence &amp;quot;length (borraDuplicados (a#xs)) = length (borraDuplicados xs)&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;... ≤ length xs&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... ≤ length (a#xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;(¬ estaEn a xs)&amp;quot;&lt;br /&gt;
    hence &amp;quot;length (borraDuplicados (a#xs)) = length (a#(borraDuplicados xs))&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... ≤ 1 + length xs&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = length (a#xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma length_borraDuplicados_e:&lt;br /&gt;
&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados [])  ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;length (borraDuplicados (a#xs)) ≤ length (a#xs)&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume &amp;quot;estaEn a xs&amp;quot;&lt;br /&gt;
    thus &amp;quot;length (borraDuplicados (a#xs)) ≤ length (a#xs)&amp;quot;&lt;br /&gt;
      using HI by auto&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;(¬ estaEn a xs)&amp;quot;&lt;br /&gt;
    thus &amp;quot;length (borraDuplicados (a#xs)) ≤ length (a#xs)&amp;quot;&lt;br /&gt;
      using HI by auto&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma length_borraDuplicados_a:&lt;br /&gt;
&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma length_borraDuplicados_auto:&lt;br /&gt;
&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
by (induct xs) simp_all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar o refutar&lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_borraDuplicados_d:&lt;br /&gt;
&amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados []) = estaEn a []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix b xs&lt;br /&gt;
  assume HI: &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados (b#xs)) = estaEn a (b#xs)&amp;quot;&lt;br /&gt;
  proof (rule iffI)&lt;br /&gt;
    assume c1: &amp;quot;estaEn a (borraDuplicados (b#xs))&amp;quot;&lt;br /&gt;
    show &amp;quot;estaEn a (b#xs)&amp;quot;&lt;br /&gt;
    proof (cases)&lt;br /&gt;
      assume &amp;quot;estaEn b xs&amp;quot;&lt;br /&gt;
      thus &amp;quot;estaEn a (b#xs)&amp;quot; using c1 HI by auto&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;¬ estaEn b xs&amp;quot;&lt;br /&gt;
      thus &amp;quot;estaEn a (b#xs)&amp;quot; using c1 HI by auto&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    assume c2: &amp;quot;estaEn a (b#xs)&amp;quot;&lt;br /&gt;
    show &amp;quot;estaEn a (borraDuplicados (b#xs))&amp;quot;&lt;br /&gt;
    proof (cases)&lt;br /&gt;
      assume &amp;quot;a=b&amp;quot;&lt;br /&gt;
      thus &amp;quot;estaEn a (borraDuplicados (b#xs))&amp;quot; using HI by auto&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;a ≠ b&amp;quot;&lt;br /&gt;
      thus &amp;quot;estaEn a (borraDuplicados (b#xs))&amp;quot; using `a ≠ b` c2 HI by auto&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_borraDuplicados_e:&lt;br /&gt;
&amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados []) = estaEn a []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix b xs&lt;br /&gt;
  assume HI: &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados (b#xs)) = estaEn a (b#xs)&amp;quot;&lt;br /&gt;
  proof (rule iffI)&lt;br /&gt;
    assume c1: &amp;quot;estaEn a (borraDuplicados (b#xs))&amp;quot;&lt;br /&gt;
    show &amp;quot;estaEn a (b#xs)&amp;quot;&lt;br /&gt;
    proof (cases)&lt;br /&gt;
      assume &amp;quot;estaEn b xs&amp;quot;&lt;br /&gt;
      thus &amp;quot;estaEn a (b#xs)&amp;quot; using c1 HI by auto&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;¬ estaEn b xs&amp;quot;&lt;br /&gt;
      thus &amp;quot;estaEn a (b#xs)&amp;quot; using c1 HI by auto&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    assume c2: &amp;quot;estaEn a (b#xs)&amp;quot;&lt;br /&gt;
    show &amp;quot;estaEn a (borraDuplicados (b#xs))&amp;quot;&lt;br /&gt;
    proof (cases)&lt;br /&gt;
      assume &amp;quot;a=b&amp;quot;&lt;br /&gt;
      thus &amp;quot;estaEn a (borraDuplicados (b#xs))&amp;quot; using HI by auto&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;a ≠ b&amp;quot;&lt;br /&gt;
      thus &amp;quot;estaEn a (borraDuplicados (b#xs))&amp;quot; using `a ≠ b` c2 HI by auto&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_borraDuplicados_a:&lt;br /&gt;
&amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_borraDuplicados_auto:&lt;br /&gt;
&amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar o refutar&lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma sinDuplicados_borraDuplicados_d:&lt;br /&gt;
&amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;sinDuplicados (borraDuplicados [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
  show &amp;quot;sinDuplicados (borraDuplicados (a#xs))&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume &amp;quot;estaEn a xs&amp;quot;&lt;br /&gt;
    thus &amp;quot;sinDuplicados (borraDuplicados (a#xs))&amp;quot; using HI by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬ estaEn a xs&amp;quot;&lt;br /&gt;
    hence &amp;quot;¬ (estaEn a xs) ∧ sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
      using HI by simp&lt;br /&gt;
    hence &amp;quot;¬ estaEn a (borraDuplicados xs) ∧ sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
      by (simp add: estaEn_borraDuplicados_auto)&lt;br /&gt;
    hence &amp;quot;sinDuplicados (a#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    thus &amp;quot;sinDuplicados (borraDuplicados (a#xs))&amp;quot;&lt;br /&gt;
      using `¬ estaEn a xs` by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma sinDuplicados_borraDuplicados_e:&lt;br /&gt;
&amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;sinDuplicados (borraDuplicados [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
  show &amp;quot;sinDuplicados (borraDuplicados (a#xs))&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume &amp;quot;estaEn a xs&amp;quot;&lt;br /&gt;
    thus &amp;quot;sinDuplicados (borraDuplicados (a#xs))&amp;quot; using HI by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬ estaEn a xs&amp;quot;&lt;br /&gt;
    thus &amp;quot;sinDuplicados (borraDuplicados (a#xs))&amp;quot;&lt;br /&gt;
      using `¬ estaEn a xs` HI by (auto simp add: estaEn_borraDuplicados_auto)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma sinDuplicados_borraDuplicados_a:&lt;br /&gt;
&amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma sinDuplicados_borraDuplicados_auto:&lt;br /&gt;
&amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: estaEn_borraDuplicados_auto)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 28. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_10&amp;diff=801</id>
		<title>Sol 10</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_10&amp;diff=801"/>
		<updated>2019-06-26T15:59:04Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
chapter {* R10: Programación funcional en Isabelle/HOL *}&lt;br /&gt;
 &lt;br /&gt;
theory R10_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
 &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: nat ⇒ nat&lt;br /&gt;
  tal que &lt;br /&gt;
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaPotenciasDeDosMasUno 3  =  16&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot;&lt;br /&gt;
| &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
      sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;sumaPotenciasDeDosMasUno 3&amp;quot; ― ‹= 16›&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Se considera la siguiente definición iterativa de la&lt;br /&gt;
  función factorial &lt;br /&gt;
     factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI n = factI&amp;#039; n 1&lt;br /&gt;
 &lt;br /&gt;
     factI&amp;#039; :: nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI&amp;#039; 0       x = x&lt;br /&gt;
     factI&amp;#039; (Suc n) x = factI&amp;#039; n (Suc n)*x&lt;br /&gt;
&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun factI&amp;#039; :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI&amp;#039; 0       x = x&amp;quot;&lt;br /&gt;
| &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (x* (Suc n))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
fun factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI n = factI&amp;#039; n 1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;factI 4&amp;quot; ― ‹= 24›&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir, recursivamente y sin usar (@), la función&lt;br /&gt;
     amplia :: &amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al&lt;br /&gt;
  final de la lista xs. Por ejemplo,&lt;br /&gt;
     amplia [d,a] t = [d,a,t]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;amplia []     y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;amplia (x#xs) y = x # amplia xs y&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;amplia [d,a] t&amp;quot; ― ‹= [d,a,t]›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&lt;br /&gt;
     todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&lt;br /&gt;
  Nota: La conjunción se representa por ∧&lt;br /&gt;
  ----------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos p (x#xs) = (p x ∧ todos p xs)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(1::nat)) [2,6,4]&amp;quot; ― ‹= True›&lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(2::nat)) [2,6,4]&amp;quot; ― ‹= False›&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun algunos  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;algunos p [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;algunos p (x#xs) = ((p x) ∨ (algunos p xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir recursivamente la función &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;estaEn x [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a#xs) = (x=a ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir recursivamemte la función&lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;sinDuplicados [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (a#xs) = ((¬ estaEn a xs) ∧ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la recursivamente la función&lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida &lt;br /&gt;
  remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
&amp;quot;borraDuplicados [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (a#xs) = (if estaEn a xs&lt;br /&gt;
  then borraDuplicados xs&lt;br /&gt;
  else (a#borraDuplicados xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_9&amp;diff=800</id>
		<title>Sol 9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_9&amp;diff=800"/>
		<updated>2019-06-26T15:58:47Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R9 Programación funcional en Isabelle *}&lt;br /&gt;
&lt;br /&gt;
theory R9_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 0. Definir, por recursión, la función&lt;br /&gt;
     factorial :: nat ⇒ nat&lt;br /&gt;
  tal que (factorial n) es el factorial de n. Por ejemplo,&lt;br /&gt;
     factorial 4 = 24&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fun factorial :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
 &amp;quot;factorial 0 = 1&amp;quot;&lt;br /&gt;
 |&amp;quot; factorial (Suc m) = (Suc m)*(factorial m)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* value &amp;quot;factorial (4::nat)&amp;quot;*)&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Definir, por recursión, la función&lt;br /&gt;
     longitud :: &amp;#039;a list ⇒ nat&lt;br /&gt;
  tal que (longitud xs) es la longitud de la listas xs. Por ejemplo,&lt;br /&gt;
     longitud [4,2,5] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
fun longitud :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;longitud []     = 0&amp;quot;&lt;br /&gt;
| &amp;quot;longitud (x#xs) = 1 + longitud xs&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
value &amp;quot;longitud [a,b,c]&amp;quot; ― ‹= 3› &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     fun intercambia :: &amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&lt;br /&gt;
  tal que (intercambia p) es el par obtenido intercambiando las&lt;br /&gt;
  componentes del par p. Por ejemplo,&lt;br /&gt;
     intercambia (u,v) = (v,u)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun intercambia :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;intercambia (x,y) = (y,x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;intercambia (u,v)&amp;quot; ― ‹= (v,u)›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir, por recursión, la función&lt;br /&gt;
     inversa :: &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (inversa xs) es la lista obtenida invirtiendo el orden de los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     inversa [a,d,c] = [c,d,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversa :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;inversa (x#xs) = inversa xs @ [x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa [a,d,c]&amp;quot; ― ‹= [c,d,a]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     repite :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (repite n x) es la lista formada por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     repite 3 a = [a,a,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun repite :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite 0 x       = []&amp;quot;&lt;br /&gt;
| &amp;quot;repite (Suc n) x = x # (repite n x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;repite 3 a&amp;quot; ― ‹= [a,a,a]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     conc :: &amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (conc xs ys) es la concatención de las listas xs e ys. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     conc [a,d] [b,d,a,c] = [a,d,b,d,a,c]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun conc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc []     ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;conc (x#xs) ys = x # (conc xs ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc [a,d] [b,d,a,c]&amp;quot; ― ‹= [a,d,b,d,a,c]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     coge :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (coge n xs) es la lista de los n primeros elementos de xs. Por &lt;br /&gt;
  ejemplo, &lt;br /&gt;
     coge 2 [a,c,d,b,e] = [a,c]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge n []           = []&amp;quot;&lt;br /&gt;
| &amp;quot;coge 0 xs           = []&amp;quot;&lt;br /&gt;
| &amp;quot;coge (Suc n) (x#xs) = x # (coge n xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge 2 [a,c,d,b,e]&amp;quot; ― ‹= [a,c]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     elimina :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
  elementos de xs. Por ejemplo, &lt;br /&gt;
     elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n []           = []&amp;quot;&lt;br /&gt;
| &amp;quot;elimina 0 xs           = xs&amp;quot;&lt;br /&gt;
| &amp;quot;elimina (Suc n) (x#xs) = elimina n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina 2 [a,c,d,b,e]&amp;quot; ― ‹= [d,b,e]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la función&lt;br /&gt;
     esVacia :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (esVacia xs) se verifica si xs es la lista vacía. Por ejemplo,&lt;br /&gt;
     esVacia []  = True&lt;br /&gt;
     esVacia [1] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun esVacia :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;esVacia (x#xs) = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
value &amp;quot;esVacia []&amp;quot;  ― ‹= True›&lt;br /&gt;
value &amp;quot;esVacia [1]&amp;quot; ― ‹= False›&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función&lt;br /&gt;
     inversaAc :: &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (inversaAc xs) es a inversa de xs calculada usando&lt;br /&gt;
  acumuladores. Por ejemplo, &lt;br /&gt;
     inversaAc [a,c,b,e] = [e,b,c,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversaAcAux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux [] ys     = ys&amp;quot;&lt;br /&gt;
| &amp;quot;inversaAcAux (x#xs) ys = inversaAcAux xs (x#ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc xs = inversaAcAux xs []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc [a,c,b,e]&amp;quot; ― ‹= [e,b,c,a]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir la función&lt;br /&gt;
     sum :: nat list ⇒ nat&lt;br /&gt;
  tal que (sum xs) es la suma de los elementos de xs. Por ejemplo,&lt;br /&gt;
     sum [3,2,5] = 10&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sum :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sum []     = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sum (x#xs) = x + sum xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
value &amp;quot;sum [3,2,5]&amp;quot; ― ‹= 10›&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función&lt;br /&gt;
     map :: (&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&lt;br /&gt;
  tal que (map f xs) es la lista obtenida aplicando la función f a los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     map (λx. 2*x) [3,2,5] = [6,4,10]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun map :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map f []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;map f (x#xs) = (f x) # map f xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
value &amp;quot;map (λx. 2*x) [3::nat,2,5]&amp;quot; ― ‹= [6,4,10]›&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_12&amp;diff=799</id>
		<title>Sol 12</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_12&amp;diff=799"/>
		<updated>2019-06-26T15:58:29Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R12: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R12_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que tiene información en los nodos y en las hojas. &lt;br /&gt;
  Por ejemplo, el árbol&lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
     a   d f   h &lt;br /&gt;
  se representa por &amp;quot;N e (N c (H a) (H d)) (N g (H f) (H h))&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = H &amp;quot;&amp;#039;a&amp;quot; | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;N e (N c (H a) (H d)) (N g (H f) (H h))&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función &lt;br /&gt;
     preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (preOrden a) es el recorrido pre orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     preOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [e,c,a,d,g,f,h] &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrden (H x)     = [x]&amp;quot;&lt;br /&gt;
| &amp;quot;preOrden (N x i d) = x#((preOrden i)@(preOrden d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (H a) (H d)) (N g (H f) (H h))) = [e,c,a,d,g,f,h]&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función &lt;br /&gt;
     postOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (postOrden a) es el recorrido post orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     postOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [e,c,a,d,g,f,h] &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun postOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrden (H x)     = [x]&amp;quot;&lt;br /&gt;
| &amp;quot;postOrden (N x i d) = (postOrden i)@(postOrden d)@[x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;postOrden (N e (N c (H a) (H d)) (N g (H f) (H h))) = [a,d,c,f,h,g,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     inOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (inOrden a) es el recorrido in orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     inOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [a,c,d,e,f,g,h]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun inOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inOrden (H x)     = [x]&amp;quot;&lt;br /&gt;
| &amp;quot;inOrden (N x i d) = (inOrden i)@[x]@(inOrden d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inOrden (N e (N c (H a) (H d)) (N g (H f) (H h))) = [a,c,d,e,f,g,h]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot;&lt;br /&gt;
  tal que (espejo a) es la imagen especular del árbol a. Por ejemplo, &lt;br /&gt;
     espejo (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = N e (N g (H h) (H f)) (N c (H d) (H a))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;espejo (H x)     = (H x)&amp;quot;&lt;br /&gt;
| &amp;quot;espejo (N x i d) = (N x (espejo d) (espejo i))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;espejo (N e (N c (H a) (H d)) (N g (H f) (H h))) = N e (N g (H h) (H f)) (N c (H d) (H a))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que&lt;br /&gt;
     preOrden (espejo a) = rev (postOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume HI1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N a1 a2 a3)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;preOrden (espejo (N a1 a2 a3)) = preOrden (N a1 (espejo a3) (espejo a2))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = [a1] @ preOrden (espejo a3) @ preOrden (espejo a2)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev [a1] @ rev (postOrden a3) @ rev (postOrden a2)&amp;quot; using HI1 HI2 by simp &lt;br /&gt;
    also have &amp;quot;… = rev ((postOrden a2) @ (postOrden a3) @ [a1])&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que&lt;br /&gt;
     postOrden (espejo a) = rev (preOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;postOrden (espejo (N x i d)) = postOrden (N x (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = postOrden (espejo d) @ postOrden (espejo i) @ [x]&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = rev (preOrden d) @ rev (preOrden i) @ rev [x]&amp;quot; using HI1 HI2 by simp&lt;br /&gt;
    also have &amp;quot;... = rev ([x] @ preOrden i @ preOrden d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis  by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que&lt;br /&gt;
     inOrden (espejo a) = rev (inOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
lemma &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;inOrden (espejo (N x i d)) = inOrden (N x (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = inOrden (espejo d) @ [x] @ inOrden (espejo i)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = rev (inOrden d) @ rev [x] @ rev (inOrden i)&amp;quot; using HI1 HI2 by simp&lt;br /&gt;
    also have &amp;quot;... = rev (inOrden i @ [x] @ inOrden d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función &lt;br /&gt;
     raiz :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (raiz a) es la raiz del árbol a. Por ejemplo, &lt;br /&gt;
     raiz (N e (N c (H a) (H d)) (N g (H f) (H h))) = e&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun raiz :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;raiz (H x)     = x&amp;quot;&lt;br /&gt;
| &amp;quot;raiz (N x i d) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;raiz (N e (N c (H a) (H d)) (N g (H f) (H h))) = e&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir la función &lt;br /&gt;
     extremo_izquierda :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (extremo_izquierda a) es el nodo más a la izquierda del árbol&lt;br /&gt;
  a. Por ejemplo,  &lt;br /&gt;
     extremo_izquierda (N e (N c (H a) (H d)) (N g (H f) (H h))) = a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun extremo_izquierda :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;extremo_izquierda (H a)      = a&amp;quot;&lt;br /&gt;
| &amp;quot;extremo_izquierda (N f x y) = (extremo_izquierda x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;extremo_izquierda (N e (N c (H a) (H d)) (N g (H f) (H h))) = a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función &lt;br /&gt;
     extremo_derecha :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (extremo_derecha a) es el nodo más a la derecha del árbol&lt;br /&gt;
  a. Por ejemplo,  &lt;br /&gt;
     extremo_derecha (N e (N c (H a) (H d)) (N g (H f) (H h))) = h&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun extremo_derecha :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;extremo_derecha (H x)     = x&amp;quot;&lt;br /&gt;
| &amp;quot;extremo_derecha (N x i d) = (extremo_derecha d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;extremo_derecha (N e (N c (H a) (H d)) (N g (H f) (H h))) = h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar&lt;br /&gt;
     last (inOrden a) = extremo_derecha a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma inOrdenNoVacio: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
  apply (induct a)&lt;br /&gt;
   apply simp_all&lt;br /&gt;
   done &lt;br /&gt;
    &lt;br /&gt;
theorem ultimoInOrden: &lt;br /&gt;
  &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;    &lt;br /&gt;
  apply (induct a)&lt;br /&gt;
   apply simp&lt;br /&gt;
  apply (simp add: inOrdenNoVacio)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a) (simp_all add: inOrdenNoVacio)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;last (inOrden (N x i d)) = last ((inOrden i)@[x]@(inOrden d))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = last (inOrden d)&amp;quot; by (simp add: inOrdenNoVacio)&lt;br /&gt;
    also have &amp;quot;... = extremo_derecha d&amp;quot; using HI2 by simp&lt;br /&gt;
    also have &amp;quot;... = extremo_derecha (N x i d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
thm inOrden.simps(2)  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar&lt;br /&gt;
     hd (inOrden a) = extremo_izquierda a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
  apply (induct a)&lt;br /&gt;
   apply simp&lt;br /&gt;
  apply (simp add: inOrdenNoVacio)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a) &lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;hd (inOrden (N x i d)) = hd((inOrden i)@[x]@(inOrden d))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = hd (inOrden i)&amp;quot; by (simp add: inOrdenNoVacio)&lt;br /&gt;
    also have &amp;quot;... = extremo_izquierda i&amp;quot; using HI1 by simp&lt;br /&gt;
    also have &amp;quot;... = extremo_izquierda (N x i d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = last (postOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;hd (preOrden (N x i d)) = hd (x#((preOrden i)@(preOrden d)))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = last ((postOrden i)@(postOrden d)@[x])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = last (postOrden (N x i d))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;hd (preOrden (N x i d)) = hd (x#((preOrden i)@(preOrden d)))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = raiz (N x i d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     hd (inOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Quickcheck found a counterexample:&lt;br /&gt;
  a = N a1 (H a2) (H a1)&lt;br /&gt;
  &lt;br /&gt;
  Evaluated terms:&lt;br /&gt;
  hd (inOrden a) = a2&lt;br /&gt;
  raiz a = a1&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar o refutar&lt;br /&gt;
     last (postOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;last (postOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;last (postOrden (N x i d)) = last ((postOrden i)@(postOrden d)@[x])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = last [x]&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = raiz (N x i d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_12&amp;diff=798</id>
		<title>Sol 12</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_12&amp;diff=798"/>
		<updated>2019-06-26T15:58:15Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R12: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R12_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que tiene información en los nodos y en las hojas. &lt;br /&gt;
  Por ejemplo, el árbol&lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
     a   d f   h &lt;br /&gt;
  se representa por &amp;quot;N e (N c (H a) (H d)) (N g (H f) (H h))&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = H &amp;quot;&amp;#039;a&amp;quot; | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;N e (N c (H a) (H d)) (N g (H f) (H h))&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función &lt;br /&gt;
     preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (preOrden a) es el recorrido pre orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     preOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [e,c,a,d,g,f,h] &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrden (H x)     = [x]&amp;quot;&lt;br /&gt;
| &amp;quot;preOrden (N x i d) = x#((preOrden i)@(preOrden d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (H a) (H d)) (N g (H f) (H h))) = [e,c,a,d,g,f,h]&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función &lt;br /&gt;
     postOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (postOrden a) es el recorrido post orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     postOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [e,c,a,d,g,f,h] &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun postOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrden (H x)     = [x]&amp;quot;&lt;br /&gt;
| &amp;quot;postOrden (N x i d) = (postOrden i)@(postOrden d)@[x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;postOrden (N e (N c (H a) (H d)) (N g (H f) (H h))) = [a,d,c,f,h,g,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     inOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (inOrden a) es el recorrido in orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     inOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [a,c,d,e,f,g,h]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun inOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inOrden (H x)     = [x]&amp;quot;&lt;br /&gt;
| &amp;quot;inOrden (N x i d) = (inOrden i)@[x]@(inOrden d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inOrden (N e (N c (H a) (H d)) (N g (H f) (H h))) = [a,c,d,e,f,g,h]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot;&lt;br /&gt;
  tal que (espejo a) es la imagen especular del árbol a. Por ejemplo, &lt;br /&gt;
     espejo (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = N e (N g (H h) (H f)) (N c (H d) (H a))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;espejo (H x)     = (H x)&amp;quot;&lt;br /&gt;
| &amp;quot;espejo (N x i d) = (N x (espejo d) (espejo i))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;espejo (N e (N c (H a) (H d)) (N g (H f) (H h))) = N e (N g (H h) (H f)) (N c (H d) (H a))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que&lt;br /&gt;
     preOrden (espejo a) = rev (postOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume HI1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N a1 a2 a3)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;preOrden (espejo (N a1 a2 a3)) = preOrden (N a1 (espejo a3) (espejo a2))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = [a1] @ preOrden (espejo a3) @ preOrden (espejo a2)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev [a1] @ rev (postOrden a3) @ rev (postOrden a2)&amp;quot; using HI1 HI2 by simp &lt;br /&gt;
    also have &amp;quot;… = rev ((postOrden a2) @ (postOrden a3) @ [a1])&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que&lt;br /&gt;
     postOrden (espejo a) = rev (preOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;postOrden (espejo (N x i d)) = postOrden (N x (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = postOrden (espejo d) @ postOrden (espejo i) @ [x]&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = rev (preOrden d) @ rev (preOrden i) @ rev [x]&amp;quot; using HI1 HI2 by simp&lt;br /&gt;
    also have &amp;quot;... = rev ([x] @ preOrden i @ preOrden d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis  by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que&lt;br /&gt;
     inOrden (espejo a) = rev (inOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
lemma &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;inOrden (espejo (N x i d)) = inOrden (N x (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = inOrden (espejo d) @ [x] @ inOrden (espejo i)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = rev (inOrden d) @ rev [x] @ rev (inOrden i)&amp;quot; using HI1 HI2 by simp&lt;br /&gt;
    also have &amp;quot;... = rev (inOrden i @ [x] @ inOrden d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función &lt;br /&gt;
     raiz :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (raiz a) es la raiz del árbol a. Por ejemplo, &lt;br /&gt;
     raiz (N e (N c (H a) (H d)) (N g (H f) (H h))) = e&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun raiz :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;raiz (H x)     = x&amp;quot;&lt;br /&gt;
| &amp;quot;raiz (N x i d) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;raiz (N e (N c (H a) (H d)) (N g (H f) (H h))) = e&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir la función &lt;br /&gt;
     extremo_izquierda :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (extremo_izquierda a) es el nodo más a la izquierda del árbol&lt;br /&gt;
  a. Por ejemplo,  &lt;br /&gt;
     extremo_izquierda (N e (N c (H a) (H d)) (N g (H f) (H h))) = a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun extremo_izquierda :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;extremo_izquierda (H a)      = a&amp;quot;&lt;br /&gt;
| &amp;quot;extremo_izquierda (N f x y) = (extremo_izquierda x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;extremo_izquierda (N e (N c (H a) (H d)) (N g (H f) (H h))) = a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función &lt;br /&gt;
     extremo_derecha :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (extremo_derecha a) es el nodo más a la derecha del árbol&lt;br /&gt;
  a. Por ejemplo,  &lt;br /&gt;
     extremo_derecha (N e (N c (H a) (H d)) (N g (H f) (H h))) = h&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun extremo_derecha :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;extremo_derecha (H x)     = x&amp;quot;&lt;br /&gt;
| &amp;quot;extremo_derecha (N x i d) = (extremo_derecha d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;extremo_derecha (N e (N c (H a) (H d)) (N g (H f) (H h))) = h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar&lt;br /&gt;
     last (inOrden a) = extremo_derecha a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma inOrdenNoVacio: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
  apply (induct a)&lt;br /&gt;
   apply simp_all&lt;br /&gt;
   done &lt;br /&gt;
    &lt;br /&gt;
theorem ultimoInOrden: &lt;br /&gt;
  &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;    &lt;br /&gt;
  apply (induct a)&lt;br /&gt;
   apply simp&lt;br /&gt;
  apply (simp add: inOrdenNoVacio)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a) (simp_all add: inOrdenNoVacio)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;last (inOrden (N x i d)) = last ((inOrden i)@[x]@(inOrden d))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = last (inOrden d)&amp;quot; by (simp add: inOrdenNoVacio)&lt;br /&gt;
    also have &amp;quot;... = extremo_derecha d&amp;quot; using HI2 by simp&lt;br /&gt;
    also have &amp;quot;... = extremo_derecha (N x i d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
thm inOrden.simps(2)  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar&lt;br /&gt;
     hd (inOrden a) = extremo_izquierda a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
  apply (induct a)&lt;br /&gt;
   apply simp&lt;br /&gt;
  apply (simp add: inOrdenNoVacio)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a) &lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;hd (inOrden (N x i d)) = hd((inOrden i)@[x]@(inOrden d))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = hd (inOrden i)&amp;quot; by (simp add: inOrdenNoVacio)&lt;br /&gt;
    also have &amp;quot;... = extremo_izquierda i&amp;quot; using HI1 by simp&lt;br /&gt;
    also have &amp;quot;... = extremo_izquierda (N x i d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = last (postOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;hd (preOrden (N x i d)) = hd (x#((preOrden i)@(preOrden d)))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = last ((postOrden i)@(postOrden d)@[x])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = last (postOrden (N x i d))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;hd (preOrden (N x i d)) = hd (x#((preOrden i)@(preOrden d)))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = raiz (N x i d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     hd (inOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Quickcheck found a counterexample:&lt;br /&gt;
  a = N a1 (H a2) (H a1)&lt;br /&gt;
  &lt;br /&gt;
  Evaluated terms:&lt;br /&gt;
  hd (inOrden a) = a2&lt;br /&gt;
  raiz a = a1&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar o refutar&lt;br /&gt;
     last (postOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;last (postOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;last (postOrden (N x i d)) = last ((postOrden i)@(postOrden d)@[x])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = last [x]&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = raiz (N x i d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_12&amp;diff=797</id>
		<title>Sol 12</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_12&amp;diff=797"/>
		<updated>2019-06-26T15:57:44Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R12: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R12_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que tiene información en los nodos y en las hojas. &lt;br /&gt;
  Por ejemplo, el árbol&lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
     a   d f   h &lt;br /&gt;
  se representa por &amp;quot;N e (N c (H a) (H d)) (N g (H f) (H h))&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = H &amp;quot;&amp;#039;a&amp;quot; | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;N e (N c (H a) (H d)) (N g (H f) (H h))&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función &lt;br /&gt;
     preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (preOrden a) es el recorrido pre orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     preOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [e,c,a,d,g,f,h] &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrden (H x)     = [x]&amp;quot;&lt;br /&gt;
| &amp;quot;preOrden (N x i d) = x#((preOrden i)@(preOrden d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (H a) (H d)) (N g (H f) (H h))) = [e,c,a,d,g,f,h]&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función &lt;br /&gt;
     postOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (postOrden a) es el recorrido post orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     postOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [e,c,a,d,g,f,h] &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun postOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrden (H x)     = [x]&amp;quot;&lt;br /&gt;
| &amp;quot;postOrden (N x i d) = (postOrden i)@(postOrden d)@[x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;postOrden (N e (N c (H a) (H d)) (N g (H f) (H h))) = [a,d,c,f,h,g,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     inOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (inOrden a) es el recorrido in orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     inOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [a,c,d,e,f,g,h]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun inOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inOrden (H x)     = [x]&amp;quot;&lt;br /&gt;
| &amp;quot;inOrden (N x i d) = (inOrden i)@[x]@(inOrden d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inOrden (N e (N c (H a) (H d)) (N g (H f) (H h))) = [a,c,d,e,f,g,h]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot;&lt;br /&gt;
  tal que (espejo a) es la imagen especular del árbol a. Por ejemplo, &lt;br /&gt;
     espejo (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = N e (N g (H h) (H f)) (N c (H d) (H a))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;espejo (H x)     = (H x)&amp;quot;&lt;br /&gt;
| &amp;quot;espejo (N x i d) = (N x (espejo d) (espejo i))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;espejo (N e (N c (H a) (H d)) (N g (H f) (H h))) = N e (N g (H h) (H f)) (N c (H d) (H a))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que&lt;br /&gt;
     preOrden (espejo a) = rev (postOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a1 a2 a3&lt;br /&gt;
  assume HI1: &amp;quot;?P a2&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P a3&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N a1 a2 a3)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;preOrden (espejo (N a1 a2 a3)) = preOrden (N a1 (espejo a3) (espejo a2))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = [a1] @ preOrden (espejo a3) @ preOrden (espejo a2)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev [a1] @ rev (postOrden a3) @ rev (postOrden a2)&amp;quot; using HI1 HI2 by simp &lt;br /&gt;
    also have &amp;quot;… = rev ((postOrden a2) @ (postOrden a3) @ [a1])&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que&lt;br /&gt;
     postOrden (espejo a) = rev (preOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;postOrden (espejo (N x i d)) = postOrden (N x (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = postOrden (espejo d) @ postOrden (espejo i) @ [x]&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = rev (preOrden d) @ rev (preOrden i) @ rev [x]&amp;quot; using HI1 HI2 by simp&lt;br /&gt;
    also have &amp;quot;... = rev ([x] @ preOrden i @ preOrden d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis  by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que&lt;br /&gt;
     inOrden (espejo a) = rev (inOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
lemma &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;inOrden (espejo (N x i d)) = inOrden (N x (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = inOrden (espejo d) @ [x] @ inOrden (espejo i)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = rev (inOrden d) @ rev [x] @ rev (inOrden i)&amp;quot; using HI1 HI2 by simp&lt;br /&gt;
    also have &amp;quot;... = rev (inOrden i @ [x] @ inOrden d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función &lt;br /&gt;
     raiz :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (raiz a) es la raiz del árbol a. Por ejemplo, &lt;br /&gt;
     raiz (N e (N c (H a) (H d)) (N g (H f) (H h))) = e&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun raiz :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;raiz (H x)     = x&amp;quot;&lt;br /&gt;
| &amp;quot;raiz (N x i d) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;raiz (N e (N c (H a) (H d)) (N g (H f) (H h))) = e&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir la función &lt;br /&gt;
     extremo_izquierda :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (extremo_izquierda a) es el nodo más a la izquierda del árbol&lt;br /&gt;
  a. Por ejemplo,  &lt;br /&gt;
     extremo_izquierda (N e (N c (H a) (H d)) (N g (H f) (H h))) = a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun extremo_izquierda :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;extremo_izquierda (H a)      = a&amp;quot;&lt;br /&gt;
| &amp;quot;extremo_izquierda (N f x y) = (extremo_izquierda x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;extremo_izquierda (N e (N c (H a) (H d)) (N g (H f) (H h))) = a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función &lt;br /&gt;
     extremo_derecha :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (extremo_derecha a) es el nodo más a la derecha del árbol&lt;br /&gt;
  a. Por ejemplo,  &lt;br /&gt;
     extremo_derecha (N e (N c (H a) (H d)) (N g (H f) (H h))) = h&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun extremo_derecha :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;extremo_derecha (H x)     = x&amp;quot;&lt;br /&gt;
| &amp;quot;extremo_derecha (N x i d) = (extremo_derecha d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;extremo_derecha (N e (N c (H a) (H d)) (N g (H f) (H h))) = h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar&lt;br /&gt;
     last (inOrden a) = extremo_derecha a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma inOrdenNoVacio: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
  apply (induct a)&lt;br /&gt;
   apply simp_all&lt;br /&gt;
   done &lt;br /&gt;
    &lt;br /&gt;
theorem ultimoInOrden: &lt;br /&gt;
  &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;    &lt;br /&gt;
  apply (induct a)&lt;br /&gt;
   apply simp&lt;br /&gt;
  apply (simp add: inOrdenNoVacio)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a) (simp_all add: inOrdenNoVacio)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;last (inOrden (N x i d)) = last ((inOrden i)@[x]@(inOrden d))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = last (inOrden d)&amp;quot; by (simp add: inOrdenNoVacio)&lt;br /&gt;
    also have &amp;quot;... = extremo_derecha d&amp;quot; using HI2 by simp&lt;br /&gt;
    also have &amp;quot;... = extremo_derecha (N x i d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
thm inOrden.simps(2)  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar&lt;br /&gt;
     hd (inOrden a) = extremo_izquierda a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
  apply (induct a)&lt;br /&gt;
   apply simp&lt;br /&gt;
  apply (simp add: inOrdenNoVacio)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a) &lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;hd (inOrden (N x i d)) = hd((inOrden i)@[x]@(inOrden d))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = hd (inOrden i)&amp;quot; by (simp add: inOrdenNoVacio)&lt;br /&gt;
    also have &amp;quot;... = extremo_izquierda i&amp;quot; using HI1 by simp&lt;br /&gt;
    also have &amp;quot;... = extremo_izquierda (N x i d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = last (postOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;hd (preOrden (N x i d)) = hd (x#((preOrden i)@(preOrden d)))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = last ((postOrden i)@(postOrden d)@[x])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = last (postOrden (N x i d))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;hd (preOrden (N x i d)) = hd (x#((preOrden i)@(preOrden d)))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = raiz (N x i d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     hd (inOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Quickcheck found a counterexample:&lt;br /&gt;
  a = N a1 (H a2) (H a1)&lt;br /&gt;
  &lt;br /&gt;
  Evaluated terms:&lt;br /&gt;
  hd (inOrden a) = a2&lt;br /&gt;
  raiz a = a1&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar o refutar&lt;br /&gt;
     last (postOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;last (postOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;last (postOrden (N x i d)) = last ((postOrden i)@(postOrden d)@[x])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = last [x]&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = raiz (N x i d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/isabelle&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_11&amp;diff=796</id>
		<title>Sol 11</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_11&amp;diff=796"/>
		<updated>2019-06-26T15:56:15Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
chapter {* R11: Razonamiento sobre programas en Isabelle/HOL *}&lt;br /&gt;
 &lt;br /&gt;
theory R11_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
   En toda la relación de ejercicios las demostraciones han de realizarse&lt;br /&gt;
   de las formas siguientes:&lt;br /&gt;
    (*) detallada&lt;br /&gt;
    (*) estructurada&lt;br /&gt;
    (*) aplicativa&lt;br /&gt;
    (*) automática&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: nat ⇒ nat&lt;br /&gt;
  tal que &lt;br /&gt;
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaPotenciasDeDosMasUno 3  =  16&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot;&lt;br /&gt;
| &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
      sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;sumaPotenciasDeDosMasUno 3&amp;quot; ― ‹= 16›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que &lt;br /&gt;
     sumaPotenciasDeDosMasUno n = 2^(n+1)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma sumaPotenciasDeDosMasUno_d: &lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;sumaPotenciasDeDosMasUno 0 = 2^(0+1)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n &lt;br /&gt;
  assume HI: &amp;quot;sumaPotenciasDeDosMasUno n = 2 ^ (n + 1)&amp;quot;&lt;br /&gt;
  show &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = 2 ^ (Suc n + 1)&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
      have &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;... = 2 ^ (n + 1) + 2^(n+1)&amp;quot; using HI by simp&lt;br /&gt;
      also have &amp;quot;... = 2 ^ (Suc n + 1)&amp;quot; by simp&lt;br /&gt;
      finally show ?thesis .&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma sumaPotenciasDeDosMasUno_e: &lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma sumaPotenciasDeDosMasUno_a: &lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  apply (induct n)&lt;br /&gt;
   apply simp_all&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma sumaPotenciasDeDosMasUno_auto: &lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
 by (induct n) simp_all&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     copia :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (copia n x) es la lista formado por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     copia 3 x = [x,x,x]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun copia :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia 0 x       = []&amp;quot;&lt;br /&gt;
| &amp;quot;copia (Suc n) x = x # copia n x&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;copia 3 x&amp;quot; ― ‹= [x,x,x]›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&lt;br /&gt;
     todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&lt;br /&gt;
  Nota: La conjunción se representa por ∧&lt;br /&gt;
  ----------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos p (x#xs) = (p x ∧ todos p xs)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(1::nat)) [2,6,4]&amp;quot; ― ‹= True›&lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(2::nat)) [2,6,4]&amp;quot; ― ‹= False›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar que todos los elementos de (copia n x) son&lt;br /&gt;
  iguales a x. &lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
lemma todos_copia_d: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  proof (induct n)&lt;br /&gt;
  show &amp;quot;todos (λy. y = x) (copia 0 x)&amp;quot; by simp&lt;br /&gt;
 next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;todos (λy. y = x) (copia n x)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λy. y = x) (copia (Suc n) x) =&lt;br /&gt;
  todos (λy. y = x) (x # copia n x)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (x = x ∧ todos (λy. y = x) (copia n x))&amp;quot;&lt;br /&gt;
  by simp&lt;br /&gt;
  also have &amp;quot;... = True&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos (λy. y = x) (copia (Suc n) x)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
lemma todos_copia_e: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
lemma todos_copia_a: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  apply (induct n)    &lt;br /&gt;
  apply simp_all&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma todos_copia_auto: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  by (induct n) simp_all&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
    factR :: nat ⇒ nat&lt;br /&gt;
  tal que (factR n) es el factorial de n. Por ejemplo,&lt;br /&gt;
    factR 4 = 24&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun factR :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factR 0 = 1&amp;quot;&lt;br /&gt;
| &amp;quot;factR (Suc n) = Suc n * factR n&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;factR 4&amp;quot; ― ‹= 24›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Se considera la siguiente definición iterativa de la&lt;br /&gt;
  función factorial &lt;br /&gt;
     factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI n = factI&amp;#039; n 1&lt;br /&gt;
 &lt;br /&gt;
     factI&amp;#039; :: nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI&amp;#039; 0       x = x&lt;br /&gt;
     factI&amp;#039; (Suc n) x = factI&amp;#039; n (Suc n)*x&lt;br /&gt;
  Demostrar que, para todo n y todo x, se tiene &lt;br /&gt;
     factI&amp;#039; n x = x * factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun factI&amp;#039; :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI&amp;#039; 0       x = x&amp;quot;&lt;br /&gt;
| &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (x* (Suc n))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
fun factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI n = factI&amp;#039; n 1&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
lemma fact_d: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
proof (induct n arbitrary: x)&lt;br /&gt;
  show &amp;quot;⋀x. factI&amp;#039; 0 x = x * factR 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix  n&lt;br /&gt;
  assume HI: &amp;quot;⋀x. factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
  show &amp;quot;⋀x. factI&amp;#039; (Suc n) x = x * factR (Suc n)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
  fix x&lt;br /&gt;
  have &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (x * (Suc n))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (x * (Suc n)) * factR n&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = x * ((Suc n) * factR n)&amp;quot; by (simp only: mult.assoc)&lt;br /&gt;
  also have &amp;quot;... = x * factR (Suc n)&amp;quot; by simp                   &lt;br /&gt;
  finally show &amp;quot;factI&amp;#039; (Suc n) x = x * factR (Suc n)&amp;quot; by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma fact_e: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
thm mult_Suc&lt;br /&gt;
thm mult.assoc  &lt;br /&gt;
  &lt;br /&gt;
lemma fact_a: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
  apply (induct n arbitrary: x)  &lt;br /&gt;
   apply simp&lt;br /&gt;
  apply (simp del: mult_Suc)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma fact_auto: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
by (induct n arbitrary: x) (auto simp del: mult_Suc)&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que&lt;br /&gt;
     factI n = factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
corollary fact_equiv: &amp;quot;factI n = factR n&amp;quot;&lt;br /&gt;
by (simp add: fact_a)&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir, recursivamente y sin usar (@), la función&lt;br /&gt;
     amplia :: &amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al&lt;br /&gt;
  final de la lista xs. Por ejemplo,&lt;br /&gt;
     amplia [d,a] t = [d,a,t]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;amplia []     y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;amplia (x#xs) y = x # amplia xs y&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;amplia [d,a] t&amp;quot; ― ‹= [d,a,t]›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que &lt;br /&gt;
     amplia xs y = xs @ [y]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
lemma amplia_append_d: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  proof (induct xs)&lt;br /&gt;
  show &amp;quot;amplia [] y = [] @ [y]&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  have &amp;quot;amplia (x # xs) y = x # amplia xs y&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x # (xs @ [y])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (x # xs) @ [y]&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;amplia (x # xs) y = (x # xs) @ [y]&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma amplia_append_e: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
lemma amplia_append_a: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
   apply (induct xs)    &lt;br /&gt;
   apply simp_all&lt;br /&gt;
    done&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
lemma amplia_append_auto: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  by (induct xs) simp_all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun algunos  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;algunos p [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;algunos p (x#xs) = ((p x) ∨ (algunos p xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar&lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
    &lt;br /&gt;
  &lt;br /&gt;
lemma conjCommuta4: &amp;quot;a ∧ b ∧ c ∧ d ⟷ a ∧ c ∧ b ∧ d&amp;quot;    &lt;br /&gt;
  apply (rule iffI)&lt;br /&gt;
   apply (rule conjI)&lt;br /&gt;
    apply (erule conjunct1)&lt;br /&gt;
   apply (rule conjI)&lt;br /&gt;
    apply (drule conjunct2)&lt;br /&gt;
    apply (drule conjunct2)&lt;br /&gt;
    apply (erule conjunct1) &lt;br /&gt;
   apply (drule conjunct2)&lt;br /&gt;
   apply (frule conjunct1)&lt;br /&gt;
   apply (drule conjunct2)+&lt;br /&gt;
    apply (rule conjI, assumption+)&lt;br /&gt;
  apply auto&lt;br /&gt;
    done&lt;br /&gt;
&lt;br /&gt;
lemma todos_conj_d: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_conj_e: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos (λx. P x ∧ Q x) [] = (todos P [] ∧ todos Q [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos (λx. P x ∧ Q x) (a # xs) = (todos P (a # xs) ∧ todos Q (a # xs))&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
thm mult_Suc&lt;br /&gt;
thm mult.assoc  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
lemma todos_conj_a: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  apply (induct xs) &lt;br /&gt;
  apply simp&lt;br /&gt;
  apply simp&lt;br /&gt;
  apply (simp add: conjCommuta4)&lt;br /&gt;
    done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma todos_conj_auto: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
    by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar&lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma todos_append_d: &amp;quot;todos P (xs @ ys) = (todos P xs ∧ todos P ys)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos P ([] @ ys) = (todos P [] ∧ todos P ys)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;todos P (xs @ ys) = (todos P xs ∧ todos P ys)&amp;quot;&lt;br /&gt;
  show &amp;quot;todos P ((a # xs) @ ys) = (todos P (a # xs) ∧ todos P ys)&amp;quot; &lt;br /&gt;
    proof -&lt;br /&gt;
      have &amp;quot;todos P ((a#xs) @ ys) = ((P a) ∧ todos P (xs@ys))&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;... = ((P a) ∧ todos P xs ∧ todos P ys)&amp;quot; using HI by simp&lt;br /&gt;
      also have &amp;quot;... = (todos P (a#xs) ∧ todos P ys)&amp;quot; by simp&lt;br /&gt;
      finally show ?thesis .&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma todos_append_e: &amp;quot;todos P (xs @ ys) = (todos P xs ∧ todos P ys)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos P ([] @ ys) = (todos P [] ∧ todos P ys)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume &amp;quot;todos P (xs @ ys) = (todos P xs ∧ todos P ys)&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos P ((a # xs) @ ys) = (todos P (a # xs) ∧ todos P ys)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma todos_append_a: &amp;quot;todos P (xs @ ys) = (todos P xs ∧ todos P ys)&amp;quot;&lt;br /&gt;
apply (induct xs)&lt;br /&gt;
apply simp_all&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
lemma todos_append_auto: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
by (induct x) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar&lt;br /&gt;
     todos P (rev xs) = todos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma todos_rev_d: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos P (rev []) = todos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  show &amp;quot;todos P (rev (a # xs)) = todos P (a # xs)&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
      have &amp;quot;todos P (rev (a#xs)) = todos P ((rev xs)@[a])&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;... = (todos P (rev xs) ∧ todos P [a])&amp;quot;&lt;br /&gt;
        by (simp add: todos_append_a)&lt;br /&gt;
      also have &amp;quot;... = (todos P xs ∧ todos P [a])&amp;quot; using HI by simp&lt;br /&gt;
      also have &amp;quot;... = (todos P [a] ∧ todos P xs)&amp;quot; by auto&lt;br /&gt;
      also have &amp;quot;... = (P a ∧ todos P xs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;... = todos P (a#xs)&amp;quot; by simp&lt;br /&gt;
      finally show ?thesis .&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma todos_rev_e: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos P (rev []) = todos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;todos P (rev (a#xs)) = todos P (a#xs)&amp;quot;&lt;br /&gt;
    by (auto simp add: todos_append_a)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma todos_rev_a: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_rev_auto: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: todos_append_a)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar:&lt;br /&gt;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma algunos_map_d: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (map f []) = algunos (P o f) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
  show &amp;quot;algunos P (map f (a#xs)) = algunos (P o f) (a#xs)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;algunos P (map f (a#xs)) = algunos P ((f a)#(map f xs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = ((P (f a)) ∨ (algunos P (map f xs)))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (((P o f) a) ∨ (algunos (P o f) xs))&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = algunos (P o f) (a#xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma algunos_map_e: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (map f []) = algunos (P o f) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;algunos P (map f (a#xs)) = algunos (P o f) (a#xs)&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
thm algunos.simps&lt;br /&gt;
&lt;br /&gt;
lemma algunos_map_a: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
  apply (induct xs)&lt;br /&gt;
   apply simp_all&lt;br /&gt;
    done&lt;br /&gt;
  &lt;br /&gt;
thm conj_commute&lt;br /&gt;
    &lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
lemma algunos_map_auto: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
by (induct xs) simp_all&lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar o refutar&lt;br /&gt;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma algunos_append_d: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P ([] @ ys) = (algunos P [] ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
  show &amp;quot;algunos P ((a#xs) @ ys) = (algunos P (a#xs) ∨ algunos P ys)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;algunos P ((a#xs) @ ys) = algunos P (a#(xs @ ys))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = ((P a) ∨ algunos P (xs @ ys))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = ((P a) ∨ algunos P xs ∨ algunos P ys)&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (algunos P (a#xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
thm Fun.comp_apply&lt;br /&gt;
  &lt;br /&gt;
lemma algunos_append_e: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P ([] @ ys) = (algunos P [] ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
  thus &amp;quot;algunos P ((a#xs) @ ys) = (algunos P (a#xs) ∨ algunos P ys)&amp;quot;&lt;br /&gt;
    by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma algunos_append_a: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_append_auto: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
by (induct xs) simp_all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar&lt;br /&gt;
     algunos P (rev xs) = algunos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma algunos_rev_d: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (rev []) = algunos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  show &amp;quot;algunos P (rev (a#xs)) = algunos P (a#xs)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;algunos P (rev (a#xs)) = algunos P ((rev xs) @ [a])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (algunos P (rev xs) ∨ algunos P [a])&amp;quot;&lt;br /&gt;
      by (simp add: algunos_append_auto)&lt;br /&gt;
    also have &amp;quot;... = (algunos P xs ∨ algunos P [a])&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = (algunos P xs ∨ P a)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (P a ∨ algunos P xs)&amp;quot; by (rule disj_commute)&lt;br /&gt;
    also have &amp;quot;... = algunos P (a#xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma algunos_rev_e: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (rev []) = algunos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;algunos P (rev (a#xs)) = algunos P (a#xs)&amp;quot;&lt;br /&gt;
    by (auto simp add: algunos_append_auto)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma algunos_rev_a: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  apply (induct xs)&lt;br /&gt;
   apply simp&lt;br /&gt;
   apply (simp add: algunos_append_auto)&lt;br /&gt;
  apply (simp add: disj_commute)&lt;br /&gt;
   done &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma algunos_rev_auto: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: algunos_append_auto)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  y demostrar la equivalencia de forma automática y detallada.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
  apply (induct xs)&lt;br /&gt;
   apply simp&lt;br /&gt;
  apply simp&lt;br /&gt;
    by auto&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨algunos Q xs)&amp;quot;&lt;br /&gt;
  proof (induct xs) &lt;br /&gt;
    show &amp;quot;algunos (λx. P x ∨ Q x) [] = (algunos P []∨ algunos Q [])&amp;quot; by simp&lt;br /&gt;
   next&lt;br /&gt;
     fix a xs&lt;br /&gt;
     assume &amp;quot;algunos (λx. (P x ∨ Q x)) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
     thus &amp;quot;algunos (λx. P x ∨ Q x) (a#xs) = (algunos P(a#xs) ∨ algunos Q (a#xs))&amp;quot;&lt;br /&gt;
        by auto&lt;br /&gt;
    qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar o refutar&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma algunos_no_todos_d: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P [] = (¬ todos (λx. ¬ P x) [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P xs = (¬ todos (λx. ¬ P x) xs)&amp;quot;&lt;br /&gt;
  show &amp;quot;algunos P (a # xs) = (¬ todos (λx. ¬ P x) (a # xs))&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
      have &amp;quot;algunos P (a # xs) = ((P a) ∨ (algunos P xs))&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;... = ((P a) ∨ (¬ todos (λx. ¬ P x) xs))&amp;quot; using HI by simp&lt;br /&gt;
      also have &amp;quot;... = (¬ (¬ (P a) ∧ todos (λx. (¬ P x)) xs))&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;... = (¬ todos (λx. (¬ P x)) (a#xs))&amp;quot; by simp&lt;br /&gt;
      finally show ?thesis .&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma algunos_no_todos_e: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_no_todos_a: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_no_todos_auto: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
by (induct xs) simp_all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Definir la función&lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;estaEn x [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a#xs) = (x=a ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  Demostrar dicha relación de forma automática y detallada.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_algunos_auto:&lt;br /&gt;
&amp;quot;estaEn y xs = algunos (λx. y=x) xs&amp;quot;&lt;br /&gt;
  by (induct xs) simp_all&lt;br /&gt;
   &lt;br /&gt;
lemma estaEn_algunos_a:&lt;br /&gt;
&amp;quot;estaEn y xs = algunos (λx. y=x) xs&amp;quot;    &lt;br /&gt;
  apply (induct xs)&lt;br /&gt;
   apply simp&lt;br /&gt;
  apply simp&lt;br /&gt;
    done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_algunos_e:&lt;br /&gt;
&amp;quot;estaEn y xs = algunos (λ x. y=x) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn y [] = algunos (λ x. y=x) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume &amp;quot;estaEn y xs = algunos (λ x. y=x) xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;estaEn y (a#xs) = algunos (λ x. y=x) (a#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Definir la función&lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;sinDuplicados [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (a#xs) = ((¬ estaEn a xs) ∧ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Definir la función&lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida &lt;br /&gt;
  remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
&amp;quot;borraDuplicados [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (a#xs) = (if estaEn a xs&lt;br /&gt;
  then borraDuplicados xs&lt;br /&gt;
  else (a#borraDuplicados xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar o refutar&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma length_borraDuplicados_d:&lt;br /&gt;
&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados []) ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  show &amp;quot;length (borraDuplicados (a#xs)) ≤ length (a#xs)&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume &amp;quot;estaEn a xs&amp;quot;&lt;br /&gt;
    hence &amp;quot;length (borraDuplicados (a#xs)) = length (borraDuplicados xs)&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;... ≤ length xs&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... ≤ length (a#xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;(¬ estaEn a xs)&amp;quot;&lt;br /&gt;
    hence &amp;quot;length (borraDuplicados (a#xs)) = length (a#(borraDuplicados xs))&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + length (borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... ≤ 1 + length xs&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... = length (a#xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma length_borraDuplicados_e:&lt;br /&gt;
&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;length (borraDuplicados [])  ≤ length []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;length (borraDuplicados (a#xs)) ≤ length (a#xs)&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume &amp;quot;estaEn a xs&amp;quot;&lt;br /&gt;
    thus &amp;quot;length (borraDuplicados (a#xs)) ≤ length (a#xs)&amp;quot;&lt;br /&gt;
      using HI by auto&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;(¬ estaEn a xs)&amp;quot;&lt;br /&gt;
    thus &amp;quot;length (borraDuplicados (a#xs)) ≤ length (a#xs)&amp;quot;&lt;br /&gt;
      using HI by auto&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma length_borraDuplicados_a:&lt;br /&gt;
&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma length_borraDuplicados_auto:&lt;br /&gt;
&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
by (induct xs) simp_all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar o refutar&lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_borraDuplicados_d:&lt;br /&gt;
&amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados []) = estaEn a []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix b xs&lt;br /&gt;
  assume HI: &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados (b#xs)) = estaEn a (b#xs)&amp;quot;&lt;br /&gt;
  proof (rule iffI)&lt;br /&gt;
    assume c1: &amp;quot;estaEn a (borraDuplicados (b#xs))&amp;quot;&lt;br /&gt;
    show &amp;quot;estaEn a (b#xs)&amp;quot;&lt;br /&gt;
    proof (cases)&lt;br /&gt;
      assume &amp;quot;estaEn b xs&amp;quot;&lt;br /&gt;
      thus &amp;quot;estaEn a (b#xs)&amp;quot; using c1 HI by auto&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;¬ estaEn b xs&amp;quot;&lt;br /&gt;
      thus &amp;quot;estaEn a (b#xs)&amp;quot; using c1 HI by auto&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    assume c2: &amp;quot;estaEn a (b#xs)&amp;quot;&lt;br /&gt;
    show &amp;quot;estaEn a (borraDuplicados (b#xs))&amp;quot;&lt;br /&gt;
    proof (cases)&lt;br /&gt;
      assume &amp;quot;a=b&amp;quot;&lt;br /&gt;
      thus &amp;quot;estaEn a (borraDuplicados (b#xs))&amp;quot; using HI by auto&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;a ≠ b&amp;quot;&lt;br /&gt;
      thus &amp;quot;estaEn a (borraDuplicados (b#xs))&amp;quot; using `a ≠ b` c2 HI by auto&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_borraDuplicados_e:&lt;br /&gt;
&amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados []) = estaEn a []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix b xs&lt;br /&gt;
  assume HI: &amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
  show &amp;quot;estaEn a (borraDuplicados (b#xs)) = estaEn a (b#xs)&amp;quot;&lt;br /&gt;
  proof (rule iffI)&lt;br /&gt;
    assume c1: &amp;quot;estaEn a (borraDuplicados (b#xs))&amp;quot;&lt;br /&gt;
    show &amp;quot;estaEn a (b#xs)&amp;quot;&lt;br /&gt;
    proof (cases)&lt;br /&gt;
      assume &amp;quot;estaEn b xs&amp;quot;&lt;br /&gt;
      thus &amp;quot;estaEn a (b#xs)&amp;quot; using c1 HI by auto&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;¬ estaEn b xs&amp;quot;&lt;br /&gt;
      thus &amp;quot;estaEn a (b#xs)&amp;quot; using c1 HI by auto&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    assume c2: &amp;quot;estaEn a (b#xs)&amp;quot;&lt;br /&gt;
    show &amp;quot;estaEn a (borraDuplicados (b#xs))&amp;quot;&lt;br /&gt;
    proof (cases)&lt;br /&gt;
      assume &amp;quot;a=b&amp;quot;&lt;br /&gt;
      thus &amp;quot;estaEn a (borraDuplicados (b#xs))&amp;quot; using HI by auto&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;a ≠ b&amp;quot;&lt;br /&gt;
      thus &amp;quot;estaEn a (borraDuplicados (b#xs))&amp;quot; using `a ≠ b` c2 HI by auto&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_borraDuplicados_a:&lt;br /&gt;
&amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_borraDuplicados_auto:&lt;br /&gt;
&amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar o refutar&lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma sinDuplicados_borraDuplicados_d:&lt;br /&gt;
&amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;sinDuplicados (borraDuplicados [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
  show &amp;quot;sinDuplicados (borraDuplicados (a#xs))&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume &amp;quot;estaEn a xs&amp;quot;&lt;br /&gt;
    thus &amp;quot;sinDuplicados (borraDuplicados (a#xs))&amp;quot; using HI by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬ estaEn a xs&amp;quot;&lt;br /&gt;
    hence &amp;quot;¬ (estaEn a xs) ∧ sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
      using HI by simp&lt;br /&gt;
    hence &amp;quot;¬ estaEn a (borraDuplicados xs) ∧ sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
      by (simp add: estaEn_borraDuplicados_auto)&lt;br /&gt;
    hence &amp;quot;sinDuplicados (a#borraDuplicados xs)&amp;quot; by simp&lt;br /&gt;
    thus &amp;quot;sinDuplicados (borraDuplicados (a#xs))&amp;quot;&lt;br /&gt;
      using `¬ estaEn a xs` by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma sinDuplicados_borraDuplicados_e:&lt;br /&gt;
&amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;sinDuplicados (borraDuplicados [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
  show &amp;quot;sinDuplicados (borraDuplicados (a#xs))&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume &amp;quot;estaEn a xs&amp;quot;&lt;br /&gt;
    thus &amp;quot;sinDuplicados (borraDuplicados (a#xs))&amp;quot; using HI by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬ estaEn a xs&amp;quot;&lt;br /&gt;
    thus &amp;quot;sinDuplicados (borraDuplicados (a#xs))&amp;quot;&lt;br /&gt;
      using `¬ estaEn a xs` HI by (auto simp add: estaEn_borraDuplicados_auto)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma sinDuplicados_borraDuplicados_a:&lt;br /&gt;
&amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma sinDuplicados_borraDuplicados_auto:&lt;br /&gt;
&amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: estaEn_borraDuplicados_auto)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 28. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_10&amp;diff=795</id>
		<title>Sol 10</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_10&amp;diff=795"/>
		<updated>2019-06-26T15:55:21Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
chapter {* R10: Programación funcional en Isabelle/HOL *}&lt;br /&gt;
 &lt;br /&gt;
theory R10_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
 &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: nat ⇒ nat&lt;br /&gt;
  tal que &lt;br /&gt;
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaPotenciasDeDosMasUno 3  =  16&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot;&lt;br /&gt;
| &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
      sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;sumaPotenciasDeDosMasUno 3&amp;quot; ― ‹= 16›&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Se considera la siguiente definición iterativa de la&lt;br /&gt;
  función factorial &lt;br /&gt;
     factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI n = factI&amp;#039; n 1&lt;br /&gt;
 &lt;br /&gt;
     factI&amp;#039; :: nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI&amp;#039; 0       x = x&lt;br /&gt;
     factI&amp;#039; (Suc n) x = factI&amp;#039; n (Suc n)*x&lt;br /&gt;
&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun factI&amp;#039; :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI&amp;#039; 0       x = x&amp;quot;&lt;br /&gt;
| &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (x* (Suc n))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
fun factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI n = factI&amp;#039; n 1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;factI 4&amp;quot; ― ‹= 24›&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir, recursivamente y sin usar (@), la función&lt;br /&gt;
     amplia :: &amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al&lt;br /&gt;
  final de la lista xs. Por ejemplo,&lt;br /&gt;
     amplia [d,a] t = [d,a,t]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;amplia []     y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;amplia (x#xs) y = x # amplia xs y&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;amplia [d,a] t&amp;quot; ― ‹= [d,a,t]›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&lt;br /&gt;
     todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&lt;br /&gt;
  Nota: La conjunción se representa por ∧&lt;br /&gt;
  ----------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos p (x#xs) = (p x ∧ todos p xs)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(1::nat)) [2,6,4]&amp;quot; ― ‹= True›&lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(2::nat)) [2,6,4]&amp;quot; ― ‹= False›&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun algunos  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;algunos p [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;algunos p (x#xs) = ((p x) ∨ (algunos p xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir recursivamente la función &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;estaEn x [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a#xs) = (x=a ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir recursivamemte la función&lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;sinDuplicados [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (a#xs) = ((¬ estaEn a xs) ∧ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la recursivamente la función&lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida &lt;br /&gt;
  remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
&amp;quot;borraDuplicados [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (a#xs) = (if estaEn a xs&lt;br /&gt;
  then borraDuplicados xs&lt;br /&gt;
  else (a#borraDuplicados xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=794</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=794"/>
		<updated>2019-06-26T15:54:24Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-18/ejercicios/ejercicios-LMF-2018-19.pdf libro de ejercicios].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]] y [[Sol 9 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R10.thy Programación funcional en Isabelle (2)] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]  y [[Sol 10 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]  y [[Sol 11 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R12.thy Recorridos de árboles en Isabelle/HOL] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]  y [[Sol 12 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R13.thy Definiciones inductivas: clausuras] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]  y [[Sol 13 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R14.thy Desarrollo de teorías axiomáticas] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]  y [[Sol 14 | una solución]]).&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_9&amp;diff=793</id>
		<title>Sol 9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_9&amp;diff=793"/>
		<updated>2019-06-26T15:53:13Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R9 Programación funcional en Isabelle *}&lt;br /&gt;
&lt;br /&gt;
theory R9_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 0. Definir, por recursión, la función&lt;br /&gt;
     factorial :: nat ⇒ nat&lt;br /&gt;
  tal que (factorial n) es el factorial de n. Por ejemplo,&lt;br /&gt;
     factorial 4 = 24&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fun factorial :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
 &amp;quot;factorial 0 = 1&amp;quot;&lt;br /&gt;
 |&amp;quot; factorial (Suc m) = (Suc m)*(factorial m)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* value &amp;quot;factorial (4::nat)&amp;quot;*)&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Definir, por recursión, la función&lt;br /&gt;
     longitud :: &amp;#039;a list ⇒ nat&lt;br /&gt;
  tal que (longitud xs) es la longitud de la listas xs. Por ejemplo,&lt;br /&gt;
     longitud [4,2,5] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
fun longitud :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;longitud []     = 0&amp;quot;&lt;br /&gt;
| &amp;quot;longitud (x#xs) = 1 + longitud xs&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
value &amp;quot;longitud [a,b,c]&amp;quot; ― ‹= 3› &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     fun intercambia :: &amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&lt;br /&gt;
  tal que (intercambia p) es el par obtenido intercambiando las&lt;br /&gt;
  componentes del par p. Por ejemplo,&lt;br /&gt;
     intercambia (u,v) = (v,u)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun intercambia :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;intercambia (x,y) = (y,x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;intercambia (u,v)&amp;quot; ― ‹= (v,u)›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir, por recursión, la función&lt;br /&gt;
     inversa :: &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (inversa xs) es la lista obtenida invirtiendo el orden de los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     inversa [a,d,c] = [c,d,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversa :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;inversa (x#xs) = inversa xs @ [x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa [a,d,c]&amp;quot; ― ‹= [c,d,a]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     repite :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (repite n x) es la lista formada por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     repite 3 a = [a,a,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun repite :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite 0 x       = []&amp;quot;&lt;br /&gt;
| &amp;quot;repite (Suc n) x = x # (repite n x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;repite 3 a&amp;quot; ― ‹= [a,a,a]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     conc :: &amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (conc xs ys) es la concatención de las listas xs e ys. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     conc [a,d] [b,d,a,c] = [a,d,b,d,a,c]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun conc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc []     ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;conc (x#xs) ys = x # (conc xs ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc [a,d] [b,d,a,c]&amp;quot; ― ‹= [a,d,b,d,a,c]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     coge :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (coge n xs) es la lista de los n primeros elementos de xs. Por &lt;br /&gt;
  ejemplo, &lt;br /&gt;
     coge 2 [a,c,d,b,e] = [a,c]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge n []           = []&amp;quot;&lt;br /&gt;
| &amp;quot;coge 0 xs           = []&amp;quot;&lt;br /&gt;
| &amp;quot;coge (Suc n) (x#xs) = x # (coge n xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge 2 [a,c,d,b,e]&amp;quot; ― ‹= [a,c]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     elimina :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
  elementos de xs. Por ejemplo, &lt;br /&gt;
     elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n []           = []&amp;quot;&lt;br /&gt;
| &amp;quot;elimina 0 xs           = xs&amp;quot;&lt;br /&gt;
| &amp;quot;elimina (Suc n) (x#xs) = elimina n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina 2 [a,c,d,b,e]&amp;quot; ― ‹= [d,b,e]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la función&lt;br /&gt;
     esVacia :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (esVacia xs) se verifica si xs es la lista vacía. Por ejemplo,&lt;br /&gt;
     esVacia []  = True&lt;br /&gt;
     esVacia [1] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun esVacia :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;esVacia (x#xs) = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
value &amp;quot;esVacia []&amp;quot;  ― ‹= True›&lt;br /&gt;
value &amp;quot;esVacia [1]&amp;quot; ― ‹= False›&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función&lt;br /&gt;
     inversaAc :: &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (inversaAc xs) es a inversa de xs calculada usando&lt;br /&gt;
  acumuladores. Por ejemplo, &lt;br /&gt;
     inversaAc [a,c,b,e] = [e,b,c,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversaAcAux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux [] ys     = ys&amp;quot;&lt;br /&gt;
| &amp;quot;inversaAcAux (x#xs) ys = inversaAcAux xs (x#ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc xs = inversaAcAux xs []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc [a,c,b,e]&amp;quot; ― ‹= [e,b,c,a]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir la función&lt;br /&gt;
     sum :: nat list ⇒ nat&lt;br /&gt;
  tal que (sum xs) es la suma de los elementos de xs. Por ejemplo,&lt;br /&gt;
     sum [3,2,5] = 10&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sum :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sum []     = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sum (x#xs) = x + sum xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
value &amp;quot;sum [3,2,5]&amp;quot; ― ‹= 10›&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función&lt;br /&gt;
     map :: (&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&lt;br /&gt;
  tal que (map f xs) es la lista obtenida aplicando la función f a los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     map (λx. 2*x) [3,2,5] = [6,4,10]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun map :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map f []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;map f (x#xs) = (f x) # map f xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
value &amp;quot;map (λx. 2*x) [3::nat,2,5]&amp;quot; ― ‹= [6,4,10]›&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=792</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=792"/>
		<updated>2019-06-26T15:52:42Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-18/ejercicios/ejercicios-LMF-2018-19.pdf libro de ejercicios].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]] y [[Sol 9 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R10.thy Programación funcional en Isabelle (2)] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R12.thy Recorridos de árboles en Isabelle/HOL] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R13.thy Definiciones inductivas: clausuras] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R14.thy Desarrollo de teorías axiomáticas] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]).&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R14&amp;diff=766</id>
		<title>R14</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R14&amp;diff=766"/>
		<updated>2019-05-28T06:51:43Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
theory R14&lt;br /&gt;
imports Main&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Hilbert publicó una axiomatización de la geometría que incluía los siguientes &lt;br /&gt;
  axiomas:&lt;br /&gt;
  1. Por dos puntos distintos pasa una línea recta.&lt;br /&gt;
  2. Por dos puntos distintos no pasa más de una línea recta.&lt;br /&gt;
  3. Toda línea tiene al menos dos puntos.&lt;br /&gt;
  4. Existen al menos tres puntos no alineados.&lt;br /&gt;
&lt;br /&gt;
  Usando la relacion en(p,l) para representar que el punto p está en la línea l, definir el entorno &lt;br /&gt;
  local Geom en el que se verifiquen los 4 axiomas anteriores.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
locale Geom =&lt;br /&gt;
  fixes en :: &amp;quot;&amp;#039;p ⇒ &amp;#039;l ⇒ bool&amp;quot;&lt;br /&gt;
  assumes linea_por_dos_puntos:       &amp;quot;a ≠ b ⟹ ∃l. en a l ∧ en b l&amp;quot; &lt;br /&gt;
      and linea_por_dos_puntos_unica: &amp;quot;⟦a ≠ b; en a l; en b l; en a m; en b m⟧ ⟹ l = m&amp;quot;&lt;br /&gt;
      and dos_puntos_de_la_linea:     &amp;quot;∃a b. a ≠ b ∧ en a l ∧ en b l&amp;quot;&lt;br /&gt;
      and tres_puntos_no_alineados:   &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ &lt;br /&gt;
                                               ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Demostrar que&lt;br /&gt;
    ∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada *)&lt;br /&gt;
lemma tres_puntos_no_alineados_alt:&lt;br /&gt;
  &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot;&lt;br /&gt;
oops       &lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. Demostrar que no todos los puntos pertenecen a la misma línea.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;∀l. ∃x. ¬ en x l&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada sin auto *)&lt;br /&gt;
lemma punto_no_en_linea: &amp;quot;∀l. ∃x. ¬ en x l&amp;quot;&lt;br /&gt;
oops &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 4. Demostrar que por cada punto pasa más de una línea.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;∃l m. en x l ∧ en x m ∧ l ≠ m&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada *)&lt;br /&gt;
lemma dos_lineas_por_punto: &amp;quot;∃l m. en x l ∧ en x m ∧ l ≠ m&amp;quot;&lt;br /&gt;
 oops &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 5. Demostrar que dos líneas distintas no pueden tener más de un punto común.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma  &lt;br /&gt;
   assumes &amp;quot;l ≠ m&amp;quot; &lt;br /&gt;
           &amp;quot;en x l&amp;quot; &lt;br /&gt;
           &amp;quot;en x m&amp;quot; &lt;br /&gt;
           &amp;quot;en y l&amp;quot; &lt;br /&gt;
           &amp;quot;en y m&amp;quot; &lt;br /&gt;
   shows &amp;quot;x = y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada *)&lt;br /&gt;
lemma interseccion_lineas_distintas: &lt;br /&gt;
   assumes &amp;quot;l ≠ m&amp;quot; &lt;br /&gt;
           &amp;quot;en x l&amp;quot; &lt;br /&gt;
           &amp;quot;en x m&amp;quot; &lt;br /&gt;
           &amp;quot;en y l&amp;quot; &lt;br /&gt;
           &amp;quot;en y m&amp;quot; &lt;br /&gt;
   shows &amp;quot;x = y&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 6. Extender el ámbito (&amp;quot;locale&amp;quot;) Geom definiendo la relación colineal tal que&lt;br /&gt;
  (colineal a b c) se verifica si existe una línea recta que pasa por los puntos a, b y c.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition (in Geom) &lt;br /&gt;
  colineal :: &amp;quot;&amp;#039;p ⇒ &amp;#039;p ⇒ &amp;#039;p ⇒ bool&amp;quot; &lt;br /&gt;
  where &amp;quot;colineal a b c ≡ ∃l. en a l ∧ en b l ∧ en c l&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 7. Demostrar que existen tres puntos a, b y c tales que&lt;br /&gt;
     ¬ colineal a b c&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma (in Geom) &amp;quot;∃a b c. ¬ colineal a b c&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada *)&lt;br /&gt;
lemma (in Geom) &amp;quot;∃a b c. ¬ colineal a b c&amp;quot;&lt;br /&gt;
oops &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R14&amp;diff=765</id>
		<title>R14</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R14&amp;diff=765"/>
		<updated>2019-05-28T06:51:33Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
theory R14&lt;br /&gt;
imports Main&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Hilbert publicó una axiomatización de la geometría que incluía los siguientes &lt;br /&gt;
  axiomas:&lt;br /&gt;
  1. Por dos puntos distintos pasa una línea recta.&lt;br /&gt;
  2. Por dos puntos distintos no pasa más de una línea recta.&lt;br /&gt;
  3. Toda línea tiene al menos dos puntos.&lt;br /&gt;
  4. Existen al menos tres puntos no alineados.&lt;br /&gt;
&lt;br /&gt;
  Usando la relacion en(p,l) para representar que el punto p está en la línea l, definir el entorno &lt;br /&gt;
  local Geom en el que se verifiquen los 4 axiomas anteriores.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
locale Geom =&lt;br /&gt;
  fixes en :: &amp;quot;&amp;#039;p ⇒ &amp;#039;l ⇒ bool&amp;quot;&lt;br /&gt;
  assumes linea_por_dos_puntos:       &amp;quot;a ≠ b ⟹ ∃l. en a l ∧ en b l&amp;quot; &lt;br /&gt;
      and linea_por_dos_puntos_unica: &amp;quot;⟦a ≠ b; en a l; en b l; en a m; en b m⟧ ⟹ l = m&amp;quot;&lt;br /&gt;
      and dos_puntos_de_la_linea:     &amp;quot;∃a b. a ≠ b ∧ en a l ∧ en b l&amp;quot;&lt;br /&gt;
      and tres_puntos_no_alineados:   &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ &lt;br /&gt;
                                               ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Demostrar que&lt;br /&gt;
    ∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada *)&lt;br /&gt;
lemma tres_puntos_no_alineados_alt:&lt;br /&gt;
  &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot;&lt;br /&gt;
oops       &lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. Demostrar que no todos los puntos pertenecen a la misma línea.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;∀l. ∃x. ¬ en x l&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada sin auto *)&lt;br /&gt;
lemma punto_no_en_linea: &amp;quot;∀l. ∃x. ¬ en x l&amp;quot;&lt;br /&gt;
oops &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 4. Demostrar que por cada punto pasa más de una línea.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;∃l m. en x l ∧ en x m ∧ l ≠ m&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada *)&lt;br /&gt;
lemma dos_lineas_por_punto: &amp;quot;∃l m. en x l ∧ en x m ∧ l ≠ m&amp;quot;&lt;br /&gt;
 oops &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 5. Demostrar que dos líneas distintas no pueden tener más de un punto común.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma  &lt;br /&gt;
   assumes &amp;quot;l ≠ m&amp;quot; &lt;br /&gt;
           &amp;quot;en x l&amp;quot; &lt;br /&gt;
           &amp;quot;en x m&amp;quot; &lt;br /&gt;
           &amp;quot;en y l&amp;quot; &lt;br /&gt;
           &amp;quot;en y m&amp;quot; &lt;br /&gt;
   shows &amp;quot;x = y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada *)&lt;br /&gt;
lemma interseccion_lineas_distintas: &lt;br /&gt;
   assumes &amp;quot;l ≠ m&amp;quot; &lt;br /&gt;
           &amp;quot;en x l&amp;quot; &lt;br /&gt;
           &amp;quot;en x m&amp;quot; &lt;br /&gt;
           &amp;quot;en y l&amp;quot; &lt;br /&gt;
           &amp;quot;en y m&amp;quot; &lt;br /&gt;
   shows &amp;quot;x = y&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 6. Extender el ámbito (&amp;quot;locale&amp;quot;) Geom definiendo la relación colineal tal que&lt;br /&gt;
  (colineal a b c) se verifica si existe una línea recta que pasa por los puntos a, b y c.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition (in Geom) &lt;br /&gt;
  colineal :: &amp;quot;&amp;#039;p ⇒ &amp;#039;p ⇒ &amp;#039;p ⇒ bool&amp;quot; &lt;br /&gt;
  where &amp;quot;colineal a b c ≡ ∃l. en a l ∧ en b l ∧ en c l&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 7. Demostrar que existen tres puntos a, b y c tales que&lt;br /&gt;
     ¬ colineal a b c&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma (in Geom) &amp;quot;∃a b c. ¬ colineal a b c&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración detallada *)&lt;br /&gt;
lemma (in Geom) &amp;quot;∃a b c. ¬ colineal a b c&amp;quot;&lt;br /&gt;
oops &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=764</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=764"/>
		<updated>2019-05-28T06:50:52Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-18/ejercicios/ejercicios-LMF-2018-19.pdf libro de ejercicios].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R10.thy Programación funcional en Isabelle (2)] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R12.thy Recorridos de árboles en Isabelle/HOL] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R13.thy Definiciones inductivas: clausuras] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R14.thy Desarrollo de teorías axiomáticas] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]).&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R13&amp;diff=716</id>
		<title>R13</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R13&amp;diff=716"/>
		<updated>2019-05-21T06:48:07Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
chapter {* R13: Definiciones inductivas: clausuras *}&lt;br /&gt;
&lt;br /&gt;
theory R13&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* La clausura reflexiva transitiva *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · Las definiciones inductivas aceptan parámetros; por tanto, permite&lt;br /&gt;
    expresar funciones que construyen conjuntos.&lt;br /&gt;
&lt;br /&gt;
  · La relaciones binarias son conjuntos de pares; por tanto, se pueden&lt;br /&gt;
   definir inductivamente.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · La clausura reflexiva y transitiva de una relación r es la menor&lt;br /&gt;
   relación reflexiva y transitiva que contiene a r. &lt;br /&gt;
&lt;br /&gt;
  · Se representa por r*.&lt;br /&gt;
&lt;br /&gt;
  · Se puede definir inductivamente, como conjunto:&lt;br /&gt;
    · (x,x) ∈ r*&lt;br /&gt;
    · Si (x,y) ∈ r e (y,z) ∈ r*, entonces (x,z) ∈ r*&lt;br /&gt;
&lt;br /&gt;
  · La definición inductiva, como conjunto, se puede expresar en &lt;br /&gt;
   Isabelle/HOL como sigue: &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set&lt;br /&gt;
  crt :: &amp;quot;(&amp;#039;a × &amp;#039;a) set ⇒ (&amp;#039;a × &amp;#039;a) set&amp;quot;   (&amp;quot;_*&amp;quot; [1000] 999)&lt;br /&gt;
  for r :: &amp;quot;(&amp;#039;a × &amp;#039;a) set&amp;quot;&lt;br /&gt;
where&lt;br /&gt;
  crt_refl [iff]: &amp;quot;(x,x) ∈ r*&amp;quot;&lt;br /&gt;
| crt_paso:       &amp;quot;⟦(x,y) ∈ r; (y,z) ∈ r* ⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La sintaxis concreta permite escribir r* en lugar de (crt r).&lt;br /&gt;
  · La definición consta de dos reglas.&lt;br /&gt;
  · A la regla reflexiva se le añade el atributo iff para aumentar la&lt;br /&gt;
    automatización. &lt;br /&gt;
  · A la regla del paso no se le añade ningún atributo, porque r* ocurre&lt;br /&gt;
   en la izquierda. &lt;br /&gt;
  · En el resto de esta sección se demuestra que esta definición&lt;br /&gt;
   coincide con la menor relación reflexiva y transitiva que contiene a&lt;br /&gt;
   r.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* es reflexiva.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x,x) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* contiene a r.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;  &lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma r_contenida_clausura [intro]: &lt;br /&gt;
  &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;  &lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La ventaja del lema es que se puede declarar como regla de&lt;br /&gt;
    introducción, porque r* ocurre sólo en la derecha.&lt;br /&gt;
  · Con la declaración, algunas demostraciones que usan crt_paso se&lt;br /&gt;
    hacen de manera automática.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El esquema de inducción de la clausura reflexiva transitiva es&lt;br /&gt;
  · crt.induct:&lt;br /&gt;
    ⟦(x1, x2) ∈ r*; &lt;br /&gt;
     ⋀x. P x x; &lt;br /&gt;
     ⋀x y z. ⟦(x,y) ∈ r; (y,z) ∈ r*; P y z⟧ ⟹ P x z⟧&lt;br /&gt;
    ⟹ P x1 x2&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* es transitiva.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;⟦(x,y) ∈ r*; (y,z) ∈ r*⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;⟦ (x,y) ∈ r*; (y,z) ∈ r* ⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Otra formulación del lema, con la variable y a la derecha.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
  &lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma crt_trans [rule_format]:&lt;br /&gt;
  &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La reformulación anterior es un caso particular de la siguiente&lt;br /&gt;
    heurística:&lt;br /&gt;
       &amp;quot;Para probar una fórmula por inducción sobre (x1,...,xn) ∈ R,&lt;br /&gt;
       poner todas las premisas conteniendo cualquiera de lax xi en la&lt;br /&gt;
       conclusión usando ⟶&amp;quot;. &lt;br /&gt;
  · El atributo &amp;quot;rule_format&amp;quot; transforma ⟶ en ⟹.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La relación r* está contenida en cualquier relación reflexiva y &lt;br /&gt;
  transitiva que contenga a r.&lt;br /&gt;
&lt;br /&gt;
  Mediante (crt2 r) se define la menor relación reflexiva y transitiva &lt;br /&gt;
  que contiene a r.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set&lt;br /&gt;
  crt2 :: &amp;quot;(&amp;#039;a × &amp;#039;a)set ⇒ (&amp;#039;a × &amp;#039;a)set&amp;quot;&lt;br /&gt;
  for r :: &amp;quot;(&amp;#039;a × &amp;#039;a)set&amp;quot;&lt;br /&gt;
where&lt;br /&gt;
  &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ crt2 r&amp;quot;                      (* contiene a r *) &lt;br /&gt;
| &amp;quot;(x,x) ∈ crt2 r&amp;quot;                                      (* reflexiva *)&lt;br /&gt;
| &amp;quot;⟦(x,y) ∈ crt2 r; (y,z) ∈ crt2 r⟧ ⟹ (x,z) ∈ crt2 r&amp;quot; (* transitiva *)&lt;br /&gt;
&lt;br /&gt;
text {* Probaremos que r* coincide con (crt2 r) *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación (crt2 r) está contenida en r*.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* está contenida en (crt2 r).&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar que si (x,y) ∈ r* e (y,z) ∈ r, entonces &lt;br /&gt;
  (x,z) ∈ r*&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma crt_paso2 [rule_format]: &lt;br /&gt;
  &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
   oops &lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Considerar la siguiente definición de la clausura tran-&lt;br /&gt;
  sitiva de una relación r, y probar que es la menor relación reflexiva &lt;br /&gt;
  y transitiva que contiene a r.&lt;br /&gt;
&lt;br /&gt;
  Nota: Establecer los lemas necesarios.&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
inductive star&amp;#039; :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot; for r where&lt;br /&gt;
  refl&amp;#039;: &amp;quot;star&amp;#039; r x x&amp;quot; &lt;br /&gt;
| step&amp;#039;: &amp;quot;star&amp;#039; r x y ⟹ r y z ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Demostración de que (star&amp;#039; r) es reflexiva *)&lt;br /&gt;
lemma star&amp;#039;Refl: &amp;quot;star&amp;#039; r x x&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
(* Demostración declarativa de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma rsubsetStar&amp;#039;: &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
   oops &lt;br /&gt;
&lt;br /&gt;
text {* A continuación se prueba una condición suficiente para star&amp;#039; r *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r y z; r x y⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma star&amp;#039;_subset_star&amp;#039;_l1:&lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r y z; r x y⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostraciones de que  (star&amp;#039; r) es transitiva *)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;⟦star&amp;#039; r x y; star&amp;#039; r y z⟧ ⟹ star&amp;#039; r x z&amp;quot;   &lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma star&amp;#039;Trans: &lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r x y; star&amp;#039; r y z⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
   &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Considerar la siguiente definición inductiva. Probar que &lt;br /&gt;
  &amp;quot;star&amp;#039; r x y syss (∃n. iter r n x y)&amp;quot;&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
inductive iter :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ nat ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;&lt;br /&gt;
for r where&lt;br /&gt;
  iterRefl: &amp;quot;iter r 0 x x&amp;quot;&lt;br /&gt;
| iterStep: &amp;quot;⟦iter r n x y; r y z⟧ ⟹ iter r (n+1) x z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* El esquema de inducción correspondiente es *)&lt;br /&gt;
thm iter.induct&lt;br /&gt;
(*&lt;br /&gt;
  ⟦iter ?r ?x1.0 ?x2.0 ?x3.0; &lt;br /&gt;
   ⋀x. ?P 0 x x;&lt;br /&gt;
   ⋀n x y z. ⟦iter ?r n x y; ?P n x y; ?r y z⟧ ⟹ ?P (n + 1) x z⟧&lt;br /&gt;
  ⟹ ?P ?x1.0 ?x2.0 ?x3.0&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(* Algunos teoremas derivados son *)&lt;br /&gt;
&lt;br /&gt;
thm iterRefl&lt;br /&gt;
(* iter ?r 0 ?x ?x *)&lt;br /&gt;
&lt;br /&gt;
thm iterRefl [of r y]&lt;br /&gt;
(* iter r 0 y y *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep&lt;br /&gt;
(* ⟦iter ?r ?n ?x ?y; ?r ?y ?z⟧ ⟹ iter ?r (?n + 1) ?x ?z *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep [of r x y n z]&lt;br /&gt;
(* ⟦iter r x y n; r n z⟧ ⟹ iter r (x + 1) y z *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep [of r x y 0 y]&lt;br /&gt;
(* ⟦iter r x y 0; r 0 y⟧ ⟹ iter r (x + 1) y y *)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Demostrar  &lt;br /&gt;
     star&amp;#039; r x y ⟹ (∃n. iter r n x y)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma [rule_format]: &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;    &lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma [rule_format]: &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;    &lt;br /&gt;
  oops &lt;br /&gt;
  &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Demostrar  &lt;br /&gt;
     (∃n. iter r n x y) ⟹ star&amp;#039; r x y&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* En la demostración se usará el siguiente lema:&lt;br /&gt;
      iter r n x y ⟹ star&amp;#039; r x y *)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa del lema *) &lt;br /&gt;
lemma iter_star&amp;#039;_subset: &amp;quot;iter r n x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática del lema *) &lt;br /&gt;
lemma &amp;quot;iter r n x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(∃n. iter r n x y) ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;(∃n. iter r n x y) ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma assumes &amp;quot;(∃n. iter r n x y)&amp;quot;&lt;br /&gt;
      shows &amp;quot;star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R13&amp;diff=715</id>
		<title>R13</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R13&amp;diff=715"/>
		<updated>2019-05-21T06:47:55Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
chapter {* R13: Definiciones inductivas: clausuras *}&lt;br /&gt;
&lt;br /&gt;
theory R13&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* La clausura reflexiva transitiva *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · Las definiciones inductivas aceptan parámetros; por tanto, permite&lt;br /&gt;
    expresar funciones que construyen conjuntos.&lt;br /&gt;
&lt;br /&gt;
  · La relaciones binarias son conjuntos de pares; por tanto, se pueden&lt;br /&gt;
   definir inductivamente.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · La clausura reflexiva y transitiva de una relación r es la menor&lt;br /&gt;
   relación reflexiva y transitiva que contiene a r. &lt;br /&gt;
&lt;br /&gt;
  · Se representa por r*.&lt;br /&gt;
&lt;br /&gt;
  · Se puede definir inductivamente, como conjunto:&lt;br /&gt;
    · (x,x) ∈ r*&lt;br /&gt;
    · Si (x,y) ∈ r e (y,z) ∈ r*, entonces (x,z) ∈ r*&lt;br /&gt;
&lt;br /&gt;
  · La definición inductiva, como conjunto, se puede expresar en &lt;br /&gt;
   Isabelle/HOL como sigue: &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set&lt;br /&gt;
  crt :: &amp;quot;(&amp;#039;a × &amp;#039;a) set ⇒ (&amp;#039;a × &amp;#039;a) set&amp;quot;   (&amp;quot;_*&amp;quot; [1000] 999)&lt;br /&gt;
  for r :: &amp;quot;(&amp;#039;a × &amp;#039;a) set&amp;quot;&lt;br /&gt;
where&lt;br /&gt;
  crt_refl [iff]: &amp;quot;(x,x) ∈ r*&amp;quot;&lt;br /&gt;
| crt_paso:       &amp;quot;⟦(x,y) ∈ r; (y,z) ∈ r* ⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La sintaxis concreta permite escribir r* en lugar de (crt r).&lt;br /&gt;
  · La definición consta de dos reglas.&lt;br /&gt;
  · A la regla reflexiva se le añade el atributo iff para aumentar la&lt;br /&gt;
    automatización. &lt;br /&gt;
  · A la regla del paso no se le añade ningún atributo, porque r* ocurre&lt;br /&gt;
   en la izquierda. &lt;br /&gt;
  · En el resto de esta sección se demuestra que esta definición&lt;br /&gt;
   coincide con la menor relación reflexiva y transitiva que contiene a&lt;br /&gt;
   r.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* es reflexiva.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x,x) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* contiene a r.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;  &lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma r_contenida_clausura [intro]: &lt;br /&gt;
  &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;  &lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La ventaja del lema es que se puede declarar como regla de&lt;br /&gt;
    introducción, porque r* ocurre sólo en la derecha.&lt;br /&gt;
  · Con la declaración, algunas demostraciones que usan crt_paso se&lt;br /&gt;
    hacen de manera automática.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El esquema de inducción de la clausura reflexiva transitiva es&lt;br /&gt;
  · crt.induct:&lt;br /&gt;
    ⟦(x1, x2) ∈ r*; &lt;br /&gt;
     ⋀x. P x x; &lt;br /&gt;
     ⋀x y z. ⟦(x,y) ∈ r; (y,z) ∈ r*; P y z⟧ ⟹ P x z⟧&lt;br /&gt;
    ⟹ P x1 x2&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* es transitiva.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;⟦(x,y) ∈ r*; (y,z) ∈ r*⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;⟦ (x,y) ∈ r*; (y,z) ∈ r* ⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Otra formulación del lema, con la variable y a la derecha.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
  &lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma crt_trans [rule_format]:&lt;br /&gt;
  &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La reformulación anterior es un caso particular de la siguiente&lt;br /&gt;
    heurística:&lt;br /&gt;
       &amp;quot;Para probar una fórmula por inducción sobre (x1,...,xn) ∈ R,&lt;br /&gt;
       poner todas las premisas conteniendo cualquiera de lax xi en la&lt;br /&gt;
       conclusión usando ⟶&amp;quot;. &lt;br /&gt;
  · El atributo &amp;quot;rule_format&amp;quot; transforma ⟶ en ⟹.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La relación r* está contenida en cualquier relación reflexiva y &lt;br /&gt;
  transitiva que contenga a r.&lt;br /&gt;
&lt;br /&gt;
  Mediante (crt2 r) se define la menor relación reflexiva y transitiva &lt;br /&gt;
  que contiene a r.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set&lt;br /&gt;
  crt2 :: &amp;quot;(&amp;#039;a × &amp;#039;a)set ⇒ (&amp;#039;a × &amp;#039;a)set&amp;quot;&lt;br /&gt;
  for r :: &amp;quot;(&amp;#039;a × &amp;#039;a)set&amp;quot;&lt;br /&gt;
where&lt;br /&gt;
  &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ crt2 r&amp;quot;                      (* contiene a r *) &lt;br /&gt;
| &amp;quot;(x,x) ∈ crt2 r&amp;quot;                                      (* reflexiva *)&lt;br /&gt;
| &amp;quot;⟦(x,y) ∈ crt2 r; (y,z) ∈ crt2 r⟧ ⟹ (x,z) ∈ crt2 r&amp;quot; (* transitiva *)&lt;br /&gt;
&lt;br /&gt;
text {* Probaremos que r* coincide con (crt2 r) *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación (crt2 r) está contenida en r*.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* está contenida en (crt2 r).&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar que si (x,y) ∈ r* e (y,z) ∈ r, entonces &lt;br /&gt;
  (x,z) ∈ r*&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma crt_paso2 [rule_format]: &lt;br /&gt;
  &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
   oops &lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Considerar la siguiente definición de la clausura tran-&lt;br /&gt;
  sitiva de una relación r, y probar que es la menor relación reflexiva &lt;br /&gt;
  y transitiva que contiene a r.&lt;br /&gt;
&lt;br /&gt;
  Nota: Establecer los lemas necesarios.&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
inductive star&amp;#039; :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot; for r where&lt;br /&gt;
  refl&amp;#039;: &amp;quot;star&amp;#039; r x x&amp;quot; &lt;br /&gt;
| step&amp;#039;: &amp;quot;star&amp;#039; r x y ⟹ r y z ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Demostración de que (star&amp;#039; r) es reflexiva *)&lt;br /&gt;
lemma star&amp;#039;Refl: &amp;quot;star&amp;#039; r x x&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
(* Demostración declarativa de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma rsubsetStar&amp;#039;: &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
   oops &lt;br /&gt;
&lt;br /&gt;
text {* A continuación se prueba una condición suficiente para star&amp;#039; r *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r y z; r x y⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma star&amp;#039;_subset_star&amp;#039;_l1:&lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r y z; r x y⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostraciones de que  (star&amp;#039; r) es transitiva *)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;⟦star&amp;#039; r x y; star&amp;#039; r y z⟧ ⟹ star&amp;#039; r x z&amp;quot;   &lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma star&amp;#039;Trans: &lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r x y; star&amp;#039; r y z⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
   &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Considerar la siguiente definición inductiva. Probar que &lt;br /&gt;
  &amp;quot;star&amp;#039; r x y syss (∃n. iter r n x y)&amp;quot;&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
inductive iter :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ nat ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;&lt;br /&gt;
for r where&lt;br /&gt;
  iterRefl: &amp;quot;iter r 0 x x&amp;quot;&lt;br /&gt;
| iterStep: &amp;quot;⟦iter r n x y; r y z⟧ ⟹ iter r (n+1) x z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* El esquema de inducción correspondiente es *)&lt;br /&gt;
thm iter.induct&lt;br /&gt;
(*&lt;br /&gt;
  ⟦iter ?r ?x1.0 ?x2.0 ?x3.0; &lt;br /&gt;
   ⋀x. ?P 0 x x;&lt;br /&gt;
   ⋀n x y z. ⟦iter ?r n x y; ?P n x y; ?r y z⟧ ⟹ ?P (n + 1) x z⟧&lt;br /&gt;
  ⟹ ?P ?x1.0 ?x2.0 ?x3.0&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(* Algunos teoremas derivados son *)&lt;br /&gt;
&lt;br /&gt;
thm iterRefl&lt;br /&gt;
(* iter ?r 0 ?x ?x *)&lt;br /&gt;
&lt;br /&gt;
thm iterRefl [of r y]&lt;br /&gt;
(* iter r 0 y y *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep&lt;br /&gt;
(* ⟦iter ?r ?n ?x ?y; ?r ?y ?z⟧ ⟹ iter ?r (?n + 1) ?x ?z *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep [of r x y n z]&lt;br /&gt;
(* ⟦iter r x y n; r n z⟧ ⟹ iter r (x + 1) y z *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep [of r x y 0 y]&lt;br /&gt;
(* ⟦iter r x y 0; r 0 y⟧ ⟹ iter r (x + 1) y y *)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Demostrar  &lt;br /&gt;
     star&amp;#039; r x y ⟹ (∃n. iter r n x y)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma [rule_format]: &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;    &lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma [rule_format]: &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;    &lt;br /&gt;
  oops &lt;br /&gt;
  &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Demostrar  &lt;br /&gt;
     (∃n. iter r n x y) ⟹ star&amp;#039; r x y&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* En la demostración se usará el siguiente lema:&lt;br /&gt;
      iter r n x y ⟹ star&amp;#039; r x y *)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa del lema *) &lt;br /&gt;
lemma iter_star&amp;#039;_subset: &amp;quot;iter r n x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática del lema *) &lt;br /&gt;
lemma &amp;quot;iter r n x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(∃n. iter r n x y) ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;(∃n. iter r n x y) ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma assumes &amp;quot;(∃n. iter r n x y)&amp;quot;&lt;br /&gt;
      shows &amp;quot;star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R13&amp;diff=714</id>
		<title>R13</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R13&amp;diff=714"/>
		<updated>2019-05-21T06:46:50Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R13: Definiciones inductivas: clausuras *}&lt;br /&gt;
&lt;br /&gt;
theory R13&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* La clausura reflexiva transitiva *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · Las definiciones inductivas aceptan parámetros; por tanto, permite&lt;br /&gt;
    expresar funciones que construyen conjuntos.&lt;br /&gt;
&lt;br /&gt;
  · La relaciones binarias son conjuntos de pares; por tanto, se pueden&lt;br /&gt;
   definir inductivamente.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · La clausura reflexiva y transitiva de una relación r es la menor&lt;br /&gt;
   relación reflexiva y transitiva que contiene a r. &lt;br /&gt;
&lt;br /&gt;
  · Se representa por r*.&lt;br /&gt;
&lt;br /&gt;
  · Se puede definir inductivamente, como conjunto:&lt;br /&gt;
    · (x,x) ∈ r*&lt;br /&gt;
    · Si (x,y) ∈ r e (y,z) ∈ r*, entonces (x,z) ∈ r*&lt;br /&gt;
&lt;br /&gt;
  · La definición inductiva, como conjunto, se puede expresar en &lt;br /&gt;
   Isabelle/HOL como sigue: &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set&lt;br /&gt;
  crt :: &amp;quot;(&amp;#039;a × &amp;#039;a) set ⇒ (&amp;#039;a × &amp;#039;a) set&amp;quot;   (&amp;quot;_*&amp;quot; [1000] 999)&lt;br /&gt;
  for r :: &amp;quot;(&amp;#039;a × &amp;#039;a) set&amp;quot;&lt;br /&gt;
where&lt;br /&gt;
  crt_refl [iff]: &amp;quot;(x,x) ∈ r*&amp;quot;&lt;br /&gt;
| crt_paso:       &amp;quot;⟦(x,y) ∈ r; (y,z) ∈ r* ⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La sintaxis concreta permite escribir r* en lugar de (crt r).&lt;br /&gt;
  · La definición consta de dos reglas.&lt;br /&gt;
  · A la regla reflexiva se le añade el atributo iff para aumentar la&lt;br /&gt;
    automatización. &lt;br /&gt;
  · A la regla del paso no se le añade ningún atributo, porque r* ocurre&lt;br /&gt;
   en la izquierda. &lt;br /&gt;
  · En el resto de esta sección se demuestra que esta definición&lt;br /&gt;
   coincide con la menor relación reflexiva y transitiva que contiene a&lt;br /&gt;
   r.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* es reflexiva.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x,x) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* contiene a r.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;  &lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma r_contenida_clausura [intro]: &lt;br /&gt;
  &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;  &lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La ventaja del lema es que se puede declarar como regla de&lt;br /&gt;
    introducción, porque r* ocurre sólo en la derecha.&lt;br /&gt;
  · Con la declaración, algunas demostraciones que usan crt_paso se&lt;br /&gt;
    hacen de manera automática.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El esquema de inducción de la clausura reflexiva transitiva es&lt;br /&gt;
  · crt.induct:&lt;br /&gt;
    ⟦(x1, x2) ∈ r*; &lt;br /&gt;
     ⋀x. P x x; &lt;br /&gt;
     ⋀x y z. ⟦(x,y) ∈ r; (y,z) ∈ r*; P y z⟧ ⟹ P x z⟧&lt;br /&gt;
    ⟹ P x1 x2&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* es transitiva.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;⟦(x,y) ∈ r*; (y,z) ∈ r*⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;⟦ (x,y) ∈ r*; (y,z) ∈ r* ⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Otra formulación del lema, con la variable y a la derecha.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
  &lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma crt_trans [rule_format]:&lt;br /&gt;
  &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La reformulación anterior es un caso particular de la siguiente&lt;br /&gt;
    heurística:&lt;br /&gt;
       &amp;quot;Para probar una fórmula por inducción sobre (x1,...,xn) ∈ R,&lt;br /&gt;
       poner todas las premisas conteniendo cualquiera de lax xi en la&lt;br /&gt;
       conclusión usando ⟶&amp;quot;. &lt;br /&gt;
  · El atributo &amp;quot;rule_format&amp;quot; transforma ⟶ en ⟹.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La relación r* está contenida en cualquier relación reflexiva y &lt;br /&gt;
  transitiva que contenga a r.&lt;br /&gt;
&lt;br /&gt;
  Mediante (crt2 r) se define la menor relación reflexiva y transitiva &lt;br /&gt;
  que contiene a r.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set&lt;br /&gt;
  crt2 :: &amp;quot;(&amp;#039;a × &amp;#039;a)set ⇒ (&amp;#039;a × &amp;#039;a)set&amp;quot;&lt;br /&gt;
  for r :: &amp;quot;(&amp;#039;a × &amp;#039;a)set&amp;quot;&lt;br /&gt;
where&lt;br /&gt;
  &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ crt2 r&amp;quot;                      (* contiene a r *) &lt;br /&gt;
| &amp;quot;(x,x) ∈ crt2 r&amp;quot;                                      (* reflexiva *)&lt;br /&gt;
| &amp;quot;⟦(x,y) ∈ crt2 r; (y,z) ∈ crt2 r⟧ ⟹ (x,z) ∈ crt2 r&amp;quot; (* transitiva *)&lt;br /&gt;
&lt;br /&gt;
text {* Probaremos que r* coincide con (crt2 r) *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación (crt2 r) está contenida en r*.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* está contenida en (crt2 r).&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar que si (x,y) ∈ r* e (y,z) ∈ r, entonces &lt;br /&gt;
  (x,z) ∈ r*&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma crt_paso2 [rule_format]: &lt;br /&gt;
  &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
   oops &lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Considerar la siguiente definición de la clausura tran-&lt;br /&gt;
  sitiva de una relación r, y probar que es la menor relación reflexiva &lt;br /&gt;
  y transitiva que contiene a r.&lt;br /&gt;
&lt;br /&gt;
  Nota: Establecer los lemas necesarios.&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
inductive star&amp;#039; :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot; for r where&lt;br /&gt;
  refl&amp;#039;: &amp;quot;star&amp;#039; r x x&amp;quot; &lt;br /&gt;
| step&amp;#039;: &amp;quot;star&amp;#039; r x y ⟹ r y z ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Demostración de que (star&amp;#039; r) es reflexiva *)&lt;br /&gt;
lemma star&amp;#039;Refl: &amp;quot;star&amp;#039; r x x&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
(* Demostración declarativa de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma rsubsetStar&amp;#039;: &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
   oops &lt;br /&gt;
&lt;br /&gt;
text {* A continuación se prueba una condición suficiente para star&amp;#039; r *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r y z; r x y⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma star&amp;#039;_subset_star&amp;#039;_l1:&lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r y z; r x y⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostraciones de que  (star&amp;#039; r) es transitiva *)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;⟦star&amp;#039; r x y; star&amp;#039; r y z⟧ ⟹ star&amp;#039; r x z&amp;quot;   &lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma star&amp;#039;Trans: &lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r x y; star&amp;#039; r y z⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
   &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Considerar la siguiente definición inductiva. Probar que &lt;br /&gt;
  &amp;quot;star&amp;#039; r x y syss (∃n. iter r n x y)&amp;quot;&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
inductive iter :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ nat ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;&lt;br /&gt;
for r where&lt;br /&gt;
  iterRefl: &amp;quot;iter r 0 x x&amp;quot;&lt;br /&gt;
| iterStep: &amp;quot;⟦iter r n x y; r y z⟧ ⟹ iter r (n+1) x z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* El esquema de inducción correspondiente es *)&lt;br /&gt;
thm iter.induct&lt;br /&gt;
(*&lt;br /&gt;
  ⟦iter ?r ?x1.0 ?x2.0 ?x3.0; &lt;br /&gt;
   ⋀x. ?P 0 x x;&lt;br /&gt;
   ⋀n x y z. ⟦iter ?r n x y; ?P n x y; ?r y z⟧ ⟹ ?P (n + 1) x z⟧&lt;br /&gt;
  ⟹ ?P ?x1.0 ?x2.0 ?x3.0&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(* Algunos teoremas derivados son *)&lt;br /&gt;
&lt;br /&gt;
thm iterRefl&lt;br /&gt;
(* iter ?r 0 ?x ?x *)&lt;br /&gt;
&lt;br /&gt;
thm iterRefl [of r y]&lt;br /&gt;
(* iter r 0 y y *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep&lt;br /&gt;
(* ⟦iter ?r ?n ?x ?y; ?r ?y ?z⟧ ⟹ iter ?r (?n + 1) ?x ?z *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep [of r x y n z]&lt;br /&gt;
(* ⟦iter r x y n; r n z⟧ ⟹ iter r (x + 1) y z *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep [of r x y 0 y]&lt;br /&gt;
(* ⟦iter r x y 0; r 0 y⟧ ⟹ iter r (x + 1) y y *)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Demostrar  &lt;br /&gt;
     star&amp;#039; r x y ⟹ (∃n. iter r n x y)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma [rule_format]: &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;    &lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma [rule_format]: &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;    &lt;br /&gt;
  oops &lt;br /&gt;
  &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Demostrar  &lt;br /&gt;
     (∃n. iter r n x y) ⟹ star&amp;#039; r x y&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* En la demostración se usará el siguiente lema:&lt;br /&gt;
      iter r n x y ⟹ star&amp;#039; r x y *)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa del lema *) &lt;br /&gt;
lemma iter_star&amp;#039;_subset: &amp;quot;iter r n x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática del lema *) &lt;br /&gt;
lemma &amp;quot;iter r n x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(∃n. iter r n x y) ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;(∃n. iter r n x y) ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma assumes &amp;quot;(∃n. iter r n x y)&amp;quot;&lt;br /&gt;
      shows &amp;quot;star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
chapter {* R13: Definiciones inductivas: clausuras *}&lt;br /&gt;
&lt;br /&gt;
theory R13&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* La clausura reflexiva transitiva *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · Las definiciones inductivas aceptan parámetros; por tanto, permite&lt;br /&gt;
    expresar funciones que construyen conjuntos.&lt;br /&gt;
&lt;br /&gt;
  · La relaciones binarias son conjuntos de pares; por tanto, se pueden&lt;br /&gt;
   definir inductivamente.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · La clausura reflexiva y transitiva de una relación r es la menor&lt;br /&gt;
   relación reflexiva y transitiva que contiene a r. &lt;br /&gt;
&lt;br /&gt;
  · Se representa por r*.&lt;br /&gt;
&lt;br /&gt;
  · Se puede definir inductivamente, como conjunto:&lt;br /&gt;
    · (x,x) ∈ r*&lt;br /&gt;
    · Si (x,y) ∈ r e (y,z) ∈ r*, entonces (x,z) ∈ r*&lt;br /&gt;
&lt;br /&gt;
  · La definición inductiva, como conjunto, se puede expresar en &lt;br /&gt;
   Isabelle/HOL como sigue: &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set&lt;br /&gt;
  crt :: &amp;quot;(&amp;#039;a × &amp;#039;a) set ⇒ (&amp;#039;a × &amp;#039;a) set&amp;quot;   (&amp;quot;_*&amp;quot; [1000] 999)&lt;br /&gt;
  for r :: &amp;quot;(&amp;#039;a × &amp;#039;a) set&amp;quot;&lt;br /&gt;
where&lt;br /&gt;
  crt_refl [iff]: &amp;quot;(x,x) ∈ r*&amp;quot;&lt;br /&gt;
| crt_paso:       &amp;quot;⟦(x,y) ∈ r; (y,z) ∈ r* ⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La sintaxis concreta permite escribir r* en lugar de (crt r).&lt;br /&gt;
  · La definición consta de dos reglas.&lt;br /&gt;
  · A la regla reflexiva se le añade el atributo iff para aumentar la&lt;br /&gt;
    automatización. &lt;br /&gt;
  · A la regla del paso no se le añade ningún atributo, porque r* ocurre&lt;br /&gt;
   en la izquierda. &lt;br /&gt;
  · En el resto de esta sección se demuestra que esta definición&lt;br /&gt;
   coincide con la menor relación reflexiva y transitiva que contiene a&lt;br /&gt;
   r.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* es reflexiva.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x,x) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* contiene a r.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;  &lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma r_contenida_clausura [intro]: &lt;br /&gt;
  &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;  &lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La ventaja del lema es que se puede declarar como regla de&lt;br /&gt;
    introducción, porque r* ocurre sólo en la derecha.&lt;br /&gt;
  · Con la declaración, algunas demostraciones que usan crt_paso se&lt;br /&gt;
    hacen de manera automática.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El esquema de inducción de la clausura reflexiva transitiva es&lt;br /&gt;
  · crt.induct:&lt;br /&gt;
    ⟦(x1, x2) ∈ r*; &lt;br /&gt;
     ⋀x. P x x; &lt;br /&gt;
     ⋀x y z. ⟦(x,y) ∈ r; (y,z) ∈ r*; P y z⟧ ⟹ P x z⟧&lt;br /&gt;
    ⟹ P x1 x2&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* es transitiva.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;⟦(x,y) ∈ r*; (y,z) ∈ r*⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;⟦ (x,y) ∈ r*; (y,z) ∈ r* ⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Otra formulación del lema, con la variable y a la derecha.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
  &lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma crt_trans [rule_format]:&lt;br /&gt;
  &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La reformulación anterior es un caso particular de la siguiente&lt;br /&gt;
    heurística:&lt;br /&gt;
       &amp;quot;Para probar una fórmula por inducción sobre (x1,...,xn) ∈ R,&lt;br /&gt;
       poner todas las premisas conteniendo cualquiera de lax xi en la&lt;br /&gt;
       conclusión usando ⟶&amp;quot;. &lt;br /&gt;
  · El atributo &amp;quot;rule_format&amp;quot; transforma ⟶ en ⟹.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La relación r* está contenida en cualquier relación reflexiva y &lt;br /&gt;
  transitiva que contenga a r.&lt;br /&gt;
&lt;br /&gt;
  Mediante (crt2 r) se define la menor relación reflexiva y transitiva &lt;br /&gt;
  que contiene a r.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set&lt;br /&gt;
  crt2 :: &amp;quot;(&amp;#039;a × &amp;#039;a)set ⇒ (&amp;#039;a × &amp;#039;a)set&amp;quot;&lt;br /&gt;
  for r :: &amp;quot;(&amp;#039;a × &amp;#039;a)set&amp;quot;&lt;br /&gt;
where&lt;br /&gt;
  &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ crt2 r&amp;quot;                      (* contiene a r *) &lt;br /&gt;
| &amp;quot;(x,x) ∈ crt2 r&amp;quot;                                      (* reflexiva *)&lt;br /&gt;
| &amp;quot;⟦(x,y) ∈ crt2 r; (y,z) ∈ crt2 r⟧ ⟹ (x,z) ∈ crt2 r&amp;quot; (* transitiva *)&lt;br /&gt;
&lt;br /&gt;
text {* Probaremos que r* coincide con (crt2 r) *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación (crt2 r) está contenida en r*.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* está contenida en (crt2 r).&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar que si (x,y) ∈ r* e (y,z) ∈ r, entonces &lt;br /&gt;
  (x,z) ∈ r*&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma crt_paso2 [rule_format]: &lt;br /&gt;
  &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
   oops &lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Considerar la siguiente definición de la clausura tran-&lt;br /&gt;
  sitiva de una relación r, y probar que es la menor relación reflexiva &lt;br /&gt;
  y transitiva que contiene a r.&lt;br /&gt;
&lt;br /&gt;
  Nota: Establecer los lemas necesarios.&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
inductive star&amp;#039; :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot; for r where&lt;br /&gt;
  refl&amp;#039;: &amp;quot;star&amp;#039; r x x&amp;quot; &lt;br /&gt;
| step&amp;#039;: &amp;quot;star&amp;#039; r x y ⟹ r y z ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Demostración de que (star&amp;#039; r) es reflexiva *)&lt;br /&gt;
lemma star&amp;#039;Refl: &amp;quot;star&amp;#039; r x x&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
(* Demostración declarativa de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma rsubsetStar&amp;#039;: &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
   oops &lt;br /&gt;
&lt;br /&gt;
text {* A continuación se prueba una condición suficiente para star&amp;#039; r *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r y z; r x y⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma star&amp;#039;_subset_star&amp;#039;_l1:&lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r y z; r x y⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostraciones de que  (star&amp;#039; r) es transitiva *)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;⟦star&amp;#039; r x y; star&amp;#039; r y z⟧ ⟹ star&amp;#039; r x z&amp;quot;   &lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma star&amp;#039;Trans: &lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r x y; star&amp;#039; r y z⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
   &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Considerar la siguiente definición inductiva. Probar que &lt;br /&gt;
  &amp;quot;star&amp;#039; r x y syss (∃n. iter r n x y)&amp;quot;&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
inductive iter :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ nat ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;&lt;br /&gt;
for r where&lt;br /&gt;
  iterRefl: &amp;quot;iter r 0 x x&amp;quot;&lt;br /&gt;
| iterStep: &amp;quot;⟦iter r n x y; r y z⟧ ⟹ iter r (n+1) x z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* El esquema de inducción correspondiente es *)&lt;br /&gt;
thm iter.induct&lt;br /&gt;
(*&lt;br /&gt;
  ⟦iter ?r ?x1.0 ?x2.0 ?x3.0; &lt;br /&gt;
   ⋀x. ?P 0 x x;&lt;br /&gt;
   ⋀n x y z. ⟦iter ?r n x y; ?P n x y; ?r y z⟧ ⟹ ?P (n + 1) x z⟧&lt;br /&gt;
  ⟹ ?P ?x1.0 ?x2.0 ?x3.0&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(* Algunos teoremas derivados son *)&lt;br /&gt;
&lt;br /&gt;
thm iterRefl&lt;br /&gt;
(* iter ?r 0 ?x ?x *)&lt;br /&gt;
&lt;br /&gt;
thm iterRefl [of r y]&lt;br /&gt;
(* iter r 0 y y *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep&lt;br /&gt;
(* ⟦iter ?r ?n ?x ?y; ?r ?y ?z⟧ ⟹ iter ?r (?n + 1) ?x ?z *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep [of r x y n z]&lt;br /&gt;
(* ⟦iter r x y n; r n z⟧ ⟹ iter r (x + 1) y z *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep [of r x y 0 y]&lt;br /&gt;
(* ⟦iter r x y 0; r 0 y⟧ ⟹ iter r (x + 1) y y *)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Demostrar  &lt;br /&gt;
     star&amp;#039; r x y ⟹ (∃n. iter r n x y)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma [rule_format]: &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;    &lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma [rule_format]: &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;    &lt;br /&gt;
  oops &lt;br /&gt;
  &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Demostrar  &lt;br /&gt;
     (∃n. iter r n x y) ⟹ star&amp;#039; r x y&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* En la demostración se usará el siguiente lema:&lt;br /&gt;
      iter r n x y ⟹ star&amp;#039; r x y *)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa del lema *) &lt;br /&gt;
lemma iter_star&amp;#039;_subset: &amp;quot;iter r n x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática del lema *) &lt;br /&gt;
lemma &amp;quot;iter r n x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(∃n. iter r n x y) ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;(∃n. iter r n x y) ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma assumes &amp;quot;(∃n. iter r n x y)&amp;quot;&lt;br /&gt;
      shows &amp;quot;star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=713</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=713"/>
		<updated>2019-05-21T06:45:42Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-18/ejercicios/ejercicios-LMF-2018-19.pdf libro de ejercicios].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R10.thy Programación funcional en Isabelle (2)] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R12.thy Recorridos de árboles en Isabelle/HOL] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R13.thy Definiciones inductivas: clausuras] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]).&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R12&amp;diff=674</id>
		<title>R12</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R12&amp;diff=674"/>
		<updated>2019-05-16T11:17:45Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R12: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R12&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que tiene información en los nodos y en las hojas. &lt;br /&gt;
  Por ejemplo, el árbol&lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
     a   d f   h &lt;br /&gt;
  se representa por &amp;quot;N e (N c (H a) (H d)) (N g (H f) (H h))&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = H &amp;quot;&amp;#039;a&amp;quot; | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;N e (N c (H a) (H d)) (N g (H f) (H h))&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función &lt;br /&gt;
     preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (preOrden a) es el recorrido pre orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     preOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [e,c,a,d,g,f,h] &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrden a = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
value &amp;quot;preOrden (N e (N c (H a) (H d)) (N g (H f) (H h))) = &lt;br /&gt;
  [e,c,a,d,g,f,h]&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función &lt;br /&gt;
     postOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (postOrden a) es el recorrido post orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     postOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [e,c,a,d,g,f,h] &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun postOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrden a = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;postOrden (N e (N c (H a) (H d)) (N g (H f) (H h))) = [a,d,c,f,h,g,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     inOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (inOrden a) es el recorrido in orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     inOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [a,c,d,e,f,g,h]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun inOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inOrden a = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inOrden (N e (N c (H a) (H d)) (N g (H f) (H h))) = [a,c,d,e,f,g,h]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot;&lt;br /&gt;
  tal que (espejo a) es la imagen especular del árbol a. Por ejemplo, &lt;br /&gt;
     espejo (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = N e (N g (H h) (H f)) (N c (H d) (H a))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;espejo a = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;espejo (N e (N c (H a) (H d)) (N g (H f) (H h))) = &lt;br /&gt;
N e (N g (H h) (H f)) (N c (H d) (H a))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que&lt;br /&gt;
     preOrden (espejo a) = rev (postOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que&lt;br /&gt;
     postOrden (espejo a) = rev (preOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que&lt;br /&gt;
     inOrden (espejo a) = rev (inOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función &lt;br /&gt;
     raiz :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (raiz a) es la raiz del árbol a. Por ejemplo, &lt;br /&gt;
     raiz (N e (N c (H a) (H d)) (N g (H f) (H h))) = e&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun raiz :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;raiz a = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;raiz (N e (N c (H a) (H d)) (N g (H f) (H h))) = e&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir la función &lt;br /&gt;
     extremo_izquierda :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (extremo_izquierda a) es el nodo más a la izquierda del árbol&lt;br /&gt;
  a. Por ejemplo,  &lt;br /&gt;
     extremo_izquierda (N e (N c (H a) (H d)) (N g (H f) (H h))) = a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun extremo_izquierda :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;extremo_izquierda a = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;extremo_izquierda (N e (N c (H a) (H d)) (N g (H f) (H h))) = a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función &lt;br /&gt;
     extremo_derecha :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (extremo_derecha a) es el nodo más a la derecha del árbol&lt;br /&gt;
  a. Por ejemplo,  &lt;br /&gt;
     extremo_derecha (N e (N c (H a) (H d)) (N g (H f) (H h))) = h&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun extremo_derecha :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;extremo_derecha a = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;extremo_derecha (N e (N c (H a) (H d)) (N g (H f) (H h))) = h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar&lt;br /&gt;
     last (inOrden a) = extremo_derecha a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar&lt;br /&gt;
     hd (inOrden a) = extremo_izquierda a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = last (postOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     hd (inOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar o refutar&lt;br /&gt;
     last (postOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R12&amp;diff=673</id>
		<title>R12</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R12&amp;diff=673"/>
		<updated>2019-05-16T11:17:31Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R12: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R12&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que tiene información en los nodos y en las hojas. &lt;br /&gt;
  Por ejemplo, el árbol&lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
     a   d f   h &lt;br /&gt;
  se representa por &amp;quot;N e (N c (H a) (H d)) (N g (H f) (H h))&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = H &amp;quot;&amp;#039;a&amp;quot; | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;N e (N c (H a) (H d)) (N g (H f) (H h))&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función &lt;br /&gt;
     preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (preOrden a) es el recorrido pre orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     preOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [e,c,a,d,g,f,h] &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrden a = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
value &amp;quot;preOrden (N e (N c (H a) (H d)) (N g (H f) (H h))) = &lt;br /&gt;
  [e,c,a,d,g,f,h]&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función &lt;br /&gt;
     postOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (postOrden a) es el recorrido post orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     postOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [e,c,a,d,g,f,h] &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun postOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrden a = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;postOrden (N e (N c (H a) (H d)) (N g (H f) (H h))) = [a,d,c,f,h,g,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     inOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (inOrden a) es el recorrido in orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     inOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [a,c,d,e,f,g,h]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun inOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inOrden a = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inOrden (N e (N c (H a) (H d)) (N g (H f) (H h))) = [a,c,d,e,f,g,h]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot;&lt;br /&gt;
  tal que (espejo a) es la imagen especular del árbol a. Por ejemplo, &lt;br /&gt;
     espejo (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = N e (N g (H h) (H f)) (N c (H d) (H a))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;espejo a = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;espejo (N e (N c (H a) (H d)) (N g (H f) (H h))) = &lt;br /&gt;
N e (N g (H h) (H f)) (N c (H d) (H a))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que&lt;br /&gt;
     preOrden (espejo a) = rev (postOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que&lt;br /&gt;
     postOrden (espejo a) = rev (preOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que&lt;br /&gt;
     inOrden (espejo a) = rev (inOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función &lt;br /&gt;
     raiz :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (raiz a) es la raiz del árbol a. Por ejemplo, &lt;br /&gt;
     raiz (N e (N c (H a) (H d)) (N g (H f) (H h))) = e&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun raiz :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;raiz a = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;raiz (N e (N c (H a) (H d)) (N g (H f) (H h))) = e&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir la función &lt;br /&gt;
     extremo_izquierda :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (extremo_izquierda a) es el nodo más a la izquierda del árbol&lt;br /&gt;
  a. Por ejemplo,  &lt;br /&gt;
     extremo_izquierda (N e (N c (H a) (H d)) (N g (H f) (H h))) = a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun extremo_izquierda :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;extremo_izquierda a = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;extremo_izquierda (N e (N c (H a) (H d)) (N g (H f) (H h))) = a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función &lt;br /&gt;
     extremo_derecha :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (extremo_derecha a) es el nodo más a la derecha del árbol&lt;br /&gt;
  a. Por ejemplo,  &lt;br /&gt;
     extremo_derecha (N e (N c (H a) (H d)) (N g (H f) (H h))) = h&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun extremo_derecha :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;extremo_derecha a = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;extremo_derecha (N e (N c (H a) (H d)) (N g (H f) (H h))) = h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar&lt;br /&gt;
     last (inOrden a) = extremo_derecha a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar&lt;br /&gt;
     hd (inOrden a) = extremo_izquierda a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = last (postOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     hd (inOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar o refutar&lt;br /&gt;
     last (postOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=672</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=672"/>
		<updated>2019-05-16T11:16:29Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-18/ejercicios/ejercicios-LMF-2018-19.pdf libro de ejercicios].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R10.thy Programación funcional en Isabelle (2)] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R12.thy Recorridos de árboles en Isabelle/HOL] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]).&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R11&amp;diff=616</id>
		<title>R11</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R11&amp;diff=616"/>
		<updated>2019-04-30T09:59:40Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R11: Razonamiento sobre programas en Isabelle/HOL *}&lt;br /&gt;
 &lt;br /&gt;
theory R11&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
   En toda la relación de ejercicios las demostraciones han de realizarse&lt;br /&gt;
   de las formas siguientes:&lt;br /&gt;
    (*) detallada&lt;br /&gt;
    (*) estructurada&lt;br /&gt;
    (*) aplicativa&lt;br /&gt;
    (*) automática&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: nat ⇒ nat&lt;br /&gt;
  tal que &lt;br /&gt;
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaPotenciasDeDosMasUno 3  =  16&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot;&lt;br /&gt;
| &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
      sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;sumaPotenciasDeDosMasUno 3&amp;quot; ― ‹= 16›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que &lt;br /&gt;
     sumaPotenciasDeDosMasUno n = 2^(n+1)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma sumaPotenciasDeDosMasUno_d: &lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma sumaPotenciasDeDosMasUno_e: &lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma sumaPotenciasDeDosMasUno_a: &lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma sumaPotenciasDeDosMasUno_auto: &lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     copia :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (copia n x) es la lista formado por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     copia 3 x = [x,x,x]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun copia :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia 0 x       = []&amp;quot;&lt;br /&gt;
| &amp;quot;copia (Suc n) x = x # copia n x&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;copia 3 x&amp;quot; ― ‹= [x,x,x]›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&lt;br /&gt;
     todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&lt;br /&gt;
  Nota: La conjunción se representa por ∧&lt;br /&gt;
  ----------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos p (x#xs) = (p x ∧ todos p xs)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(1::nat)) [2,6,4]&amp;quot; ― ‹= True›&lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(2::nat)) [2,6,4]&amp;quot; ― ‹= False›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar que todos los elementos de (copia n x) son&lt;br /&gt;
  iguales a x. &lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
lemma todos_copia_d: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_copia_e: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
lemma todos_copia_a: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_copia_auto: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
    factR :: nat ⇒ nat&lt;br /&gt;
  tal que (factR n) es el factorial de n. Por ejemplo,&lt;br /&gt;
    factR 4 = 24&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun factR :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factR 0 = 1&amp;quot;&lt;br /&gt;
| &amp;quot;factR (Suc n) = Suc n * factR n&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;factR 4&amp;quot; ― ‹= 24›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Se considera la siguiente definición iterativa de la&lt;br /&gt;
  función factorial &lt;br /&gt;
     factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI n = factI&amp;#039; n 1&lt;br /&gt;
 &lt;br /&gt;
     factI&amp;#039; :: nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI&amp;#039; 0       x = x&lt;br /&gt;
     factI&amp;#039; (Suc n) x = factI&amp;#039; n (Suc n)*x&lt;br /&gt;
  Demostrar que, para todo n y todo x, se tiene &lt;br /&gt;
     factI&amp;#039; n x = x * factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun factI&amp;#039; :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI&amp;#039; 0       x = x&amp;quot;&lt;br /&gt;
| &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (x* (Suc n))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
fun factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI n = factI&amp;#039; n 1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
lemma fact_d: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma fact_e: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma fact_a: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma fact_auto: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que&lt;br /&gt;
     factI n = factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
corollary fact_equiv: &amp;quot;factI n = factR n&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir, recursivamente y sin usar (@), la función&lt;br /&gt;
     amplia :: &amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al&lt;br /&gt;
  final de la lista xs. Por ejemplo,&lt;br /&gt;
     amplia [d,a] t = [d,a,t]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;amplia []     y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;amplia (x#xs) y = x # amplia xs y&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;amplia [d,a] t&amp;quot; ― ‹= [d,a,t]›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que &lt;br /&gt;
     amplia xs y = xs @ [y]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
lemma amplia_append_d: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma amplia_append_e: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
lemma amplia_append_a: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma amplia_append_auto: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun algunos  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;algunos p [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;algunos p (x#xs) = ((p x) ∨ (algunos p xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar&lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma todos_conj_d: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_conj_e: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
lemma todos_conj_a: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_conj_auto: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar&lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma todos_append_d: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_append_e: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_append_a: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_append_auto: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar&lt;br /&gt;
     todos P (rev xs) = todos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma todos_rev_d: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_rev_e: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_rev_a: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_rev_auto: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar:&lt;br /&gt;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma algunos_map_d: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_map_e: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_map_a: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_map_auto: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar o refutar&lt;br /&gt;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma algunos_append_d: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_append_e: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_append_a: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_append_auto: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar&lt;br /&gt;
     algunos P (rev xs) = algunos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma algunos_rev_d: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_rev_e: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_rev_a: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_rev_auto: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  y demostrar la equivalencia de forma automática y detallada.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar o refutar&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma algunos_no_todos_d: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_no_todos_e: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_no_todos_a: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_no_todos_auto: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Definir la función&lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;estaEn x [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a#xs) = (x=a ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  Demostrar dicha relación de forma automática y detallada.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Definir la función&lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;sinDuplicados [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (a#xs) = ((¬ estaEn a xs) ∧ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Definir la función&lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida &lt;br /&gt;
  remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
&amp;quot;borraDuplicados [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (a#xs) = (if estaEn a xs&lt;br /&gt;
  then borraDuplicados xs&lt;br /&gt;
  else (a#borraDuplicados xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar o refutar&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma length_borraDuplicados_d:&lt;br /&gt;
&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma length_borraDuplicados_e:&lt;br /&gt;
&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma length_borraDuplicados_a:&lt;br /&gt;
&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma length_borraDuplicados_auto:&lt;br /&gt;
&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar o refutar&lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_borraDuplicados_d:&lt;br /&gt;
&amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_borraDuplicados_e:&lt;br /&gt;
&amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_borraDuplicados_a:&lt;br /&gt;
&amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_borraDuplicados_auto:&lt;br /&gt;
&amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar o refutar&lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma sinDuplicados_borraDuplicados_d:&lt;br /&gt;
&amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma sinDuplicados_borraDuplicados_e:&lt;br /&gt;
&amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma sinDuplicados_borraDuplicados_a:&lt;br /&gt;
&amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma sinDuplicados_borraDuplicados_auto:&lt;br /&gt;
&amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 28. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R11&amp;diff=615</id>
		<title>R11</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R11&amp;diff=615"/>
		<updated>2019-04-30T09:59:20Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R11: Razonamiento sobre programas en Isabelle/HOL *}&lt;br /&gt;
 &lt;br /&gt;
theory R11&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
   En toda la relación de ejercicios las demostraciones han de realizarse&lt;br /&gt;
   de las formas siguientes:&lt;br /&gt;
    (*) detallada&lt;br /&gt;
    (*) estructurada&lt;br /&gt;
    (*) aplicativa&lt;br /&gt;
    (*) automática&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: nat ⇒ nat&lt;br /&gt;
  tal que &lt;br /&gt;
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaPotenciasDeDosMasUno 3  =  16&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot;&lt;br /&gt;
| &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
      sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;sumaPotenciasDeDosMasUno 3&amp;quot; ― ‹= 16›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que &lt;br /&gt;
     sumaPotenciasDeDosMasUno n = 2^(n+1)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma sumaPotenciasDeDosMasUno_d: &lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma sumaPotenciasDeDosMasUno_e: &lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma sumaPotenciasDeDosMasUno_a: &lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma sumaPotenciasDeDosMasUno_auto: &lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     copia :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (copia n x) es la lista formado por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     copia 3 x = [x,x,x]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun copia :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia 0 x       = []&amp;quot;&lt;br /&gt;
| &amp;quot;copia (Suc n) x = x # copia n x&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;copia 3 x&amp;quot; ― ‹= [x,x,x]›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&lt;br /&gt;
     todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&lt;br /&gt;
  Nota: La conjunción se representa por ∧&lt;br /&gt;
  ----------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos p (x#xs) = (p x ∧ todos p xs)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(1::nat)) [2,6,4]&amp;quot; ― ‹= True›&lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(2::nat)) [2,6,4]&amp;quot; ― ‹= False›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar que todos los elementos de (copia n x) son&lt;br /&gt;
  iguales a x. &lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
lemma todos_copia_d: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_copia_e: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
lemma todos_copia_a: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_copia_auto: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
    factR :: nat ⇒ nat&lt;br /&gt;
  tal que (factR n) es el factorial de n. Por ejemplo,&lt;br /&gt;
    factR 4 = 24&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun factR :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factR 0 = 1&amp;quot;&lt;br /&gt;
| &amp;quot;factR (Suc n) = Suc n * factR n&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;factR 4&amp;quot; ― ‹= 24›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Se considera la siguiente definición iterativa de la&lt;br /&gt;
  función factorial &lt;br /&gt;
     factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI n = factI&amp;#039; n 1&lt;br /&gt;
 &lt;br /&gt;
     factI&amp;#039; :: nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI&amp;#039; 0       x = x&lt;br /&gt;
     factI&amp;#039; (Suc n) x = factI&amp;#039; n (Suc n)*x&lt;br /&gt;
  Demostrar que, para todo n y todo x, se tiene &lt;br /&gt;
     factI&amp;#039; n x = x * factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun factI&amp;#039; :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI&amp;#039; 0       x = x&amp;quot;&lt;br /&gt;
| &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (x* (Suc n))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
fun factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI n = factI&amp;#039; n 1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
lemma fact_d: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma fact_e: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma fact_a: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma fact_auto: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que&lt;br /&gt;
     factI n = factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
corollary fact_equiv: &amp;quot;factI n = factR n&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir, recursivamente y sin usar (@), la función&lt;br /&gt;
     amplia :: &amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al&lt;br /&gt;
  final de la lista xs. Por ejemplo,&lt;br /&gt;
     amplia [d,a] t = [d,a,t]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;amplia []     y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;amplia (x#xs) y = x # amplia xs y&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;amplia [d,a] t&amp;quot; ― ‹= [d,a,t]›&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que &lt;br /&gt;
     amplia xs y = xs @ [y]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
lemma amplia_append_d: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma amplia_append_e: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
lemma amplia_append_a: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma amplia_append_auto: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun algunos  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;algunos p [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;algunos p (x#xs) = ((p x) ∨ (algunos p xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar&lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma todos_conj_d: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_conj_e: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
lemma todos_conj_a: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_conj_auto: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar&lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma todos_append_d: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_append_e: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_append_a: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_append_auto: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar&lt;br /&gt;
     todos P (rev xs) = todos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma todos_rev_d: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_rev_e: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_rev_a: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma todos_rev_auto: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar:&lt;br /&gt;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma algunos_map_d: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_map_e: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_map_a: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_map_auto: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
  &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar o refutar&lt;br /&gt;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma algunos_append_d: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_append_e: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_append_a: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_append_auto: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar o refutar&lt;br /&gt;
     algunos P (rev xs) = algunos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma algunos_rev_d: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_rev_e: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_rev_a: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_rev_auto: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  y demostrar la equivalencia de forma automática y detallada.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar o refutar&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma algunos_no_todos_d: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_no_todos_e: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_no_todos_a: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma algunos_no_todos_auto: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Definir la función&lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;estaEn x [] = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a#xs) = (x=a ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  Demostrar dicha relación de forma automática y detallada.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Definir la función&lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;sinDuplicados [] = True&amp;quot;&lt;br /&gt;
| &amp;quot;sinDuplicados (a#xs) = ((¬ estaEn a xs) ∧ sinDuplicados xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Definir la función&lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida &lt;br /&gt;
  remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
&amp;quot;borraDuplicados [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;borraDuplicados (a#xs) = (if estaEn a xs&lt;br /&gt;
  then borraDuplicados xs&lt;br /&gt;
  else (a#borraDuplicados xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar o refutar&lt;br /&gt;
     length (borraDuplicados xs) ≤ length xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma length_borraDuplicados_d:&lt;br /&gt;
&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma length_borraDuplicados_e:&lt;br /&gt;
&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma length_borraDuplicados_a:&lt;br /&gt;
&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma length_borraDuplicados_auto:&lt;br /&gt;
&amp;quot;length (borraDuplicados xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar o refutar&lt;br /&gt;
     estaEn a (borraDuplicados xs) = estaEn a xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_borraDuplicados_d:&lt;br /&gt;
&amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_borraDuplicados_e:&lt;br /&gt;
&amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_borraDuplicados_a:&lt;br /&gt;
&amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma estaEn_borraDuplicados_auto:&lt;br /&gt;
&amp;quot;estaEn a (borraDuplicados xs) = estaEn a xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar o refutar&lt;br /&gt;
     sinDuplicados (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma sinDuplicados_borraDuplicados_d:&lt;br /&gt;
&amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma sinDuplicados_borraDuplicados_e:&lt;br /&gt;
&amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma sinDuplicados_borraDuplicados_a:&lt;br /&gt;
&amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma sinDuplicados_borraDuplicados_auto:&lt;br /&gt;
&amp;quot;sinDuplicados (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 28. Demostrar o refutar:&lt;br /&gt;
    borraDuplicados (rev xs) = rev (borraDuplicados xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;borraDuplicados (rev xs) = rev (borraDuplicados xs)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=614</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=614"/>
		<updated>2019-04-30T09:58:07Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-18/ejercicios/ejercicios-LMF-2018-19.pdf libro de ejercicios].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R10.thy Programación funcional en Isabelle (2)] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]).&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=613</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=613"/>
		<updated>2019-04-30T09:57:48Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-18/ejercicios/ejercicios-LMF-2018-19.pdf libro de ejercicios].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R10.thy Programación funcional en Isabelle (2)] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R11.thy razonamiento sobre programas en Isabelle/HOL] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]).&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R10&amp;diff=594</id>
		<title>R10</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R10&amp;diff=594"/>
		<updated>2019-04-25T10:50:39Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R10: Programación funcional en Isabelle/HOL *}&lt;br /&gt;
 &lt;br /&gt;
theory R10&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
 &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: nat ⇒ nat&lt;br /&gt;
  tal que &lt;br /&gt;
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaPotenciasDeDosMasUno 3  =  16&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
(* value &amp;quot;sumaPotenciasDeDosMasUno 3&amp;quot; ― ‹= 16› *)&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Se considera la siguiente definición de la&lt;br /&gt;
  función factorial &lt;br /&gt;
     factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI n = factI&amp;#039; n 1&lt;br /&gt;
 &lt;br /&gt;
     factI&amp;#039; :: nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI&amp;#039; 0       x = x&lt;br /&gt;
     factI&amp;#039; (Suc n) x = factI&amp;#039; n (Suc n)*x&lt;br /&gt;
&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun factI&amp;#039; :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI&amp;#039; n x = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI n = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
(* value &amp;quot;factI 4&amp;quot; ― ‹= 24› *)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir, recursivamente y sin usar (@), la función&lt;br /&gt;
     amplia :: &amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al&lt;br /&gt;
  final de la lista xs. Por ejemplo,&lt;br /&gt;
     amplia [d,a] t = [d,a,t]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;amplia xs = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
(* value &amp;quot;amplia [d,a] t&amp;quot; ― ‹= [d,a,t]› *)&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&lt;br /&gt;
     todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&lt;br /&gt;
  Nota: La conjunción se representa por ∧&lt;br /&gt;
  ----------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p xs = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
(* value &amp;quot;todos (λx. x&amp;gt;(1::nat)) [2,6,4]&amp;quot; ― ‹= True› *)&lt;br /&gt;
(* value &amp;quot;todos (λx. x&amp;gt;(2::nat)) [2,6,4]&amp;quot; ― ‹= False› *)&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun algunos  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;algunos p xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir recursivamente la función &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;estaEn x xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir recursivamemte la función&lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;sinDuplicados xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la recursivamente la función&lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida &lt;br /&gt;
  remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
&amp;quot;borraDuplicados xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R10&amp;diff=593</id>
		<title>R10</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R10&amp;diff=593"/>
		<updated>2019-04-25T10:50:26Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R10: Programación funcional en Isabelle/HOL *}&lt;br /&gt;
 &lt;br /&gt;
theory R10&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
 &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: nat ⇒ nat&lt;br /&gt;
  tal que &lt;br /&gt;
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaPotenciasDeDosMasUno 3  =  16&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
(* value &amp;quot;sumaPotenciasDeDosMasUno 3&amp;quot; ― ‹= 16› *)&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Se considera la siguiente definición de la&lt;br /&gt;
  función factorial &lt;br /&gt;
     factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI n = factI&amp;#039; n 1&lt;br /&gt;
 &lt;br /&gt;
     factI&amp;#039; :: nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI&amp;#039; 0       x = x&lt;br /&gt;
     factI&amp;#039; (Suc n) x = factI&amp;#039; n (Suc n)*x&lt;br /&gt;
&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun factI&amp;#039; :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI&amp;#039; n x = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI n = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
(* value &amp;quot;factI 4&amp;quot; ― ‹= 24› *)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir, recursivamente y sin usar (@), la función&lt;br /&gt;
     amplia :: &amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al&lt;br /&gt;
  final de la lista xs. Por ejemplo,&lt;br /&gt;
     amplia [d,a] t = [d,a,t]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;amplia xs = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
(* value &amp;quot;amplia [d,a] t&amp;quot; ― ‹= [d,a,t]› *)&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&lt;br /&gt;
     todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&lt;br /&gt;
  Nota: La conjunción se representa por ∧&lt;br /&gt;
  ----------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p xs = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
(* value &amp;quot;todos (λx. x&amp;gt;(1::nat)) [2,6,4]&amp;quot; ― ‹= True› *)&lt;br /&gt;
(* value &amp;quot;todos (λx. x&amp;gt;(2::nat)) [2,6,4]&amp;quot; ― ‹= False› *)&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun algunos  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;algunos p xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir recursivamente la función &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;estaEn x xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir recursivamemte la función&lt;br /&gt;
     sinDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (sinDuplicados xs) se verifica si la lista xs no contiene&lt;br /&gt;
  duplicados. Por ejemplo,  &lt;br /&gt;
     sinDuplicados [1::nat,4,2]   = True&lt;br /&gt;
     sinDuplicados [1::nat,4,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun sinDuplicados :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
&amp;quot;sinDuplicados xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la recursivamente la función&lt;br /&gt;
     borraDuplicados :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (borraDuplicados xs) es la lista obtenida eliminando los&lt;br /&gt;
  elementos duplicados de la lista xs. Por ejemplo, &lt;br /&gt;
     borraDuplicados [1::nat,2,4,2,3] = [1,4,2,3]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función borraDuplicados es equivalente a la predefinida &lt;br /&gt;
  remdups. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fun borraDuplicados :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
&amp;quot;borraDuplicados xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=592</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=592"/>
		<updated>2019-04-25T10:47:32Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-18/ejercicios/ejercicios-LMF-2018-19.pdf libro de ejercicios].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R10.thy Programación funcional en Isabelle (2)] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]).&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R9&amp;diff=583</id>
		<title>R9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R9&amp;diff=583"/>
		<updated>2019-04-23T11:48:38Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R9 Programación funcional en Isabelle *}&lt;br /&gt;
&lt;br /&gt;
theory R9&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 0. Definir, por recursión, la función&lt;br /&gt;
     factorial :: nat ⇒ nat&lt;br /&gt;
  tal que (factorial n) es el factorial de n. Por ejemplo,&lt;br /&gt;
     factorial 4 = 24&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun factorial :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factorial n = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* value &amp;quot;factorial (4::nat)&amp;quot;*)&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Definir, por recursión, la función&lt;br /&gt;
     longitud :: &amp;#039;a list ⇒ nat&lt;br /&gt;
  tal que (longitud xs) es la longitud de la listas xs. Por ejemplo,&lt;br /&gt;
     longitud [4,2,5] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
fun longitud :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;longitud xs = undefined&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
value &amp;quot;longitud [a,b,c]&amp;quot; ― ‹= 3› &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     fun intercambia :: &amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&lt;br /&gt;
  tal que (intercambia p) es el par obtenido intercambiando las&lt;br /&gt;
  componentes del par p. Por ejemplo,&lt;br /&gt;
     intercambia (u,v) = (v,u)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun intercambia :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;intercambia (x,y) = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;intercambia (u,v)&amp;quot; ― ‹= (v,u)›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir, por recursión, la función&lt;br /&gt;
     inversa :: &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (inversa xs) es la lista obtenida invirtiendo el orden de los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     inversa [a,d,c] = [c,d,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversa :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa [a,d,c]&amp;quot; ― ‹= [c,d,a]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     repite :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (repite n x) es la lista formada por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     repite 3 a = [a,a,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun repite :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite n x = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;repite 3 a&amp;quot; ― ‹= [a,a,a]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     conc :: &amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (conc xs ys) es la concatención de las listas xs e ys. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     conc [a,d] [b,d,a,c] = [a,d,b,d,a,c]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun conc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc xs ys = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc [a,d] [b,d,a,c]&amp;quot; ― ‹= [a,d,b,d,a,c]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     coge :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (coge n xs) es la lista de los n primeros elementos de xs. Por &lt;br /&gt;
  ejemplo, &lt;br /&gt;
     coge 2 [a,c,d,b,e] = [a,c]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge n xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge 2 [a,c,d,b,e]&amp;quot; ― ‹= [a,c]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     elimina :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
  elementos de xs. Por ejemplo, &lt;br /&gt;
     elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina 2 [a,c,d,b,e]&amp;quot; ― ‹= [d,b,e]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la función&lt;br /&gt;
     esVacia :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (esVacia xs) se verifica si xs es la lista vacía. Por ejemplo,&lt;br /&gt;
     esVacia []  = True&lt;br /&gt;
     esVacia [1] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun esVacia :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
value &amp;quot;esVacia []&amp;quot;  ― ‹= True›&lt;br /&gt;
value &amp;quot;esVacia [1]&amp;quot; ― ‹= False›&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función&lt;br /&gt;
     inversaAc :: &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (inversaAc xs) es a inversa de xs calculada usando&lt;br /&gt;
  acumuladores. Por ejemplo, &lt;br /&gt;
     inversaAc [a,c,b,e] = [e,b,c,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversaAcAux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux xs ys = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc [a,c,b,e]&amp;quot; ― ‹= [e,b,c,a]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir la función&lt;br /&gt;
     sum :: nat list ⇒ nat&lt;br /&gt;
  tal que (sum xs) es la suma de los elementos de xs. Por ejemplo,&lt;br /&gt;
     sum [3,2,5] = 10&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sum :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sum xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
value &amp;quot;sum [3,2,5]&amp;quot; ― ‹= 10›&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función&lt;br /&gt;
     map :: (&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&lt;br /&gt;
  tal que (map f xs) es la lista obtenida aplicando la función f a los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     map (λx. 2*x) [3,2,5] = [6,4,10]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun map :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map f xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
value &amp;quot;map (λx. 2*x) [3::nat,2,5]&amp;quot; ― ‹= [6,4,10]›&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R9&amp;diff=582</id>
		<title>R9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R9&amp;diff=582"/>
		<updated>2019-04-23T11:48:26Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R9 Programación funcional en Isabelle *}&lt;br /&gt;
&lt;br /&gt;
theory R9&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 0. Definir, por recursión, la función&lt;br /&gt;
     factorial :: nat ⇒ nat&lt;br /&gt;
  tal que (factorial n) es el factorial de n. Por ejemplo,&lt;br /&gt;
     factorial 4 = 24&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun factorial :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factorial n = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* value &amp;quot;factorial (4::nat)&amp;quot;*)&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Definir, por recursión, la función&lt;br /&gt;
     longitud :: &amp;#039;a list ⇒ nat&lt;br /&gt;
  tal que (longitud xs) es la longitud de la listas xs. Por ejemplo,&lt;br /&gt;
     longitud [4,2,5] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
fun longitud :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;longitud xs = undefined&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
value &amp;quot;longitud [a,b,c]&amp;quot; ― ‹= 3› &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     fun intercambia :: &amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&lt;br /&gt;
  tal que (intercambia p) es el par obtenido intercambiando las&lt;br /&gt;
  componentes del par p. Por ejemplo,&lt;br /&gt;
     intercambia (u,v) = (v,u)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun intercambia :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;intercambia (x,y) = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;intercambia (u,v)&amp;quot; ― ‹= (v,u)›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir, por recursión, la función&lt;br /&gt;
     inversa :: &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (inversa xs) es la lista obtenida invirtiendo el orden de los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     inversa [a,d,c] = [c,d,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversa :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa [a,d,c]&amp;quot; ― ‹= [c,d,a]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     repite :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (repite n x) es la lista formada por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     repite 3 a = [a,a,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun repite :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite n x = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;repite 3 a&amp;quot; ― ‹= [a,a,a]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     conc :: &amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (conc xs ys) es la concatención de las listas xs e ys. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     conc [a,d] [b,d,a,c] = [a,d,b,d,a,c]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun conc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc xs ys = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc [a,d] [b,d,a,c]&amp;quot; ― ‹= [a,d,b,d,a,c]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     coge :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (coge n xs) es la lista de los n primeros elementos de xs. Por &lt;br /&gt;
  ejemplo, &lt;br /&gt;
     coge 2 [a,c,d,b,e] = [a,c]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge n xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge 2 [a,c,d,b,e]&amp;quot; ― ‹= [a,c]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     elimina :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
  elementos de xs. Por ejemplo, &lt;br /&gt;
     elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina 2 [a,c,d,b,e]&amp;quot; ― ‹= [d,b,e]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la función&lt;br /&gt;
     esVacia :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (esVacia xs) se verifica si xs es la lista vacía. Por ejemplo,&lt;br /&gt;
     esVacia []  = True&lt;br /&gt;
     esVacia [1] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun esVacia :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
value &amp;quot;esVacia []&amp;quot;  ― ‹= True›&lt;br /&gt;
value &amp;quot;esVacia [1]&amp;quot; ― ‹= False›&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función&lt;br /&gt;
     inversaAc :: &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (inversaAc xs) es a inversa de xs calculada usando&lt;br /&gt;
  acumuladores. Por ejemplo, &lt;br /&gt;
     inversaAc [a,c,b,e] = [e,b,c,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversaAcAux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux xs ys = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc [a,c,b,e]&amp;quot; ― ‹= [e,b,c,a]›&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir la función&lt;br /&gt;
     sum :: nat list ⇒ nat&lt;br /&gt;
  tal que (sum xs) es la suma de los elementos de xs. Por ejemplo,&lt;br /&gt;
     sum [3,2,5] = 10&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sum :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sum xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
value &amp;quot;sum [3,2,5]&amp;quot; ― ‹= 10›&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función&lt;br /&gt;
     map :: (&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&lt;br /&gt;
  tal que (map f xs) es la lista obtenida aplicando la función f a los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     map (λx. 2*x) [3,2,5] = [6,4,10]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun map :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map f xs = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
value &amp;quot;map (λx. 2*x) [3::nat,2,5]&amp;quot; ― ‹= [6,4,10]›&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=581</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=581"/>
		<updated>2019-04-23T11:47:28Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-18/ejercicios/ejercicios-LMF-2018-19.pdf libro de ejercicios].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]]).&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_7&amp;diff=566</id>
		<title>Sol 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_7&amp;diff=566"/>
		<updated>2019-04-09T10:53:11Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
theory R7_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  El objetivo de esta relación es escribir demostraciones usando sólo&lt;br /&gt;
  las reglas básicas de deducción natural de la lógica proposicional y&lt;br /&gt;
  los métodos rule, erule, frule, drule y assumption.&lt;br /&gt;
&lt;br /&gt;
  Las reglas básicas de la deducción natural son las siguientes:&lt;br /&gt;
  · conjI:          ⟦P; Q⟧ ⟹ P ∧ Q&lt;br /&gt;
  · conjunct1:      P ∧ Q ⟹ P&lt;br /&gt;
  · conjunct2:      P ∧ Q ⟹ Q&lt;br /&gt;
  · conjE:          ⟦P ∧ Q; ⟦P; Q⟧ ⟹ R⟧ ⟹ R&lt;br /&gt;
  · notE:           ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  · notI:           (P ⟹ False) ⟹ ¬P&lt;br /&gt;
  · mp:             ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
  · mt:             ⟦F ⟶ G; ¬G⟧ ⟹ ¬F &lt;br /&gt;
  · impI:           (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
  · impE:           ⟦P ⟶ Q; P; Q ⟹ R⟧ ⟹ R&lt;br /&gt;
  · disjI1:         P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2:         Q ⟹ P ∨ Q&lt;br /&gt;
  · disjE:          ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R &lt;br /&gt;
  · FalseE:         False ⟹ P&lt;br /&gt;
  · iffI:           ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P = Q&lt;br /&gt;
  · iffD1:          ⟦Q = P; Q⟧ ⟹ P &lt;br /&gt;
  · iffD2:          ⟦P = Q; Q⟧ ⟹ P&lt;br /&gt;
  · iffE:           ⟦P = Q; ⟦P ⟶ Q; Q ⟶ P⟧ ⟹ R⟧ ⟹ R&lt;br /&gt;
  · notnotD:        ¬¬ P ⟹ P&lt;br /&gt;
  · not_not:        P = ¬¬P&lt;br /&gt;
  · ccontr:         (¬P ⟹ False) ⟹ P&lt;br /&gt;
  · excluded_midle: ¬P ∨ P&lt;br /&gt;
  · classical:      (¬ P ⟹ P) ⟹ P&lt;br /&gt;
  · contrapos_nn    ⟦¬Q; P ⟹ Q⟧ ⟹ ¬P&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Implicaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       p ⟶ q, p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej1: &amp;quot;⟦p ⟶ q; p⟧ ⟹ q&amp;quot; &lt;br /&gt;
  apply (erule mp)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej2: &amp;quot;⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r&amp;quot;&lt;br /&gt;
  apply (erule mp)+&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done  &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r), p ⟶ q, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej3a: &amp;quot;⟦p ⟶ (q ⟶ r); p ⟶ q; p⟧ ⟹ r&amp;quot;&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption+&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
lemma ej3b: &amp;quot;⟦p ⟶ (q ⟶ r); p ⟶ q; p⟧ ⟹ r&amp;quot;&lt;br /&gt;
  apply (erule impE, assumption+)+&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r ⊢ p ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ej4: &amp;quot;⟦p ⟶ q; q ⟶ r⟧ ⟹ p ⟶ r&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule mp)&lt;br /&gt;
  apply (erule mp)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ q ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej5: &amp;quot;p ⟶ (q ⟶ r) ⟹ q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule impE, assumption)&lt;br /&gt;
  apply (erule impE, assumption+)&lt;br /&gt;
  done  &lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ (p ⟶ q) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej6: &amp;quot;p ⟶ (q ⟶ r) ⟹ (p ⟶ q) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule impE, assumption)&lt;br /&gt;
  apply (erule impE, assumption)&lt;br /&gt;
  apply (erule impE, assumption+)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar&lt;br /&gt;
     p ⊢ q ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej7: &amp;quot;p ⟹ q ⟶ p&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar&lt;br /&gt;
     ⊢ p ⟶ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej8: &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ (q ⟶ r) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej9: &amp;quot;p ⟶ q ⟹ (q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule impE, assumption)&lt;br /&gt;
  apply (erule impE, assumption+)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ (r ⟶ s)) ⊢ r ⟶ (q ⟶ (p ⟶ s))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej10: &amp;quot;p ⟶ (q ⟶ (r ⟶ s)) ⟹ r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
  apply (rule impI)+&lt;br /&gt;
  apply (erule impE, assumption+)+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej11: &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
  apply (rule impI)+&lt;br /&gt;
  apply (erule impE, assumption+)+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej12: &amp;quot;(p ⟶ q) ⟶ r ⟹ p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  apply (rule impI)+&lt;br /&gt;
  apply (rule_tac P=&amp;quot;p ⟶ q&amp;quot; in mp)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
  &lt;br /&gt;
section {* Conjunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar&lt;br /&gt;
     p, q ⊢  p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej13: &amp;quot;⟦p; q⟧ ⟹ p ∧ q&amp;quot;&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej14: &amp;quot;p ∧ q ⟹ p&amp;quot;&lt;br /&gt;
  apply (erule conjunct1)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar&lt;br /&gt;
     p ∧ q ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej15: &amp;quot;p ∧ q ⟹ q&amp;quot;&lt;br /&gt;
  apply (erule conjunct2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar&lt;br /&gt;
     p ∧ (q ∧ r) ⊢ (p ∧ q) ∧ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej16: &amp;quot;p ∧ (q ∧ r) ⟹ (p ∧ q) ∧ r&amp;quot;&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (rule conjI)&lt;br /&gt;
    apply (erule conjunct1)&lt;br /&gt;
   apply (drule conjunct2)&lt;br /&gt;
   apply (erule conjunct1)&lt;br /&gt;
  apply (drule conjunct2)&lt;br /&gt;
  apply (erule conjunct2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar&lt;br /&gt;
     (p ∧ q) ∧ r ⊢ p ∧ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej17: &amp;quot;(p ∧ q) ∧ r ⟹ p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (drule conjunct1)&lt;br /&gt;
   apply (erule conjunct1)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (drule conjunct1)&lt;br /&gt;
   apply (erule conjunct2)&lt;br /&gt;
  apply (erule conjunct2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej18: &amp;quot;p ∧ q ⟹ p ⟶ q&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule conjunct2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar&lt;br /&gt;
     (p ⟶ q) ∧ (p ⟶ r) ⊢ p ⟶ q ∧ r   &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej19: &amp;quot;(p ⟶ q) ∧ (p ⟶ r) ⟹ p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (drule conjunct1)&lt;br /&gt;
   apply (erule impE)&lt;br /&gt;
    apply assumption&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (drule conjunct2)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar&lt;br /&gt;
     p ⟶ q ∧ r ⊢ (p ⟶ q) ∧ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej20: &amp;quot;p ⟶ q ∧ r ⟹ (p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (rule impI)&lt;br /&gt;
   apply (erule impE)&lt;br /&gt;
    apply assumption&lt;br /&gt;
    apply (erule conjunct1)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule conjunct2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej21_1: &amp;quot;p ⟶ (q ⟶ r) ⟹ p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar&lt;br /&gt;
     p ∧ q ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej22: &amp;quot;p ∧ q ⟶ r ⟹ p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
    apply (rule conjI)&lt;br /&gt;
    apply assumption+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej23: &amp;quot;(p ⟶ q) ⟶ r ⟹ p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply (rule impI)&lt;br /&gt;
   apply (erule conjunct2)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar&lt;br /&gt;
     p ∧ (q ⟶ r) ⊢ (p ⟶ q) ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej24: &amp;quot;p ∧ (q ⟶ r) ⟹ (p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
section {* Disyunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar&lt;br /&gt;
     p ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej25: &amp;quot;p ⟹ p ∨ q&amp;quot;&lt;br /&gt;
  apply (erule disjI1)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar&lt;br /&gt;
     q ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej26: &amp;quot;q ⟹ p ∨ q&amp;quot;&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar&lt;br /&gt;
     p ∨ q ⊢ q ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej27: &amp;quot;p ∨ q ⟹ q ∨ p&amp;quot;&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule disjI2)&lt;br /&gt;
  apply (erule disjI1)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 28. Demostrar&lt;br /&gt;
     q ⟶ r ⊢ p ∨ q ⟶ p ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej28: &amp;quot;q ⟶ r ⟹ p ∨ q ⟶ p ∨ r&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule disjI1)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 29. Demostrar&lt;br /&gt;
     p ∨ p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej29: &amp;quot;p ∨ p ⟹ p&amp;quot;&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply assumption+&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 30. Demostrar&lt;br /&gt;
     p ⊢ p ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej30: &amp;quot;p ⟹ p ∨ p&amp;quot;&lt;br /&gt;
  apply (erule disjI1)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 31. Demostrar&lt;br /&gt;
     p ∨ (q ∨ r) ⊢ (p ∨ q) ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej31: &amp;quot;p ∨ (q ∨ r) ⟹ (p ∨ q) ∨ r&amp;quot;&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (rule disjI1)&lt;br /&gt;
   apply (erule disjI1)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (rule disjI1)&lt;br /&gt;
   apply (erule disjI2)&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 32. Demostrar&lt;br /&gt;
     (p ∨ q) ∨ r ⊢ p ∨ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej32: &amp;quot;(p ∨ q) ∨ r ⟹ p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule disjE)&lt;br /&gt;
    apply (erule disjI1)&lt;br /&gt;
   apply (rule disjI2)&lt;br /&gt;
   apply (erule disjI1)&lt;br /&gt;
  apply (rule disjI2)&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 33. Demostrar&lt;br /&gt;
     p ∧ (q ∨ r) ⊢ (p ∧ q) ∨ (p ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej33: &amp;quot;p ∧ (q ∨ r) ⟹ (p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (rule disjI1)&lt;br /&gt;
   apply (rule conjI)&lt;br /&gt;
    apply assumption&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (rule disjI2)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 34. Demostrar&lt;br /&gt;
     (p ∧ q) ∨ (p ∧ r) ⊢ p ∧ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej34: &amp;quot;(p ∧ q) ∨ (p ∧ r) ⟹ p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (erule disjE)&lt;br /&gt;
    apply (erule conjunct1)&lt;br /&gt;
   apply (erule conjunct1)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule conjE)&lt;br /&gt;
   apply (rule disjI1)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 35. Demostrar&lt;br /&gt;
     p ∨ (q ∧ r) ⊢ (p ∨ q) ∧ (p ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej35: &amp;quot;p ∨ (q ∧ r) ⟹ (p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (rule conjI)&lt;br /&gt;
    apply (erule disjI1)&lt;br /&gt;
   apply (erule disjI1)&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (erule disjI2)&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 36. Demostrar&lt;br /&gt;
     (p ∨ q) ∧ (p ∨ r) ⊢ p ∨ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej36: &amp;quot;(p ∨ q) ∧ (p ∨ r) ⟹ p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule disjI1)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule disjI1)&lt;br /&gt;
  apply (rule disjI2)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply assumption+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 37. Demostrar&lt;br /&gt;
     (p ⟶ r) ∧ (q ⟶ r) ⊢ p ∨ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej37: &amp;quot;(p ⟶ r) ∧ (q ⟶ r) ⟹ p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule impE, assumption+)+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 38. Demostrar&lt;br /&gt;
     p ∨ q ⟶ r ⊢ (p ⟶ r) ∧ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej38: &amp;quot;p ∨ q ⟶ r ⟹ (p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (rule impI)&lt;br /&gt;
   apply (erule impE)&lt;br /&gt;
    apply (erule disjI1)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
section {* Negación *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 39. Demostrar&lt;br /&gt;
     p ⊢ ¬¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej39: &amp;quot;p ⟹ ¬¬p&amp;quot;&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 40. Demostrar&lt;br /&gt;
     ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej40: &amp;quot;¬p ⟹ p ⟶ q&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 41. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ ¬q ⟶ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej41: &amp;quot;p ⟶ q ⟹ ¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 42. Demostrar&lt;br /&gt;
     p ∨ q, ¬q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej42: &amp;quot;⟦p ∨ q; ¬q⟧ ⟹ p&amp;quot;&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 43. Demostrar&lt;br /&gt;
     p ∨ q, ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej43: &amp;quot;⟦p ∨ q; ¬p⟧ ⟹ q&amp;quot;&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule notE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 44. Demostrar&lt;br /&gt;
     p ∨ q ⊢ ¬(¬p ∧ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej44: &amp;quot;p ∨ q ⟹ ¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule notE, assumption)+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 45. Demostrar&lt;br /&gt;
     p ∧ q ⊢ ¬(¬p ∨ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej45: &amp;quot;p ∧ q ⟹ ¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule notE, assumption)+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 46. Demostrar&lt;br /&gt;
     ¬(p ∨ q) ⊢ ¬p ∧ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej46: &amp;quot;¬(p ∨ q) ⟹ ¬p ∧ ¬q&amp;quot;&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (rule notI)&lt;br /&gt;
   apply (erule notE)&lt;br /&gt;
   apply (erule disjI1)&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 47. Demostrar&lt;br /&gt;
     ¬p ∧ ¬q ⊢ ¬(p ∨ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej47: &amp;quot;¬p ∧ ¬q ⟹ ¬(p ∨ q)&amp;quot;&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule notE, assumption)+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 48. Demostrar&lt;br /&gt;
     ¬p ∨ ¬q ⊢ ¬(p ∧ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej48: &amp;quot;¬p ∨ ¬q ⟹ ¬(p ∧ q)&amp;quot;&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule notE, assumption)+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 49. Demostrar&lt;br /&gt;
     ⊢ ¬(p ∧ ¬p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej49: &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 50. Demostrar&lt;br /&gt;
     p ∧ ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej50: &amp;quot;p ∧ ¬p ⟹ q&amp;quot;&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 51. Demostrar&lt;br /&gt;
     ¬¬p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej51: &amp;quot;¬¬p ⟹ p&amp;quot;&lt;br /&gt;
  apply (erule notnotD)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 52. Demostrar&lt;br /&gt;
     ⊢ p ∨ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej52: &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
  apply (cut_tac P=&amp;quot;¬p&amp;quot; in excluded_middle)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
  apply (rule disjI1)&lt;br /&gt;
   apply (erule notnotD)&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 53. Demostrar&lt;br /&gt;
     ⊢ ((p ⟶ q) ⟶ p) ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej53: &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule ccontr)&lt;br /&gt;
  apply (cut_tac P=&amp;quot;p ⟶ q&amp;quot; in excluded_middle)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule_tac P=&amp;quot;p ⟶ q&amp;quot; in notE)&lt;br /&gt;
   apply (rule impI)&lt;br /&gt;
   apply (erule notE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 54. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej54: &amp;quot;¬q ⟶ ¬p ⟹ p ⟶ q&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule ccontr)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule notE)+&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 55. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej55: &amp;quot;¬(¬p ∧ ¬q) ⟹ p ∨ q&amp;quot;&lt;br /&gt;
  apply (cut_tac P=p in excluded_middle)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
    apply (cut_tac P=q in excluded_middle)&lt;br /&gt;
   apply (erule disjE)&lt;br /&gt;
    apply (erule notE)&lt;br /&gt;
    apply (rule conjI)&lt;br /&gt;
     apply assumption+&lt;br /&gt;
   apply (erule disjI2)&lt;br /&gt;
  apply (erule disjI1)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 56. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej56: &amp;quot;¬(¬p ∨ ¬q) ⟹ p ∧ q&amp;quot;&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (rule ccontr)&lt;br /&gt;
   apply (erule notE)&lt;br /&gt;
   apply (erule disjI1)&lt;br /&gt;
  apply (rule ccontr)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 57. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej57: &amp;quot;¬(p ∧ q) ⟹ ¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  apply (cut_tac P=p in excluded_middle)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule disjI1)&lt;br /&gt;
  apply (cut_tac P=q in excluded_middle)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule disjI2)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply assumption+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 58. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej58: &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
  apply (cut_tac P=p in excluded_middle)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (rule disjI1)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (rule disjI2)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_8&amp;diff=565</id>
		<title>Sol 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_8&amp;diff=565"/>
		<updated>2019-04-09T10:52:54Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R8: Argumentación en lógica de primer orden *}&lt;br /&gt;
&lt;br /&gt;
theory R8_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  El objetivo de esta relación es formalizar en lógica de primer orden&lt;br /&gt;
  argumentos expresados en lenguaje natural.&lt;br /&gt;
 &lt;br /&gt;
  Antes de escribir la soluciones, comprobar con APLI2 la corrección de &lt;br /&gt;
  la formalización. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Formalizar el siguiente argumento &lt;br /&gt;
     Hay estudiantes inteligentes y hay estudiantes trabajadores. Por&lt;br /&gt;
     tanto, hay estudiantes inteligentes y trabajadores.&lt;br /&gt;
  Usar I(x) para x es inteligente&lt;br /&gt;
       T(x) para x es trabajador&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La refutación automática es&amp;quot;&lt;br /&gt;
lemma ejercicio_1:&lt;br /&gt;
  assumes &amp;quot;(∃x. I(x)) ∧ (∃x. T(x))&amp;quot; &lt;br /&gt;
  shows   &amp;quot;∃x. I(x) ∧ T(x)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El argumento es incorrecto como muestra el siguiente contraejemplo:&lt;br /&gt;
     I = {a1}&lt;br /&gt;
     T = {a2}&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Formalizar el siguiente argumento &lt;br /&gt;
     Todos los participantes son vencedores. Hay como máximo un&lt;br /&gt;
     vencedor. Hay como máximo un participante. Por lo tanto, hay&lt;br /&gt;
     exactamente un participante. &lt;br /&gt;
  Usar P(x) para x es un participante&lt;br /&gt;
       V(x) para x es un vencedor&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La refutación automática es&amp;quot;&lt;br /&gt;
lemma ejercicio_2: &lt;br /&gt;
  assumes &amp;quot;∀x. P(x) ⟶ V(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x y. V(x) ∧ V(y) ⟶ x=y&amp;quot; &lt;br /&gt;
          &amp;quot;∀x y. P(x) ∧ P(y) ⟶ x=y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P(x) ∧ (∀y. P(y) ⟶ x=y)&amp;quot;&lt;br /&gt;
quickcheck  &lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El argumento es incorrecto como muestra el siguiente contraejemplo:&lt;br /&gt;
     V = {}&lt;br /&gt;
     P = {}&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Formalizar el siguiente argumento &lt;br /&gt;
     Ningún aristócrata debe ser condenado a galeras a menos que sus&lt;br /&gt;
     crímenes sean vergonzosos y lleve una vida licenciosa. En la ciudad&lt;br /&gt;
     hay aristócratas que han cometido crímenes vergonzosos aunque su&lt;br /&gt;
     forma de vida no sea licenciosa. Por tanto, hay algún aristócrata&lt;br /&gt;
     que no está condenado a galeras. &lt;br /&gt;
  Usar A(x)  para x es aristócrata&lt;br /&gt;
       G(x)  para x está condenado a galeras&lt;br /&gt;
       L(x)  para x lleva una vida licenciosa&lt;br /&gt;
       V(x)  para x ha cometido crímenes vergonzoso&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejercicio_3_a:&lt;br /&gt;
  assumes &amp;quot;∀x. A(x) ∧ G(x) ⟶ L(x) ∧ V(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∃x. A(x) ∧ V(x) ∧ ¬L(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. A(x) ∧ ¬G(x)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by metis&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3_d:&lt;br /&gt;
  assumes &amp;quot;∀x. A(x) ∧ G(x) ⟶ L(x) ∧ V(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∃x. A(x) ∧ V(x) ∧ ¬L(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. A(x) ∧ ¬G(x)&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  from assms(2) obtain a where 1:&amp;quot;A(a) ∧ V(a) ∧ ¬L(a)&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;A(a)&amp;quot; ..&lt;br /&gt;
  have &amp;quot;¬G(a)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;G(a)&amp;quot;&lt;br /&gt;
      with `A(a)` have 2: &amp;quot;A(a) ∧ G(a)&amp;quot; ..&lt;br /&gt;
      have &amp;quot;A(a) ∧ G(a) ⟶ L(a) ∧ V(a)&amp;quot; using assms(1) ..&lt;br /&gt;
      hence &amp;quot;L(a) ∧ V(a)&amp;quot; using 2 ..&lt;br /&gt;
      hence &amp;quot;L(a)&amp;quot; ..&lt;br /&gt;
      have &amp;quot;V(a) ∧ ¬L(a)&amp;quot; using 1 ..&lt;br /&gt;
      hence &amp;quot;¬L(a)&amp;quot; ..&lt;br /&gt;
      thus False using `L(a)`..&lt;br /&gt;
    qed&lt;br /&gt;
  with `A(a)` have &amp;quot;A(a) ∧ ¬G(a)&amp;quot; ..&lt;br /&gt;
  thus  &amp;quot;∃x. A(x) ∧ ¬G(x)&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3_e:&lt;br /&gt;
  &amp;quot;⟦∀x. A(x) ∧ G(x) ⟶ L(x) ∧ V(x);&lt;br /&gt;
          ∃x. A(x) ∧ V(x) ∧ ¬L(x)⟧ ⟹ ∃x. A(x) ∧ ¬G(x)&amp;quot;  &lt;br /&gt;
  apply (erule exE)&lt;br /&gt;
  apply (erule_tac x = x in allE)&lt;br /&gt;
  apply (rule_tac x = x in exI)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (erule conjunct1)&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (drule mp)&lt;br /&gt;
   apply (rule conjI)&lt;br /&gt;
    apply (erule conjunct1, assumption)&lt;br /&gt;
  apply (drule conjunct2)&lt;br /&gt;
  apply (drule conjunct1)&lt;br /&gt;
  apply (drule conjunct2)&lt;br /&gt;
  apply (erule notE, assumption)&lt;br /&gt;
    done&lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Formalizar el siguiente argumento &lt;br /&gt;
     Todos los robots obedecen a los amigos del programador jefe.&lt;br /&gt;
     Alvaro es amigo del programador jefe, pero Benito no le&lt;br /&gt;
     obedece. Por tanto, Benito no es un robot.&lt;br /&gt;
  Usar R(x)    para x es un robot&lt;br /&gt;
       Ob(x,y) para x obedece a y&lt;br /&gt;
       A(x)    para x es amigo del programador jefe&lt;br /&gt;
       b       para Benito&lt;br /&gt;
       a       para Alvaro&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4_a:&lt;br /&gt;
  assumes &amp;quot;∀x y. R(x) ∧ A(y) ⟶ Ob(x,y)&amp;quot;&lt;br /&gt;
          &amp;quot;A(a)&amp;quot;&lt;br /&gt;
          &amp;quot;¬Ob(b,a)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬R(b)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by metis&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4_b:&lt;br /&gt;
  assumes &amp;quot;∀x y. R(x) ∧ A(y) ⟶ Ob(x,y)&amp;quot;&lt;br /&gt;
          &amp;quot;A(a)&amp;quot;&lt;br /&gt;
          &amp;quot;¬Ob(b,a)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬R(b)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;R(b)&amp;quot; &lt;br /&gt;
  have &amp;quot;∀y. R(b) ∧ A(y) ⟶ Ob(b,y)&amp;quot; using assms(1) ..&lt;br /&gt;
  hence 1: &amp;quot;R(b) ∧ A(a) ⟶ Ob(b,a)&amp;quot; ..&lt;br /&gt;
  have &amp;quot;R(b) ∧ A(a)&amp;quot; using `R(b)` assms(2) ..&lt;br /&gt;
  with 1 have &amp;quot;Ob(b,a)&amp;quot; ..&lt;br /&gt;
  with assms(3) show False ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4_c:&lt;br /&gt;
  &amp;quot;⟦∀x y. R(x) ∧ A(y) ⟶ Ob(x,y);&lt;br /&gt;
          A(a);¬Ob(b,a)⟧⟹ ¬R(b)&amp;quot;&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule_tac x = b in allE)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply (erule allE)&lt;br /&gt;
  apply (erule mp)&lt;br /&gt;
  apply (rule conjI, assumption+)&lt;br /&gt;
    done&lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Formalizar el siguiente argumento&lt;br /&gt;
     Ningún socio del club está en deuda con el tesorero del club. Si&lt;br /&gt;
     un socio del club no paga su cuota está en deuda con el tesorero&lt;br /&gt;
     del club. Por tanto, si el tesorero del club es socio del club,&lt;br /&gt;
     entonces paga su cuota. &lt;br /&gt;
  Usar P(x) para x es socio del club&lt;br /&gt;
       Q(x) para x paga su cuota&lt;br /&gt;
       R(x) para x está en deuda con el tesorero&lt;br /&gt;
       a    para el tesorero del club&lt;br /&gt;
   ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5_a:&lt;br /&gt;
  assumes &amp;quot;¬(∃x. P(x) ∧ R(x))&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. P(x) ∧ ¬Q(x) ⟶ R(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;P(a) ⟶ Q(a)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5_b:&lt;br /&gt;
  assumes &amp;quot;¬(∃x. P(x) ∧ R(x))&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. P(x) ∧ ¬Q(x) ⟶ R(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;P(a) ⟶ Q(a)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;P(a)&amp;quot; &lt;br /&gt;
  show &amp;quot;Q(a)&amp;quot; &lt;br /&gt;
   proof (rule ccontr)&lt;br /&gt;
     assume &amp;quot;¬Q(a)&amp;quot;&lt;br /&gt;
     with `P(a)` have 1: &amp;quot;P(a) ∧ ¬Q(a)&amp;quot; ..&lt;br /&gt;
     have &amp;quot;P(a) ∧ ¬Q(a) ⟶ R(a)&amp;quot; using assms(2) ..&lt;br /&gt;
     hence &amp;quot;R(a)&amp;quot; using 1 ..&lt;br /&gt;
     with `P(a)` have &amp;quot;P(a) ∧ R(a)&amp;quot; ..&lt;br /&gt;
     hence &amp;quot;∃x. P(x) ∧ R(x)&amp;quot; ..&lt;br /&gt;
     with assms(1) show False ..&lt;br /&gt;
   qed&lt;br /&gt;
 qed&lt;br /&gt;
   &lt;br /&gt;
lemma ejercicio_5_c:&lt;br /&gt;
   &amp;quot;⟦¬(∃x. P(x) ∧ R(x));&lt;br /&gt;
          ∀x. P(x) ∧ ¬Q(x) ⟶ R(x)⟧ ⟹ P(a) ⟶ Q(a)&amp;quot;   &lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule_tac x = a in allE)&lt;br /&gt;
  apply (rule ccontr)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply (rule_tac x = a in exI)&lt;br /&gt;
  apply (rule conjI, assumption)&lt;br /&gt;
  apply (erule mp)&lt;br /&gt;
  apply (rule conjI, assumption+)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Formalizar el siguiente argumento &lt;br /&gt;
     Los aficionados al fútbol aplauden a cualquier futbolista&lt;br /&gt;
     extranjero. Juanito no aplaude a futbolistas extranjeros. Por&lt;br /&gt;
     tanto, si hay algún futbolista extranjero nacionalizado español,&lt;br /&gt;
     Juanito no es aficionado al fútbol.&lt;br /&gt;
  Usar Af(x)   para x es aficicionado al fútbol&lt;br /&gt;
       Ap(x,y) para x aplaude a y&lt;br /&gt;
       E(x)    para x es un futbolista extranjero&lt;br /&gt;
       N(x)    para x es un futbolista nacionalizado español&lt;br /&gt;
       j       para Juanito&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejercicio_6_a:&lt;br /&gt;
  assumes &amp;quot;∀x. Af(x) ⟶ (∀y. E(y) ⟶ Ap(x,y))&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. E(x) ⟶ ¬Ap(j,x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃x. E(x) ∧ N(x)) ⟶ ¬Af(j)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by metis&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6_d:&lt;br /&gt;
  assumes &amp;quot;∀x. Af(x) ⟶ (∀y. E(y) ⟶ Ap(x,y))&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. E(x) ⟶ ¬Ap(j,x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃x. E(x) ∧ N(x)) ⟶ ¬Af(j)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∃x. E(x) ∧ N(x)&amp;quot; &lt;br /&gt;
  then obtain a where &amp;quot;E(a) ∧ N(a)&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;E(a)&amp;quot; ..&lt;br /&gt;
  have &amp;quot;E(a) ⟶ ¬Ap(j,a)&amp;quot; using assms(2) ..&lt;br /&gt;
  hence &amp;quot;¬Ap(j,a)&amp;quot; using `E(a)` ..&lt;br /&gt;
  show &amp;quot;¬Af(j)&amp;quot;&lt;br /&gt;
     proof&lt;br /&gt;
       assume &amp;quot;Af(j)&amp;quot;&lt;br /&gt;
       have &amp;quot;Af(j) ⟶ (∀y. E(y) ⟶ Ap(j,y))&amp;quot; using assms(1) ..&lt;br /&gt;
       hence &amp;quot;∀y. E(y) ⟶ Ap(j,y)&amp;quot; using `Af(j)` ..&lt;br /&gt;
       hence &amp;quot;E(a) ⟶ Ap(j,a)&amp;quot; ..&lt;br /&gt;
       hence &amp;quot;Ap(j,a)&amp;quot; using `E(a)` ..&lt;br /&gt;
       with `¬Ap(j,a)` show False ..&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6_c:&lt;br /&gt;
  &amp;quot;⟦∀x. Af(x) ⟶ (∀y. E(y) ⟶ Ap(x,y));&lt;br /&gt;
          ∀x. E(x) ⟶ ¬Ap(j,x)⟧ ⟹&lt;br /&gt;
         (∃x. E(x) ∧ N(x)) ⟶ ¬Af(j)&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule exE)&lt;br /&gt;
  apply (erule_tac x = x in allE)&lt;br /&gt;
  apply (erule_tac x = j in allE)&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (drule mp)&lt;br /&gt;
   apply (erule conjunct1)&lt;br /&gt;
  apply (drule mp, assumption)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply (drule conjunct1)&lt;br /&gt;
  apply (erule_tac x = x in allE)&lt;br /&gt;
  apply (erule mp, assumption)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Formalizar el siguiente argumento &lt;br /&gt;
     Todo aquel que entre en el país y no sea un VIP será cacheado por&lt;br /&gt;
     un aduanero. Hay un contrabandista que entra en el país y que solo&lt;br /&gt;
     podrá ser cacheado por contrabandistas. Ningún contrabandista es un&lt;br /&gt;
     VIP. Por tanto, algún aduanero es contrabandista.&lt;br /&gt;
  Usar A(x)    para x es aduanero&lt;br /&gt;
       Ca(x,y) para x cachea a y&lt;br /&gt;
       Co(x)   para x es contrabandista&lt;br /&gt;
       E(x)    para x entra en el pais&lt;br /&gt;
       V(x)    para x es un VIP&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejercicio_7_a:&lt;br /&gt;
  assumes &amp;quot;∀x. E(x) ∧ ¬V(x) ⟶ (∃y. A(y) ∧ Ca(y,x))&amp;quot;&lt;br /&gt;
           &amp;quot;∃x. Co(x) ∧ E(x) ∧ (∀y. Ca(y,x) ⟶ Co(y))&amp;quot;&lt;br /&gt;
           &amp;quot;¬(∃x. Co(x) ∧ V(x))&amp;quot;&lt;br /&gt;
  shows    &amp;quot;∃x. A(x) ∧ Co(x)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by metis&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7_d:&lt;br /&gt;
  assumes &amp;quot;∀x. E(x) ∧ ¬V(x) ⟶ (∃y. A(y) ∧ Ca(y,x))&amp;quot;&lt;br /&gt;
           &amp;quot;∃x. Co(x) ∧ E(x) ∧ (∀y. Ca(y,x) ⟶ Co(y))&amp;quot;&lt;br /&gt;
           &amp;quot;¬(∃x. Co(x) ∧ V(x))&amp;quot;&lt;br /&gt;
  shows    &amp;quot;∃x. A(x) ∧ Co(x)&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  from assms(2) obtain a where 1: &amp;quot;Co(a) ∧ E(a) ∧ (∀y. Ca(y,a) ⟶ Co(y))&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;Co(a)&amp;quot; ..&lt;br /&gt;
  have 2:&amp;quot; E(a) ∧ (∀y. Ca(y,a) ⟶ Co(y))&amp;quot; using 1 ..&lt;br /&gt;
  hence &amp;quot;E(a)&amp;quot; ..&lt;br /&gt;
  have 3: &amp;quot;∀y. Ca(y,a) ⟶ Co(y)&amp;quot; using 2 ..&lt;br /&gt;
  have &amp;quot;¬V(a) ∨ V(a)&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃x. A(x) ∧ Co(x)&amp;quot;&lt;br /&gt;
     proof&lt;br /&gt;
       assume &amp;quot;¬V(a)&amp;quot;&lt;br /&gt;
         with `E(a)` have 4: &amp;quot;E(a) ∧ ¬V(a)&amp;quot; ..&lt;br /&gt;
         have &amp;quot;E(a) ∧ ¬V(a) ⟶ (∃y. A(y) ∧ Ca(y,a))&amp;quot; using assms(1) ..&lt;br /&gt;
         hence &amp;quot;∃y. A(y) ∧ Ca(y,a)&amp;quot; using 4 ..&lt;br /&gt;
         then obtain b where &amp;quot;A(b) ∧ Ca(b,a)&amp;quot; ..&lt;br /&gt;
         hence &amp;quot;A(b)&amp;quot; ..&lt;br /&gt;
         have &amp;quot;Ca(b,a)&amp;quot; using `A(b) ∧ Ca(b,a)` ..&lt;br /&gt;
         have &amp;quot;Ca(b,a) ⟶ Co(b)&amp;quot; using 3 ..&lt;br /&gt;
         hence &amp;quot;Co(b)&amp;quot; using `Ca(b,a)`..&lt;br /&gt;
         with `A(b)` have &amp;quot;A(b) ∧ Co(b)&amp;quot; ..&lt;br /&gt;
         thus &amp;quot;∃x. A(x) ∧ Co(x)&amp;quot; ..&lt;br /&gt;
       next &lt;br /&gt;
       assume &amp;quot;V(a)&amp;quot;&lt;br /&gt;
       with `Co(a) ` have &amp;quot;Co(a) ∧ V(a)&amp;quot; ..&lt;br /&gt;
       hence &amp;quot;∃x. Co(x) ∧ V(x)&amp;quot; ..&lt;br /&gt;
       with assms(3) show &amp;quot;∃x. A(x) ∧ Co(x)&amp;quot; ..&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7_c:&lt;br /&gt;
  &amp;quot;⟦∀x. E(x) ∧ ¬V(x) ⟶ (∃y. A(y) ∧ Ca(y,x));&lt;br /&gt;
      ∃x. Co(x) ∧ E(x) ∧ (∀y. Ca(y,x) ⟶ Co(y));&lt;br /&gt;
           ¬(∃x. Co(x) ∧ V(x)) ⟧ ⟹ ∃x. A(x) ∧ Co(x)&amp;quot;  &lt;br /&gt;
  apply (erule exE)&lt;br /&gt;
  apply (erule_tac x = x in allE)&lt;br /&gt;
  apply (drule mp)&lt;br /&gt;
   apply (rule conjI)&lt;br /&gt;
    apply (drule conjunct2)&lt;br /&gt;
    apply (drule conjunct1, assumption)&lt;br /&gt;
   apply (rule notI)&lt;br /&gt;
   apply (erule notE)&lt;br /&gt;
   apply (drule conjunct1)&lt;br /&gt;
   apply (rule_tac x = x in exI)&lt;br /&gt;
   apply (rule conjI, assumption+)&lt;br /&gt;
  apply (erule exE)&lt;br /&gt;
  apply (rule_tac x = y in exI)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
    apply (erule conjunct1)+&lt;br /&gt;
  apply (drule conjunct2)+&lt;br /&gt;
  apply (erule_tac x = y in allE)&lt;br /&gt;
  apply (drule mp, assumption+)&lt;br /&gt;
    done&lt;br /&gt;
    &lt;br /&gt;
  &lt;br /&gt;
section {* Ejercicios con igualdad *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Formalizar el siguiente argumento &lt;br /&gt;
     Rosa ama a Curro. Paco no simpatiza con Ana. Quien no simpatiza con&lt;br /&gt;
     Ana ama a Rosa. Si una persona ama a otra, la segunda ama a la&lt;br /&gt;
     primera. Hay como máximo una persona que ama a Rosa. Por tanto,&lt;br /&gt;
     Paco es Curro. &lt;br /&gt;
  Usar A(x,y) para x ama a y &lt;br /&gt;
       S(x,y) para x simpatiza con y &lt;br /&gt;
       a      para Ana&lt;br /&gt;
       c      para Curro&lt;br /&gt;
       p      para Paco &lt;br /&gt;
       r      para Rosa&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8_a:&lt;br /&gt;
  assumes &amp;quot;A(r,c)&amp;quot; &lt;br /&gt;
          &amp;quot;¬S(p,a)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. ¬S(x,a) ⟶ A(x,r)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x y. A(x,y) ⟶ A(y,x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x y. A(x,r) ∧ A(y,r) ⟶ x=y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p = c&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8_b:&lt;br /&gt;
  assumes &amp;quot;A(r,c)&amp;quot; &lt;br /&gt;
          &amp;quot;¬S(p,a)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. ¬S(x,a) ⟶ A(x,r)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x y. A(x,y) ⟶ A(y,x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x y. A(x,r) ∧ A(y,r) ⟶ x=y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p = c&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  have &amp;quot;∀y. A(r,y) ⟶ A(y,r)&amp;quot; using assms(4) ..&lt;br /&gt;
  hence &amp;quot;A(r,c) ⟶ A(c,r)&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;A(c,r)&amp;quot; using assms(1) ..&lt;br /&gt;
  have &amp;quot;¬S(p,a) ⟶ A(p,r)&amp;quot; using assms(3) ..&lt;br /&gt;
  hence &amp;quot;A(p,r)&amp;quot; using assms(2) ..&lt;br /&gt;
  hence 1: &amp;quot;A(p,r) ∧ A(c,r)&amp;quot; using `A(c,r)`..&lt;br /&gt;
  have &amp;quot;∀y. A(p,r) ∧ A(y,r) ⟶ p=y&amp;quot; using assms(5) ..&lt;br /&gt;
  hence &amp;quot;A(p,r) ∧ A(c,r) ⟶ p=c&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;p=c&amp;quot; using 1 ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8_c:&lt;br /&gt;
  &amp;quot;⟦A(r,c);&lt;br /&gt;
    ¬S(p,a);&lt;br /&gt;
     ∀x. ¬S(x,a) ⟶ A(x,r);&lt;br /&gt;
     ∀x y. A(x,y) ⟶ A(y,x);&lt;br /&gt;
     ∀x y. A(x,r) ∧ A(y,r) ⟶ x=y ⟧ ⟹ p = c&amp;quot;  &lt;br /&gt;
  apply (drule_tac x = p in spec)&lt;br /&gt;
  apply (drule mp, assumption) &lt;br /&gt;
  apply (drule_tac x = r in spec)&lt;br /&gt;
  apply (drule_tac x = p in spec)&lt;br /&gt;
  apply (frule_tac x = c in spec)&lt;br /&gt;
  apply (drule mp, assumption)&lt;br /&gt;
  apply (drule_tac x = c in spec)+&lt;br /&gt;
  apply (rule mp, assumption)&lt;br /&gt;
    apply (rule conjI, assumption+)&lt;br /&gt;
    done&lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Formalizar el siguiente argumento &lt;br /&gt;
     Todos los filósofos se han preguntado qué es la filosofía. Los que&lt;br /&gt;
     se preguntan qué es la filosofía se vuelven locos. Nietzsche es&lt;br /&gt;
     filósofo. El maestro de Nietzsche no acabó loco. Por tanto,&lt;br /&gt;
     Nietzsche y su maestro son diferentes personas. &lt;br /&gt;
  Usar F(x) para x es filósofo&lt;br /&gt;
       L(x) para x se vuelve loco&lt;br /&gt;
       P(x) para x se ha preguntado qué es la filosofía.&lt;br /&gt;
       m    para el maestro de Nietzsche&lt;br /&gt;
       n    para Nietzsche&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9_a:&lt;br /&gt;
  assumes &amp;quot;∀x. F(x) ⟶ P(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. P(x) ⟶ L(x)&amp;quot;&lt;br /&gt;
          &amp;quot;F(n)&amp;quot;&lt;br /&gt;
          &amp;quot;¬L(m)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;n ≠ m&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9_b:&lt;br /&gt;
  assumes &amp;quot;∀x. F(x) ⟶ P(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. P(x) ⟶ L(x)&amp;quot;&lt;br /&gt;
          &amp;quot;F(n)&amp;quot;&lt;br /&gt;
          &amp;quot;¬L(m)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;n ≠ m&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;n = m&amp;quot; &lt;br /&gt;
  hence &amp;quot;F(m)&amp;quot; using assms(3) by (rule subst)&lt;br /&gt;
  have &amp;quot;F(m) ⟶ P(m)&amp;quot; using assms(1) ..&lt;br /&gt;
  hence &amp;quot;P(m)&amp;quot; using `F(m)` ..&lt;br /&gt;
  have &amp;quot;P(m) ⟶ L(m)&amp;quot; using assms(2) ..&lt;br /&gt;
  hence &amp;quot;L(m)&amp;quot; using `P(m)` ..&lt;br /&gt;
  with assms(4) show False ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9_c:&lt;br /&gt;
  &amp;quot;⟦∀x. F(x) ⟶ P(x);&lt;br /&gt;
    ∀x. P(x) ⟶ L(x);&lt;br /&gt;
    F(n);&lt;br /&gt;
    ¬L(m) ⟧ ⟹ n ≠ m&amp;quot;  &lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule_tac x = n in allE)&lt;br /&gt;
  apply (drule mp, assumption)&lt;br /&gt;
  apply (erule_tac x = m in allE)&lt;br /&gt;
    apply (erule notE)&lt;br /&gt;
  apply (erule mp)&lt;br /&gt;
  apply (erule subst, assumption)&lt;br /&gt;
    done&lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Formalizar el siguiente argumento &lt;br /&gt;
     Eduardo pudo haber visto al asesino. Antonio fue el primer testigo&lt;br /&gt;
     de la defensa. O Eduardo estaba en clase o Antonio dio falso&lt;br /&gt;
     testimonio. Nadie en clase pudo haber visto al asesino. Luego, el&lt;br /&gt;
     primer testigo de la defensa dio falso testimonio. &lt;br /&gt;
  Usar C(x) para x estaba en clase&lt;br /&gt;
       F(x) para x dio falso testimonio&lt;br /&gt;
       V(x) para x pudo haber visto al asesino&lt;br /&gt;
       a    para Antonio&lt;br /&gt;
       e    para Eduardo&lt;br /&gt;
       p    para el primer testigo de la defensa&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10_a:&lt;br /&gt;
  assumes &amp;quot;V(e)&amp;quot;&lt;br /&gt;
          &amp;quot;a = p&amp;quot;&lt;br /&gt;
          &amp;quot;C(e) ∨ F(a)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. C(x) ⟶ ¬V(x)&amp;quot;&lt;br /&gt;
   shows  &amp;quot;F(p)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10_b:&lt;br /&gt;
  assumes &amp;quot;V(e)&amp;quot;&lt;br /&gt;
          &amp;quot;a = p&amp;quot;&lt;br /&gt;
          &amp;quot;C(e) ∨ F(a)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. C(x) ⟶ ¬V(x)&amp;quot;&lt;br /&gt;
   shows  &amp;quot;F(p)&amp;quot;&lt;br /&gt;
using assms(3)&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;C(e)&amp;quot;&lt;br /&gt;
    have &amp;quot;C(e) ⟶ ¬V(e)&amp;quot; using assms(4) ..&lt;br /&gt;
    hence &amp;quot;¬V(e)&amp;quot; using `C(e)` ..&lt;br /&gt;
    thus  &amp;quot;F(p)&amp;quot; using assms(1) ..&lt;br /&gt;
  next&lt;br /&gt;
  assume &amp;quot;F(a)&amp;quot;&lt;br /&gt;
   with assms(2) show &amp;quot;F(p)&amp;quot; by (rule subst)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10_c:&lt;br /&gt;
  &amp;quot;⟦ V(e);&lt;br /&gt;
     a = p;&lt;br /&gt;
     C(e) ∨ F(a);&lt;br /&gt;
     ∀x. C(x) ⟶ ¬V(x) ⟧ ⟹ F(p)&amp;quot;  &lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule_tac x = e in allE)&lt;br /&gt;
   apply (drule mp, assumption)&lt;br /&gt;
   apply (erule notE, assumption)&lt;br /&gt;
  apply (erule subst, assumption)&lt;br /&gt;
    done&lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_8&amp;diff=564</id>
		<title>Sol 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_8&amp;diff=564"/>
		<updated>2019-04-09T10:52:44Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R8: Argumentación en lógica de primer orden *}&lt;br /&gt;
&lt;br /&gt;
theory R8_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  El objetivo de esta relación es formalizar en lógica de primer orden&lt;br /&gt;
  argumentos expresados en lenguaje natural.&lt;br /&gt;
 &lt;br /&gt;
  Antes de escribir la soluciones, comprobar con APLI2 la corrección de &lt;br /&gt;
  la formalización. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Formalizar el siguiente argumento &lt;br /&gt;
     Hay estudiantes inteligentes y hay estudiantes trabajadores. Por&lt;br /&gt;
     tanto, hay estudiantes inteligentes y trabajadores.&lt;br /&gt;
  Usar I(x) para x es inteligente&lt;br /&gt;
       T(x) para x es trabajador&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La refutación automática es&amp;quot;&lt;br /&gt;
lemma ejercicio_1:&lt;br /&gt;
  assumes &amp;quot;(∃x. I(x)) ∧ (∃x. T(x))&amp;quot; &lt;br /&gt;
  shows   &amp;quot;∃x. I(x) ∧ T(x)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El argumento es incorrecto como muestra el siguiente contraejemplo:&lt;br /&gt;
     I = {a1}&lt;br /&gt;
     T = {a2}&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Formalizar el siguiente argumento &lt;br /&gt;
     Todos los participantes son vencedores. Hay como máximo un&lt;br /&gt;
     vencedor. Hay como máximo un participante. Por lo tanto, hay&lt;br /&gt;
     exactamente un participante. &lt;br /&gt;
  Usar P(x) para x es un participante&lt;br /&gt;
       V(x) para x es un vencedor&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La refutación automática es&amp;quot;&lt;br /&gt;
lemma ejercicio_2: &lt;br /&gt;
  assumes &amp;quot;∀x. P(x) ⟶ V(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x y. V(x) ∧ V(y) ⟶ x=y&amp;quot; &lt;br /&gt;
          &amp;quot;∀x y. P(x) ∧ P(y) ⟶ x=y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P(x) ∧ (∀y. P(y) ⟶ x=y)&amp;quot;&lt;br /&gt;
quickcheck  &lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El argumento es incorrecto como muestra el siguiente contraejemplo:&lt;br /&gt;
     V = {}&lt;br /&gt;
     P = {}&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Formalizar el siguiente argumento &lt;br /&gt;
     Ningún aristócrata debe ser condenado a galeras a menos que sus&lt;br /&gt;
     crímenes sean vergonzosos y lleve una vida licenciosa. En la ciudad&lt;br /&gt;
     hay aristócratas que han cometido crímenes vergonzosos aunque su&lt;br /&gt;
     forma de vida no sea licenciosa. Por tanto, hay algún aristócrata&lt;br /&gt;
     que no está condenado a galeras. &lt;br /&gt;
  Usar A(x)  para x es aristócrata&lt;br /&gt;
       G(x)  para x está condenado a galeras&lt;br /&gt;
       L(x)  para x lleva una vida licenciosa&lt;br /&gt;
       V(x)  para x ha cometido crímenes vergonzoso&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejercicio_3_a:&lt;br /&gt;
  assumes &amp;quot;∀x. A(x) ∧ G(x) ⟶ L(x) ∧ V(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∃x. A(x) ∧ V(x) ∧ ¬L(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. A(x) ∧ ¬G(x)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by metis&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3_d:&lt;br /&gt;
  assumes &amp;quot;∀x. A(x) ∧ G(x) ⟶ L(x) ∧ V(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∃x. A(x) ∧ V(x) ∧ ¬L(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. A(x) ∧ ¬G(x)&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  from assms(2) obtain a where 1:&amp;quot;A(a) ∧ V(a) ∧ ¬L(a)&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;A(a)&amp;quot; ..&lt;br /&gt;
  have &amp;quot;¬G(a)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;G(a)&amp;quot;&lt;br /&gt;
      with `A(a)` have 2: &amp;quot;A(a) ∧ G(a)&amp;quot; ..&lt;br /&gt;
      have &amp;quot;A(a) ∧ G(a) ⟶ L(a) ∧ V(a)&amp;quot; using assms(1) ..&lt;br /&gt;
      hence &amp;quot;L(a) ∧ V(a)&amp;quot; using 2 ..&lt;br /&gt;
      hence &amp;quot;L(a)&amp;quot; ..&lt;br /&gt;
      have &amp;quot;V(a) ∧ ¬L(a)&amp;quot; using 1 ..&lt;br /&gt;
      hence &amp;quot;¬L(a)&amp;quot; ..&lt;br /&gt;
      thus False using `L(a)`..&lt;br /&gt;
    qed&lt;br /&gt;
  with `A(a)` have &amp;quot;A(a) ∧ ¬G(a)&amp;quot; ..&lt;br /&gt;
  thus  &amp;quot;∃x. A(x) ∧ ¬G(x)&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3_e:&lt;br /&gt;
  &amp;quot;⟦∀x. A(x) ∧ G(x) ⟶ L(x) ∧ V(x);&lt;br /&gt;
          ∃x. A(x) ∧ V(x) ∧ ¬L(x)⟧ ⟹ ∃x. A(x) ∧ ¬G(x)&amp;quot;  &lt;br /&gt;
  apply (erule exE)&lt;br /&gt;
  apply (erule_tac x = x in allE)&lt;br /&gt;
  apply (rule_tac x = x in exI)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (erule conjunct1)&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (drule mp)&lt;br /&gt;
   apply (rule conjI)&lt;br /&gt;
    apply (erule conjunct1, assumption)&lt;br /&gt;
  apply (drule conjunct2)&lt;br /&gt;
  apply (drule conjunct1)&lt;br /&gt;
  apply (drule conjunct2)&lt;br /&gt;
  apply (erule notE, assumption)&lt;br /&gt;
    done&lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Formalizar el siguiente argumento &lt;br /&gt;
     Todos los robots obedecen a los amigos del programador jefe.&lt;br /&gt;
     Alvaro es amigo del programador jefe, pero Benito no le&lt;br /&gt;
     obedece. Por tanto, Benito no es un robot.&lt;br /&gt;
  Usar R(x)    para x es un robot&lt;br /&gt;
       Ob(x,y) para x obedece a y&lt;br /&gt;
       A(x)    para x es amigo del programador jefe&lt;br /&gt;
       b       para Benito&lt;br /&gt;
       a       para Alvaro&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4_a:&lt;br /&gt;
  assumes &amp;quot;∀x y. R(x) ∧ A(y) ⟶ Ob(x,y)&amp;quot;&lt;br /&gt;
          &amp;quot;A(a)&amp;quot;&lt;br /&gt;
          &amp;quot;¬Ob(b,a)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬R(b)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by metis&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4_b:&lt;br /&gt;
  assumes &amp;quot;∀x y. R(x) ∧ A(y) ⟶ Ob(x,y)&amp;quot;&lt;br /&gt;
          &amp;quot;A(a)&amp;quot;&lt;br /&gt;
          &amp;quot;¬Ob(b,a)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬R(b)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;R(b)&amp;quot; &lt;br /&gt;
  have &amp;quot;∀y. R(b) ∧ A(y) ⟶ Ob(b,y)&amp;quot; using assms(1) ..&lt;br /&gt;
  hence 1: &amp;quot;R(b) ∧ A(a) ⟶ Ob(b,a)&amp;quot; ..&lt;br /&gt;
  have &amp;quot;R(b) ∧ A(a)&amp;quot; using `R(b)` assms(2) ..&lt;br /&gt;
  with 1 have &amp;quot;Ob(b,a)&amp;quot; ..&lt;br /&gt;
  with assms(3) show False ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4_c:&lt;br /&gt;
  &amp;quot;⟦∀x y. R(x) ∧ A(y) ⟶ Ob(x,y);&lt;br /&gt;
          A(a);¬Ob(b,a)⟧⟹ ¬R(b)&amp;quot;&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule_tac x = b in allE)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply (erule allE)&lt;br /&gt;
  apply (erule mp)&lt;br /&gt;
  apply (rule conjI, assumption+)&lt;br /&gt;
    done&lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Formalizar el siguiente argumento&lt;br /&gt;
     Ningún socio del club está en deuda con el tesorero del club. Si&lt;br /&gt;
     un socio del club no paga su cuota está en deuda con el tesorero&lt;br /&gt;
     del club. Por tanto, si el tesorero del club es socio del club,&lt;br /&gt;
     entonces paga su cuota. &lt;br /&gt;
  Usar P(x) para x es socio del club&lt;br /&gt;
       Q(x) para x paga su cuota&lt;br /&gt;
       R(x) para x está en deuda con el tesorero&lt;br /&gt;
       a    para el tesorero del club&lt;br /&gt;
   ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5_a:&lt;br /&gt;
  assumes &amp;quot;¬(∃x. P(x) ∧ R(x))&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. P(x) ∧ ¬Q(x) ⟶ R(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;P(a) ⟶ Q(a)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5_b:&lt;br /&gt;
  assumes &amp;quot;¬(∃x. P(x) ∧ R(x))&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. P(x) ∧ ¬Q(x) ⟶ R(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;P(a) ⟶ Q(a)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;P(a)&amp;quot; &lt;br /&gt;
  show &amp;quot;Q(a)&amp;quot; &lt;br /&gt;
   proof (rule ccontr)&lt;br /&gt;
     assume &amp;quot;¬Q(a)&amp;quot;&lt;br /&gt;
     with `P(a)` have 1: &amp;quot;P(a) ∧ ¬Q(a)&amp;quot; ..&lt;br /&gt;
     have &amp;quot;P(a) ∧ ¬Q(a) ⟶ R(a)&amp;quot; using assms(2) ..&lt;br /&gt;
     hence &amp;quot;R(a)&amp;quot; using 1 ..&lt;br /&gt;
     with `P(a)` have &amp;quot;P(a) ∧ R(a)&amp;quot; ..&lt;br /&gt;
     hence &amp;quot;∃x. P(x) ∧ R(x)&amp;quot; ..&lt;br /&gt;
     with assms(1) show False ..&lt;br /&gt;
   qed&lt;br /&gt;
 qed&lt;br /&gt;
   &lt;br /&gt;
lemma ejercicio_5_c:&lt;br /&gt;
   &amp;quot;⟦¬(∃x. P(x) ∧ R(x));&lt;br /&gt;
          ∀x. P(x) ∧ ¬Q(x) ⟶ R(x)⟧ ⟹ P(a) ⟶ Q(a)&amp;quot;   &lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule_tac x = a in allE)&lt;br /&gt;
  apply (rule ccontr)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply (rule_tac x = a in exI)&lt;br /&gt;
  apply (rule conjI, assumption)&lt;br /&gt;
  apply (erule mp)&lt;br /&gt;
  apply (rule conjI, assumption+)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Formalizar el siguiente argumento &lt;br /&gt;
     Los aficionados al fútbol aplauden a cualquier futbolista&lt;br /&gt;
     extranjero. Juanito no aplaude a futbolistas extranjeros. Por&lt;br /&gt;
     tanto, si hay algún futbolista extranjero nacionalizado español,&lt;br /&gt;
     Juanito no es aficionado al fútbol.&lt;br /&gt;
  Usar Af(x)   para x es aficicionado al fútbol&lt;br /&gt;
       Ap(x,y) para x aplaude a y&lt;br /&gt;
       E(x)    para x es un futbolista extranjero&lt;br /&gt;
       N(x)    para x es un futbolista nacionalizado español&lt;br /&gt;
       j       para Juanito&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejercicio_6_a:&lt;br /&gt;
  assumes &amp;quot;∀x. Af(x) ⟶ (∀y. E(y) ⟶ Ap(x,y))&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. E(x) ⟶ ¬Ap(j,x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃x. E(x) ∧ N(x)) ⟶ ¬Af(j)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by metis&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6_d:&lt;br /&gt;
  assumes &amp;quot;∀x. Af(x) ⟶ (∀y. E(y) ⟶ Ap(x,y))&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. E(x) ⟶ ¬Ap(j,x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃x. E(x) ∧ N(x)) ⟶ ¬Af(j)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∃x. E(x) ∧ N(x)&amp;quot; &lt;br /&gt;
  then obtain a where &amp;quot;E(a) ∧ N(a)&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;E(a)&amp;quot; ..&lt;br /&gt;
  have &amp;quot;E(a) ⟶ ¬Ap(j,a)&amp;quot; using assms(2) ..&lt;br /&gt;
  hence &amp;quot;¬Ap(j,a)&amp;quot; using `E(a)` ..&lt;br /&gt;
  show &amp;quot;¬Af(j)&amp;quot;&lt;br /&gt;
     proof&lt;br /&gt;
       assume &amp;quot;Af(j)&amp;quot;&lt;br /&gt;
       have &amp;quot;Af(j) ⟶ (∀y. E(y) ⟶ Ap(j,y))&amp;quot; using assms(1) ..&lt;br /&gt;
       hence &amp;quot;∀y. E(y) ⟶ Ap(j,y)&amp;quot; using `Af(j)` ..&lt;br /&gt;
       hence &amp;quot;E(a) ⟶ Ap(j,a)&amp;quot; ..&lt;br /&gt;
       hence &amp;quot;Ap(j,a)&amp;quot; using `E(a)` ..&lt;br /&gt;
       with `¬Ap(j,a)` show False ..&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6_c:&lt;br /&gt;
  &amp;quot;⟦∀x. Af(x) ⟶ (∀y. E(y) ⟶ Ap(x,y));&lt;br /&gt;
          ∀x. E(x) ⟶ ¬Ap(j,x)⟧ ⟹&lt;br /&gt;
         (∃x. E(x) ∧ N(x)) ⟶ ¬Af(j)&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule exE)&lt;br /&gt;
  apply (erule_tac x = x in allE)&lt;br /&gt;
  apply (erule_tac x = j in allE)&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (drule mp)&lt;br /&gt;
   apply (erule conjunct1)&lt;br /&gt;
  apply (drule mp, assumption)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply (drule conjunct1)&lt;br /&gt;
  apply (erule_tac x = x in allE)&lt;br /&gt;
  apply (erule mp, assumption)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Formalizar el siguiente argumento &lt;br /&gt;
     Todo aquel que entre en el país y no sea un VIP será cacheado por&lt;br /&gt;
     un aduanero. Hay un contrabandista que entra en el país y que solo&lt;br /&gt;
     podrá ser cacheado por contrabandistas. Ningún contrabandista es un&lt;br /&gt;
     VIP. Por tanto, algún aduanero es contrabandista.&lt;br /&gt;
  Usar A(x)    para x es aduanero&lt;br /&gt;
       Ca(x,y) para x cachea a y&lt;br /&gt;
       Co(x)   para x es contrabandista&lt;br /&gt;
       E(x)    para x entra en el pais&lt;br /&gt;
       V(x)    para x es un VIP&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejercicio_7_a:&lt;br /&gt;
  assumes &amp;quot;∀x. E(x) ∧ ¬V(x) ⟶ (∃y. A(y) ∧ Ca(y,x))&amp;quot;&lt;br /&gt;
           &amp;quot;∃x. Co(x) ∧ E(x) ∧ (∀y. Ca(y,x) ⟶ Co(y))&amp;quot;&lt;br /&gt;
           &amp;quot;¬(∃x. Co(x) ∧ V(x))&amp;quot;&lt;br /&gt;
  shows    &amp;quot;∃x. A(x) ∧ Co(x)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by metis&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7_d:&lt;br /&gt;
  assumes &amp;quot;∀x. E(x) ∧ ¬V(x) ⟶ (∃y. A(y) ∧ Ca(y,x))&amp;quot;&lt;br /&gt;
           &amp;quot;∃x. Co(x) ∧ E(x) ∧ (∀y. Ca(y,x) ⟶ Co(y))&amp;quot;&lt;br /&gt;
           &amp;quot;¬(∃x. Co(x) ∧ V(x))&amp;quot;&lt;br /&gt;
  shows    &amp;quot;∃x. A(x) ∧ Co(x)&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  from assms(2) obtain a where 1: &amp;quot;Co(a) ∧ E(a) ∧ (∀y. Ca(y,a) ⟶ Co(y))&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;Co(a)&amp;quot; ..&lt;br /&gt;
  have 2:&amp;quot; E(a) ∧ (∀y. Ca(y,a) ⟶ Co(y))&amp;quot; using 1 ..&lt;br /&gt;
  hence &amp;quot;E(a)&amp;quot; ..&lt;br /&gt;
  have 3: &amp;quot;∀y. Ca(y,a) ⟶ Co(y)&amp;quot; using 2 ..&lt;br /&gt;
  have &amp;quot;¬V(a) ∨ V(a)&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃x. A(x) ∧ Co(x)&amp;quot;&lt;br /&gt;
     proof&lt;br /&gt;
       assume &amp;quot;¬V(a)&amp;quot;&lt;br /&gt;
         with `E(a)` have 4: &amp;quot;E(a) ∧ ¬V(a)&amp;quot; ..&lt;br /&gt;
         have &amp;quot;E(a) ∧ ¬V(a) ⟶ (∃y. A(y) ∧ Ca(y,a))&amp;quot; using assms(1) ..&lt;br /&gt;
         hence &amp;quot;∃y. A(y) ∧ Ca(y,a)&amp;quot; using 4 ..&lt;br /&gt;
         then obtain b where &amp;quot;A(b) ∧ Ca(b,a)&amp;quot; ..&lt;br /&gt;
         hence &amp;quot;A(b)&amp;quot; ..&lt;br /&gt;
         have &amp;quot;Ca(b,a)&amp;quot; using `A(b) ∧ Ca(b,a)` ..&lt;br /&gt;
         have &amp;quot;Ca(b,a) ⟶ Co(b)&amp;quot; using 3 ..&lt;br /&gt;
         hence &amp;quot;Co(b)&amp;quot; using `Ca(b,a)`..&lt;br /&gt;
         with `A(b)` have &amp;quot;A(b) ∧ Co(b)&amp;quot; ..&lt;br /&gt;
         thus &amp;quot;∃x. A(x) ∧ Co(x)&amp;quot; ..&lt;br /&gt;
       next &lt;br /&gt;
       assume &amp;quot;V(a)&amp;quot;&lt;br /&gt;
       with `Co(a) ` have &amp;quot;Co(a) ∧ V(a)&amp;quot; ..&lt;br /&gt;
       hence &amp;quot;∃x. Co(x) ∧ V(x)&amp;quot; ..&lt;br /&gt;
       with assms(3) show &amp;quot;∃x. A(x) ∧ Co(x)&amp;quot; ..&lt;br /&gt;
     qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7_c:&lt;br /&gt;
  &amp;quot;⟦∀x. E(x) ∧ ¬V(x) ⟶ (∃y. A(y) ∧ Ca(y,x));&lt;br /&gt;
      ∃x. Co(x) ∧ E(x) ∧ (∀y. Ca(y,x) ⟶ Co(y));&lt;br /&gt;
           ¬(∃x. Co(x) ∧ V(x)) ⟧ ⟹ ∃x. A(x) ∧ Co(x)&amp;quot;  &lt;br /&gt;
  apply (erule exE)&lt;br /&gt;
  apply (erule_tac x = x in allE)&lt;br /&gt;
  apply (drule mp)&lt;br /&gt;
   apply (rule conjI)&lt;br /&gt;
    apply (drule conjunct2)&lt;br /&gt;
    apply (drule conjunct1, assumption)&lt;br /&gt;
   apply (rule notI)&lt;br /&gt;
   apply (erule notE)&lt;br /&gt;
   apply (drule conjunct1)&lt;br /&gt;
   apply (rule_tac x = x in exI)&lt;br /&gt;
   apply (rule conjI, assumption+)&lt;br /&gt;
  apply (erule exE)&lt;br /&gt;
  apply (rule_tac x = y in exI)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
    apply (erule conjunct1)+&lt;br /&gt;
  apply (drule conjunct2)+&lt;br /&gt;
  apply (erule_tac x = y in allE)&lt;br /&gt;
  apply (drule mp, assumption+)&lt;br /&gt;
    done&lt;br /&gt;
    &lt;br /&gt;
  &lt;br /&gt;
section {* Ejercicios con igualdad *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Formalizar el siguiente argumento &lt;br /&gt;
     Rosa ama a Curro. Paco no simpatiza con Ana. Quien no simpatiza con&lt;br /&gt;
     Ana ama a Rosa. Si una persona ama a otra, la segunda ama a la&lt;br /&gt;
     primera. Hay como máximo una persona que ama a Rosa. Por tanto,&lt;br /&gt;
     Paco es Curro. &lt;br /&gt;
  Usar A(x,y) para x ama a y &lt;br /&gt;
       S(x,y) para x simpatiza con y &lt;br /&gt;
       a      para Ana&lt;br /&gt;
       c      para Curro&lt;br /&gt;
       p      para Paco &lt;br /&gt;
       r      para Rosa&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8_a:&lt;br /&gt;
  assumes &amp;quot;A(r,c)&amp;quot; &lt;br /&gt;
          &amp;quot;¬S(p,a)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. ¬S(x,a) ⟶ A(x,r)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x y. A(x,y) ⟶ A(y,x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x y. A(x,r) ∧ A(y,r) ⟶ x=y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p = c&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8_b:&lt;br /&gt;
  assumes &amp;quot;A(r,c)&amp;quot; &lt;br /&gt;
          &amp;quot;¬S(p,a)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. ¬S(x,a) ⟶ A(x,r)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x y. A(x,y) ⟶ A(y,x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x y. A(x,r) ∧ A(y,r) ⟶ x=y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p = c&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  have &amp;quot;∀y. A(r,y) ⟶ A(y,r)&amp;quot; using assms(4) ..&lt;br /&gt;
  hence &amp;quot;A(r,c) ⟶ A(c,r)&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;A(c,r)&amp;quot; using assms(1) ..&lt;br /&gt;
  have &amp;quot;¬S(p,a) ⟶ A(p,r)&amp;quot; using assms(3) ..&lt;br /&gt;
  hence &amp;quot;A(p,r)&amp;quot; using assms(2) ..&lt;br /&gt;
  hence 1: &amp;quot;A(p,r) ∧ A(c,r)&amp;quot; using `A(c,r)`..&lt;br /&gt;
  have &amp;quot;∀y. A(p,r) ∧ A(y,r) ⟶ p=y&amp;quot; using assms(5) ..&lt;br /&gt;
  hence &amp;quot;A(p,r) ∧ A(c,r) ⟶ p=c&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;p=c&amp;quot; using 1 ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8_c:&lt;br /&gt;
  &amp;quot;⟦A(r,c);&lt;br /&gt;
    ¬S(p,a);&lt;br /&gt;
     ∀x. ¬S(x,a) ⟶ A(x,r);&lt;br /&gt;
     ∀x y. A(x,y) ⟶ A(y,x);&lt;br /&gt;
     ∀x y. A(x,r) ∧ A(y,r) ⟶ x=y ⟧ ⟹ p = c&amp;quot;  &lt;br /&gt;
  apply (drule_tac x = p in spec)&lt;br /&gt;
  apply (drule mp, assumption) &lt;br /&gt;
  apply (drule_tac x = r in spec)&lt;br /&gt;
  apply (drule_tac x = p in spec)&lt;br /&gt;
  apply (frule_tac x = c in spec)&lt;br /&gt;
  apply (drule mp, assumption)&lt;br /&gt;
  apply (drule_tac x = c in spec)+&lt;br /&gt;
  apply (rule mp, assumption)&lt;br /&gt;
    apply (rule conjI, assumption+)&lt;br /&gt;
    done&lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Formalizar el siguiente argumento &lt;br /&gt;
     Todos los filósofos se han preguntado qué es la filosofía. Los que&lt;br /&gt;
     se preguntan qué es la filosofía se vuelven locos. Nietzsche es&lt;br /&gt;
     filósofo. El maestro de Nietzsche no acabó loco. Por tanto,&lt;br /&gt;
     Nietzsche y su maestro son diferentes personas. &lt;br /&gt;
  Usar F(x) para x es filósofo&lt;br /&gt;
       L(x) para x se vuelve loco&lt;br /&gt;
       P(x) para x se ha preguntado qué es la filosofía.&lt;br /&gt;
       m    para el maestro de Nietzsche&lt;br /&gt;
       n    para Nietzsche&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9_a:&lt;br /&gt;
  assumes &amp;quot;∀x. F(x) ⟶ P(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. P(x) ⟶ L(x)&amp;quot;&lt;br /&gt;
          &amp;quot;F(n)&amp;quot;&lt;br /&gt;
          &amp;quot;¬L(m)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;n ≠ m&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9_b:&lt;br /&gt;
  assumes &amp;quot;∀x. F(x) ⟶ P(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. P(x) ⟶ L(x)&amp;quot;&lt;br /&gt;
          &amp;quot;F(n)&amp;quot;&lt;br /&gt;
          &amp;quot;¬L(m)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;n ≠ m&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;n = m&amp;quot; &lt;br /&gt;
  hence &amp;quot;F(m)&amp;quot; using assms(3) by (rule subst)&lt;br /&gt;
  have &amp;quot;F(m) ⟶ P(m)&amp;quot; using assms(1) ..&lt;br /&gt;
  hence &amp;quot;P(m)&amp;quot; using `F(m)` ..&lt;br /&gt;
  have &amp;quot;P(m) ⟶ L(m)&amp;quot; using assms(2) ..&lt;br /&gt;
  hence &amp;quot;L(m)&amp;quot; using `P(m)` ..&lt;br /&gt;
  with assms(4) show False ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9_c:&lt;br /&gt;
  &amp;quot;⟦∀x. F(x) ⟶ P(x);&lt;br /&gt;
    ∀x. P(x) ⟶ L(x);&lt;br /&gt;
    F(n);&lt;br /&gt;
    ¬L(m) ⟧ ⟹ n ≠ m&amp;quot;  &lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule_tac x = n in allE)&lt;br /&gt;
  apply (drule mp, assumption)&lt;br /&gt;
  apply (erule_tac x = m in allE)&lt;br /&gt;
    apply (erule notE)&lt;br /&gt;
  apply (erule mp)&lt;br /&gt;
  apply (erule subst, assumption)&lt;br /&gt;
    done&lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Formalizar el siguiente argumento &lt;br /&gt;
     Eduardo pudo haber visto al asesino. Antonio fue el primer testigo&lt;br /&gt;
     de la defensa. O Eduardo estaba en clase o Antonio dio falso&lt;br /&gt;
     testimonio. Nadie en clase pudo haber visto al asesino. Luego, el&lt;br /&gt;
     primer testigo de la defensa dio falso testimonio. &lt;br /&gt;
  Usar C(x) para x estaba en clase&lt;br /&gt;
       F(x) para x dio falso testimonio&lt;br /&gt;
       V(x) para x pudo haber visto al asesino&lt;br /&gt;
       a    para Antonio&lt;br /&gt;
       e    para Eduardo&lt;br /&gt;
       p    para el primer testigo de la defensa&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10_a:&lt;br /&gt;
  assumes &amp;quot;V(e)&amp;quot;&lt;br /&gt;
          &amp;quot;a = p&amp;quot;&lt;br /&gt;
          &amp;quot;C(e) ∨ F(a)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. C(x) ⟶ ¬V(x)&amp;quot;&lt;br /&gt;
   shows  &amp;quot;F(p)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10_b:&lt;br /&gt;
  assumes &amp;quot;V(e)&amp;quot;&lt;br /&gt;
          &amp;quot;a = p&amp;quot;&lt;br /&gt;
          &amp;quot;C(e) ∨ F(a)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. C(x) ⟶ ¬V(x)&amp;quot;&lt;br /&gt;
   shows  &amp;quot;F(p)&amp;quot;&lt;br /&gt;
using assms(3)&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;C(e)&amp;quot;&lt;br /&gt;
    have &amp;quot;C(e) ⟶ ¬V(e)&amp;quot; using assms(4) ..&lt;br /&gt;
    hence &amp;quot;¬V(e)&amp;quot; using `C(e)` ..&lt;br /&gt;
    thus  &amp;quot;F(p)&amp;quot; using assms(1) ..&lt;br /&gt;
  next&lt;br /&gt;
  assume &amp;quot;F(a)&amp;quot;&lt;br /&gt;
   with assms(2) show &amp;quot;F(p)&amp;quot; by (rule subst)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10_c:&lt;br /&gt;
  &amp;quot;⟦ V(e);&lt;br /&gt;
     a = p;&lt;br /&gt;
     C(e) ∨ F(a);&lt;br /&gt;
     ∀x. C(x) ⟶ ¬V(x) ⟧ ⟹ F(p)&amp;quot;  &lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule_tac x = e in allE)&lt;br /&gt;
   apply (drule mp, assumption)&lt;br /&gt;
   apply (erule notE, assumption)&lt;br /&gt;
  apply (erule subst, assumption)&lt;br /&gt;
    done&lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_7&amp;diff=563</id>
		<title>Sol 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_7&amp;diff=563"/>
		<updated>2019-04-09T10:52:00Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
theory R7_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  El objetivo de esta relación es escribir demostraciones usando sólo&lt;br /&gt;
  las reglas básicas de deducción natural de la lógica proposicional y&lt;br /&gt;
  los métodos rule, erule, frule, drule y assumption.&lt;br /&gt;
&lt;br /&gt;
  Las reglas básicas de la deducción natural son las siguientes:&lt;br /&gt;
  · conjI:          ⟦P; Q⟧ ⟹ P ∧ Q&lt;br /&gt;
  · conjunct1:      P ∧ Q ⟹ P&lt;br /&gt;
  · conjunct2:      P ∧ Q ⟹ Q&lt;br /&gt;
  · conjE:          ⟦P ∧ Q; ⟦P; Q⟧ ⟹ R⟧ ⟹ R&lt;br /&gt;
  · notE:           ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  · notI:           (P ⟹ False) ⟹ ¬P&lt;br /&gt;
  · mp:             ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
  · mt:             ⟦F ⟶ G; ¬G⟧ ⟹ ¬F &lt;br /&gt;
  · impI:           (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
  · impE:           ⟦P ⟶ Q; P; Q ⟹ R⟧ ⟹ R&lt;br /&gt;
  · disjI1:         P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2:         Q ⟹ P ∨ Q&lt;br /&gt;
  · disjE:          ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R &lt;br /&gt;
  · FalseE:         False ⟹ P&lt;br /&gt;
  · iffI:           ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P = Q&lt;br /&gt;
  · iffD1:          ⟦Q = P; Q⟧ ⟹ P &lt;br /&gt;
  · iffD2:          ⟦P = Q; Q⟧ ⟹ P&lt;br /&gt;
  · iffE:           ⟦P = Q; ⟦P ⟶ Q; Q ⟶ P⟧ ⟹ R⟧ ⟹ R&lt;br /&gt;
  · notnotD:        ¬¬ P ⟹ P&lt;br /&gt;
  · not_not:        P = ¬¬P&lt;br /&gt;
  · ccontr:         (¬P ⟹ False) ⟹ P&lt;br /&gt;
  · excluded_midle: ¬P ∨ P&lt;br /&gt;
  · classical:      (¬ P ⟹ P) ⟹ P&lt;br /&gt;
  · contrapos_nn    ⟦¬Q; P ⟹ Q⟧ ⟹ ¬P&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Implicaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       p ⟶ q, p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej1: &amp;quot;⟦p ⟶ q; p⟧ ⟹ q&amp;quot; &lt;br /&gt;
  apply (erule mp)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej2: &amp;quot;⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r&amp;quot;&lt;br /&gt;
  apply (erule mp)+&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done  &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r), p ⟶ q, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej3a: &amp;quot;⟦p ⟶ (q ⟶ r); p ⟶ q; p⟧ ⟹ r&amp;quot;&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption+&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
lemma ej3b: &amp;quot;⟦p ⟶ (q ⟶ r); p ⟶ q; p⟧ ⟹ r&amp;quot;&lt;br /&gt;
  apply (erule impE, assumption+)+&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r ⊢ p ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ej4: &amp;quot;⟦p ⟶ q; q ⟶ r⟧ ⟹ p ⟶ r&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule mp)&lt;br /&gt;
  apply (erule mp)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ q ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej5: &amp;quot;p ⟶ (q ⟶ r) ⟹ q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule impE, assumption)&lt;br /&gt;
  apply (erule impE, assumption+)&lt;br /&gt;
  done  &lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ (p ⟶ q) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej6: &amp;quot;p ⟶ (q ⟶ r) ⟹ (p ⟶ q) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule impE, assumption)&lt;br /&gt;
  apply (erule impE, assumption)&lt;br /&gt;
  apply (erule impE, assumption+)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar&lt;br /&gt;
     p ⊢ q ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej7: &amp;quot;p ⟹ q ⟶ p&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar&lt;br /&gt;
     ⊢ p ⟶ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej8: &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ (q ⟶ r) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej9: &amp;quot;p ⟶ q ⟹ (q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule impE, assumption)&lt;br /&gt;
  apply (erule impE, assumption+)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ (r ⟶ s)) ⊢ r ⟶ (q ⟶ (p ⟶ s))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej10: &amp;quot;p ⟶ (q ⟶ (r ⟶ s)) ⟹ r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
  apply (rule impI)+&lt;br /&gt;
  apply (erule impE, assumption+)+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej11: &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
  apply (rule impI)+&lt;br /&gt;
  apply (erule impE, assumption+)+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej12: &amp;quot;(p ⟶ q) ⟶ r ⟹ p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  apply (rule impI)+&lt;br /&gt;
  apply (rule_tac P=&amp;quot;p ⟶ q&amp;quot; in mp)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
  &lt;br /&gt;
section {* Conjunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar&lt;br /&gt;
     p, q ⊢  p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej13: &amp;quot;⟦p; q⟧ ⟹ p ∧ q&amp;quot;&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej14: &amp;quot;p ∧ q ⟹ p&amp;quot;&lt;br /&gt;
  apply (erule conjunct1)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar&lt;br /&gt;
     p ∧ q ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej15: &amp;quot;p ∧ q ⟹ q&amp;quot;&lt;br /&gt;
  apply (erule conjunct2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar&lt;br /&gt;
     p ∧ (q ∧ r) ⊢ (p ∧ q) ∧ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej16: &amp;quot;p ∧ (q ∧ r) ⟹ (p ∧ q) ∧ r&amp;quot;&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (rule conjI)&lt;br /&gt;
    apply (erule conjunct1)&lt;br /&gt;
   apply (drule conjunct2)&lt;br /&gt;
   apply (erule conjunct1)&lt;br /&gt;
  apply (drule conjunct2)&lt;br /&gt;
  apply (erule conjunct2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar&lt;br /&gt;
     (p ∧ q) ∧ r ⊢ p ∧ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej17: &amp;quot;(p ∧ q) ∧ r ⟹ p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (drule conjunct1)&lt;br /&gt;
   apply (erule conjunct1)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (drule conjunct1)&lt;br /&gt;
   apply (erule conjunct2)&lt;br /&gt;
  apply (erule conjunct2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej18: &amp;quot;p ∧ q ⟹ p ⟶ q&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule conjunct2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar&lt;br /&gt;
     (p ⟶ q) ∧ (p ⟶ r) ⊢ p ⟶ q ∧ r   &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej19: &amp;quot;(p ⟶ q) ∧ (p ⟶ r) ⟹ p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (drule conjunct1)&lt;br /&gt;
   apply (erule impE)&lt;br /&gt;
    apply assumption&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (drule conjunct2)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar&lt;br /&gt;
     p ⟶ q ∧ r ⊢ (p ⟶ q) ∧ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej20: &amp;quot;p ⟶ q ∧ r ⟹ (p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (rule impI)&lt;br /&gt;
   apply (erule impE)&lt;br /&gt;
    apply assumption&lt;br /&gt;
    apply (erule conjunct1)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule conjunct2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej21_1: &amp;quot;p ⟶ (q ⟶ r) ⟹ p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar&lt;br /&gt;
     p ∧ q ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej22: &amp;quot;p ∧ q ⟶ r ⟹ p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
    apply (rule conjI)&lt;br /&gt;
    apply assumption+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej23: &amp;quot;(p ⟶ q) ⟶ r ⟹ p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply (rule impI)&lt;br /&gt;
   apply (erule conjunct2)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar&lt;br /&gt;
     p ∧ (q ⟶ r) ⊢ (p ⟶ q) ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej24: &amp;quot;p ∧ (q ⟶ r) ⟹ (p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
section {* Disyunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar&lt;br /&gt;
     p ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej25: &amp;quot;p ⟹ p ∨ q&amp;quot;&lt;br /&gt;
  apply (erule disjI1)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar&lt;br /&gt;
     q ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej26: &amp;quot;q ⟹ p ∨ q&amp;quot;&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar&lt;br /&gt;
     p ∨ q ⊢ q ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej27: &amp;quot;p ∨ q ⟹ q ∨ p&amp;quot;&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule disjI2)&lt;br /&gt;
  apply (erule disjI1)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 28. Demostrar&lt;br /&gt;
     q ⟶ r ⊢ p ∨ q ⟶ p ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej28: &amp;quot;q ⟶ r ⟹ p ∨ q ⟶ p ∨ r&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule disjI1)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 29. Demostrar&lt;br /&gt;
     p ∨ p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej29: &amp;quot;p ∨ p ⟹ p&amp;quot;&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply assumption+&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 30. Demostrar&lt;br /&gt;
     p ⊢ p ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej30: &amp;quot;p ⟹ p ∨ p&amp;quot;&lt;br /&gt;
  apply (erule disjI1)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 31. Demostrar&lt;br /&gt;
     p ∨ (q ∨ r) ⊢ (p ∨ q) ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej31: &amp;quot;p ∨ (q ∨ r) ⟹ (p ∨ q) ∨ r&amp;quot;&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (rule disjI1)&lt;br /&gt;
   apply (erule disjI1)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (rule disjI1)&lt;br /&gt;
   apply (erule disjI2)&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 32. Demostrar&lt;br /&gt;
     (p ∨ q) ∨ r ⊢ p ∨ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej32: &amp;quot;(p ∨ q) ∨ r ⟹ p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule disjE)&lt;br /&gt;
    apply (erule disjI1)&lt;br /&gt;
   apply (rule disjI2)&lt;br /&gt;
   apply (erule disjI1)&lt;br /&gt;
  apply (rule disjI2)&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 33. Demostrar&lt;br /&gt;
     p ∧ (q ∨ r) ⊢ (p ∧ q) ∨ (p ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej33: &amp;quot;p ∧ (q ∨ r) ⟹ (p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (rule disjI1)&lt;br /&gt;
   apply (rule conjI)&lt;br /&gt;
    apply assumption&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (rule disjI2)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 34. Demostrar&lt;br /&gt;
     (p ∧ q) ∨ (p ∧ r) ⊢ p ∧ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej34: &amp;quot;(p ∧ q) ∨ (p ∧ r) ⟹ p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (erule disjE)&lt;br /&gt;
    apply (erule conjunct1)&lt;br /&gt;
   apply (erule conjunct1)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule conjE)&lt;br /&gt;
   apply (rule disjI1)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 35. Demostrar&lt;br /&gt;
     p ∨ (q ∧ r) ⊢ (p ∨ q) ∧ (p ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej35: &amp;quot;p ∨ (q ∧ r) ⟹ (p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (rule conjI)&lt;br /&gt;
    apply (erule disjI1)&lt;br /&gt;
   apply (erule disjI1)&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (erule disjI2)&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 36. Demostrar&lt;br /&gt;
     (p ∨ q) ∧ (p ∨ r) ⊢ p ∨ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej36: &amp;quot;(p ∨ q) ∧ (p ∨ r) ⟹ p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule disjI1)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule disjI1)&lt;br /&gt;
  apply (rule disjI2)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply assumption+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 37. Demostrar&lt;br /&gt;
     (p ⟶ r) ∧ (q ⟶ r) ⊢ p ∨ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej37: &amp;quot;(p ⟶ r) ∧ (q ⟶ r) ⟹ p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule impE, assumption+)+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 38. Demostrar&lt;br /&gt;
     p ∨ q ⟶ r ⊢ (p ⟶ r) ∧ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej38: &amp;quot;p ∨ q ⟶ r ⟹ (p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (rule impI)&lt;br /&gt;
   apply (erule impE)&lt;br /&gt;
    apply (erule disjI1)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
section {* Negación *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 39. Demostrar&lt;br /&gt;
     p ⊢ ¬¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej39: &amp;quot;p ⟹ ¬¬p&amp;quot;&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 40. Demostrar&lt;br /&gt;
     ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej40: &amp;quot;¬p ⟹ p ⟶ q&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 41. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ ¬q ⟶ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej41: &amp;quot;p ⟶ q ⟹ ¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 42. Demostrar&lt;br /&gt;
     p ∨ q, ¬q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej42: &amp;quot;⟦p ∨ q; ¬q⟧ ⟹ p&amp;quot;&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 43. Demostrar&lt;br /&gt;
     p ∨ q, ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej43: &amp;quot;⟦p ∨ q; ¬p⟧ ⟹ q&amp;quot;&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule notE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 44. Demostrar&lt;br /&gt;
     p ∨ q ⊢ ¬(¬p ∧ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej44: &amp;quot;p ∨ q ⟹ ¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule notE, assumption)+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 45. Demostrar&lt;br /&gt;
     p ∧ q ⊢ ¬(¬p ∨ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej45: &amp;quot;p ∧ q ⟹ ¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule notE, assumption)+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 46. Demostrar&lt;br /&gt;
     ¬(p ∨ q) ⊢ ¬p ∧ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej46: &amp;quot;¬(p ∨ q) ⟹ ¬p ∧ ¬q&amp;quot;&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (rule notI)&lt;br /&gt;
   apply (erule notE)&lt;br /&gt;
   apply (erule disjI1)&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 47. Demostrar&lt;br /&gt;
     ¬p ∧ ¬q ⊢ ¬(p ∨ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej47: &amp;quot;¬p ∧ ¬q ⟹ ¬(p ∨ q)&amp;quot;&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule notE, assumption)+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 48. Demostrar&lt;br /&gt;
     ¬p ∨ ¬q ⊢ ¬(p ∧ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej48: &amp;quot;¬p ∨ ¬q ⟹ ¬(p ∧ q)&amp;quot;&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule notE, assumption)+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 49. Demostrar&lt;br /&gt;
     ⊢ ¬(p ∧ ¬p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej49: &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 50. Demostrar&lt;br /&gt;
     p ∧ ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej50: &amp;quot;p ∧ ¬p ⟹ q&amp;quot;&lt;br /&gt;
  apply (erule conjE)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 51. Demostrar&lt;br /&gt;
     ¬¬p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej51: &amp;quot;¬¬p ⟹ p&amp;quot;&lt;br /&gt;
  apply (erule notnotD)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 52. Demostrar&lt;br /&gt;
     ⊢ p ∨ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej52: &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
  apply (cut_tac P=&amp;quot;¬p&amp;quot; in excluded_middle)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
  apply (rule disjI1)&lt;br /&gt;
   apply (erule notnotD)&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 53. Demostrar&lt;br /&gt;
     ⊢ ((p ⟶ q) ⟶ p) ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej53: &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule ccontr)&lt;br /&gt;
  apply (cut_tac P=&amp;quot;p ⟶ q&amp;quot; in excluded_middle)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule_tac P=&amp;quot;p ⟶ q&amp;quot; in notE)&lt;br /&gt;
   apply (rule impI)&lt;br /&gt;
   apply (erule notE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 54. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej54: &amp;quot;¬q ⟶ ¬p ⟹ p ⟶ q&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule ccontr)&lt;br /&gt;
  apply (erule impE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (erule notE)+&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 55. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej55: &amp;quot;¬(¬p ∧ ¬q) ⟹ p ∨ q&amp;quot;&lt;br /&gt;
  apply (cut_tac P=p in excluded_middle)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
    apply (cut_tac P=q in excluded_middle)&lt;br /&gt;
   apply (erule disjE)&lt;br /&gt;
    apply (erule notE)&lt;br /&gt;
    apply (rule conjI)&lt;br /&gt;
     apply assumption+&lt;br /&gt;
   apply (erule disjI2)&lt;br /&gt;
  apply (erule disjI1)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 56. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej56: &amp;quot;¬(¬p ∨ ¬q) ⟹ p ∧ q&amp;quot;&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (rule ccontr)&lt;br /&gt;
   apply (erule notE)&lt;br /&gt;
   apply (erule disjI1)&lt;br /&gt;
  apply (rule ccontr)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply (erule disjI2)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 57. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej57: &amp;quot;¬(p ∧ q) ⟹ ¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  apply (cut_tac P=p in excluded_middle)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule disjI1)&lt;br /&gt;
  apply (cut_tac P=q in excluded_middle)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule disjI2)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply assumption+&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 58. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej58: &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
  apply (cut_tac P=p in excluded_middle)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (rule disjI1)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
   apply assumption&lt;br /&gt;
  apply (rule disjI2)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply assumption&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_6&amp;diff=562</id>
		<title>Sol 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_6&amp;diff=562"/>
		<updated>2019-04-09T10:51:16Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R6: Deducción natural en lógica de de primer orden *}&lt;br /&gt;
&lt;br /&gt;
theory R6_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional, de los&lt;br /&gt;
  cuantificadores y de la igualdad: &lt;br /&gt;
  · conjI:      ⟦P; Q⟧ ⟹ P ∧ Q&lt;br /&gt;
  · conjunct1:  P ∧ Q ⟹ P&lt;br /&gt;
  · conjunct2:  P ∧ Q ⟹ Q  &lt;br /&gt;
  · notnotD:    ¬¬ P ⟹ P&lt;br /&gt;
  · mp:         ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
  · impI:       (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
  · disjI1:     P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2:     Q ⟹ P ∨ Q&lt;br /&gt;
  · disjE:      ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R &lt;br /&gt;
  · FalseE:     False ⟹ P&lt;br /&gt;
  · notE:       ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  · notI:       (P ⟹ False) ⟹ ¬P&lt;br /&gt;
  · iffI:       ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P = Q&lt;br /&gt;
  · iffD1:      ⟦Q = P; Q⟧ ⟹ P &lt;br /&gt;
  · iffD2:      ⟦P = Q; Q⟧ ⟹ P&lt;br /&gt;
  · ccontr:     (¬P ⟹ False) ⟹ P&lt;br /&gt;
  . excluded_middel:(¬P ∨ P) &lt;br /&gt;
&lt;br /&gt;
  · allE:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allI:       (⋀x. P x) ⟹ ∀x. P x&lt;br /&gt;
  · exI:        P x ⟹ ∃x. P x&lt;br /&gt;
  · exE:        ⟦∃x. P x; ⋀x. P x ⟹ Q⟧ ⟹ Q&lt;br /&gt;
&lt;br /&gt;
  · refl:       t = t&lt;br /&gt;
  · subst:      ⟦s = t; P s⟧ ⟹ P t&lt;br /&gt;
  · trans:      ⟦r = s; s = t⟧ ⟹ r = t&lt;br /&gt;
  · sym:        s = t ⟹ t = s&lt;br /&gt;
  · not_sym:    t ≠ s ⟹ s ≠ t&lt;br /&gt;
  · ssubst:     ⟦t = s; P s⟧ ⟹ P t&lt;br /&gt;
  · box_equals: ⟦a = b; a = c; b = d⟧ ⟹ a: = d&lt;br /&gt;
  · arg_cong:   x = y ⟹ f x = f y&lt;br /&gt;
  · fun_cong:   f = g ⟹ f x = g x&lt;br /&gt;
  · cong:       ⟦f = g; x = y⟧ ⟹ f x = g y&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI y mt que demostramos a continuación.&lt;br /&gt;
  *}&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       ∀x. P x ⟶ Q x ⊢ (∀x. P x) ⟶ (∀x. Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1a: &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀x. P x) ⟶ (∀x. Q x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  show &amp;quot;∀x. Q x&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix a&lt;br /&gt;
    have &amp;quot;P a&amp;quot; using `∀x. P x` by (rule allE)&lt;br /&gt;
    have &amp;quot;P a ⟶ Q a&amp;quot; using assms ..&lt;br /&gt;
    thus &amp;quot;Q a&amp;quot;  using `P a` ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1b: &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀x. P x) ⟶ (∀x. Q x)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
       ∃x. ¬(P x) ⊢ ¬(∀x. P x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2a: &lt;br /&gt;
  assumes &amp;quot;∃x. ¬(P x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∀x. P x)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
    obtain a where &amp;quot;¬(P a)&amp;quot; using assms ..&lt;br /&gt;
    have &amp;quot;P a&amp;quot; using `∀x. P x` ..&lt;br /&gt;
    with `¬(P a)` show False ..&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2b: &lt;br /&gt;
  assumes &amp;quot;∃x. ¬(P x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∀x. P x)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
       ∀x. P x ⊢ ∀y. P y&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3a: &lt;br /&gt;
  assumes &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀y. P y&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix a show &amp;quot;P a&amp;quot; using assms ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3b: &lt;br /&gt;
  assumes &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀y. P y&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
       ∀x. P x ⟶ Q x ⊢ (∀x. ¬(Q x)) ⟶ (∀x. ¬ (P x))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4a: &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀x. ¬(Q x)) ⟶ (∀x. ¬ (P x))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∀x. ¬(Q x)&amp;quot;&lt;br /&gt;
  show &amp;quot;∀x. ¬ (P x)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix a&lt;br /&gt;
    have &amp;quot;¬(Q a)&amp;quot; using `∀x. ¬(Q x)` ..&lt;br /&gt;
    have &amp;quot;P a ⟶ Q a&amp;quot; using assms ..&lt;br /&gt;
    thus &amp;quot;¬(P a)&amp;quot; using `¬(Q a)`  by (rule mt)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4b: &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀x. ¬(Q x)) ⟶ (∀x. ¬ (P x))&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
       ∀x. P x  ⟶ ¬(Q x) ⊢ ¬(∃x. P x ∧ Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5a: &lt;br /&gt;
  assumes &amp;quot;∀x. P x  ⟶ ¬(Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∃x. P x ∧ Q x)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;∃x. P x ∧ Q x&amp;quot;&lt;br /&gt;
    then obtain a where &amp;quot;P a ∧ Q a&amp;quot; ..&lt;br /&gt;
    hence &amp;quot;P a&amp;quot; ..&lt;br /&gt;
    have &amp;quot;P a  ⟶ ¬(Q a)&amp;quot; using assms ..&lt;br /&gt;
    hence &amp;quot;¬(Q a)&amp;quot; using `P a` ..&lt;br /&gt;
    have &amp;quot;Q a&amp;quot; using `P a ∧ Q a` ..&lt;br /&gt;
    with `¬(Q a)` show False ..&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5b: &lt;br /&gt;
  assumes &amp;quot;∀x. P x  ⟶ ¬(Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∃x. P x ∧ Q x)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar&lt;br /&gt;
       ∀x y. P x y ⊢ ∀u v. P u v&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6a: &lt;br /&gt;
  assumes &amp;quot;∀x y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀u v. P u v&amp;quot;&lt;br /&gt;
proof (rule allI)+&lt;br /&gt;
  fix a b&lt;br /&gt;
  have &amp;quot;∀y. P a y&amp;quot; using assms ..&lt;br /&gt;
  thus &amp;quot;P a b&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6b: &lt;br /&gt;
  assumes &amp;quot;∀x y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀u v. P u v&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
  fix a&lt;br /&gt;
  show &amp;quot;∀y. P a y&amp;quot; using assms ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6c: &lt;br /&gt;
  assumes &amp;quot;∀x y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀u v. P u v&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix a&lt;br /&gt;
  show &amp;quot;∀y. P a y&amp;quot; using assms ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6d: &lt;br /&gt;
  assumes &amp;quot;∀x y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀u v. P u v&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar&lt;br /&gt;
       ∃x y. P x y ⟹ ∃u v. P u v&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7a: &lt;br /&gt;
  assumes &amp;quot;∃x y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃u v. P u v&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    obtain a where &amp;quot;∃y. P a y&amp;quot; using assms ..&lt;br /&gt;
    then obtain b where &amp;quot;P a b&amp;quot; ..&lt;br /&gt;
    hence &amp;quot;∃v. P a v&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;∃u v. P u v&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7c: &lt;br /&gt;
  assumes &amp;quot;∃x y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃u v. P u v&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar&lt;br /&gt;
       ∃x. ∀y. P x y ⊢ ∀y. ∃x. P x y&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8a: &lt;br /&gt;
  assumes &amp;quot;∃x. ∀y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀y. ∃x. P x y&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix b&lt;br /&gt;
  obtain a where &amp;quot;∀y. P a y&amp;quot; using assms ..&lt;br /&gt;
  hence &amp;quot;P a b&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃x. P x b&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8b: &lt;br /&gt;
  assumes &amp;quot;∃x. ∀y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀y. ∃x. P x y&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar&lt;br /&gt;
       ∃x. P a ⟶ Q x ⊢ P a ⟶ (∃x. Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9a: &lt;br /&gt;
  assumes &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;P a&amp;quot;&lt;br /&gt;
    obtain b where &amp;quot;P a ⟶ Q b&amp;quot; using assms ..&lt;br /&gt;
    hence &amp;quot;Q b&amp;quot; using `P a`..&lt;br /&gt;
    thus &amp;quot;∃x . Q x&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9b: &lt;br /&gt;
  assumes &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar&lt;br /&gt;
       P a ⟶ (∃x. Q x) ⊢ ∃x. P a ⟶ Q x &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10a: &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot;&lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;¬(P a) ∨ (P a)&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;¬(P a)&amp;quot;&lt;br /&gt;
        have &amp;quot;P a ⟶ Q a&amp;quot;&lt;br /&gt;
          proof&lt;br /&gt;
            assume &amp;quot;P a&amp;quot;&lt;br /&gt;
            with `¬(P a)` show &amp;quot;Q a&amp;quot; ..&lt;br /&gt;
          qed&lt;br /&gt;
          thus &amp;quot;∃x. P a ⟶ Q x&amp;quot; ..&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;P a&amp;quot;&lt;br /&gt;
        with assms have &amp;quot;∃x. Q x&amp;quot; ..&lt;br /&gt;
        then obtain b where &amp;quot;Q b&amp;quot; ..&lt;br /&gt;
        hence &amp;quot;P a ⟶  Q b&amp;quot; ..&lt;br /&gt;
        thus &amp;quot;∃x. P a ⟶ Q x&amp;quot; ..&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10b: &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar&lt;br /&gt;
       (∃x. P x) ⟶ Q a ⊢ ∀x. P x ⟶ Q a&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_11a: &lt;br /&gt;
  assumes &amp;quot;(∃x. P x) ⟶ Q a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ⟶ Q a&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix b&lt;br /&gt;
  show &amp;quot;P b ⟶  Q a&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;P b&amp;quot;&lt;br /&gt;
      hence &amp;quot;∃x. P x&amp;quot; ..&lt;br /&gt;
      with assms show &amp;quot;Q a&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_11b: &lt;br /&gt;
  assumes &amp;quot;(∃x. P x) ⟶ Q a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ⟶ Q a&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar&lt;br /&gt;
       ∀x. P x ⟶ Q a ⊢ ∃ x. P x ⟶ Q a&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_12a: &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P x ⟶ Q a&amp;quot;&lt;br /&gt;
proof - (* comentar sin - *)&lt;br /&gt;
  have &amp;quot;P b ⟶  Q a&amp;quot; using assms .. (* ¿universo? *)&lt;br /&gt;
  thus &amp;quot;∃x. P x ⟶ Q a&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_12b: &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P x ⟶ Q a&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar&lt;br /&gt;
       (∀x. P x) ∨ (∀x. Q x) ⊢ ∀x. P x ∨ Q x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13a: &lt;br /&gt;
  assumes &amp;quot;(∀x. P x) ∨ (∀x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ∨ Q x&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  show &amp;quot;∀x. P x ∨ Q x&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix a&lt;br /&gt;
      have &amp;quot;P a&amp;quot; using `∀x. P x` ..&lt;br /&gt;
      thus &amp;quot;P a ∨ Q a&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;∀x. Q x&amp;quot;&lt;br /&gt;
  show &amp;quot;∀x. P x ∨ Q x&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix a&lt;br /&gt;
      have &amp;quot;Q a&amp;quot; using `∀x. Q x` ..&lt;br /&gt;
      thus &amp;quot;P a ∨ Q a&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13b: &lt;br /&gt;
  assumes &amp;quot;(∀x. P x) ∨ (∀x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ∨ Q x&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix a&lt;br /&gt;
  note assms&lt;br /&gt;
  thus &amp;quot;P a ∨ Q a&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
    hence &amp;quot;P a&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;P a ∨ Q a&amp;quot; ..&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;∀x. Q x&amp;quot;&lt;br /&gt;
    hence &amp;quot;Q a&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;P a ∨ Q a&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13c: &lt;br /&gt;
  assumes &amp;quot;(∀x. P x) ∨ (∀x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ∨ Q x&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar&lt;br /&gt;
       ∃x. P x ∧ Q x ⊢ (∃x. P x) ∧ (∃x. Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_14a: &lt;br /&gt;
  assumes &amp;quot;∃x. P x ∧ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃x. P x) ∧ (∃x. Q x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
  obtain a where &amp;quot;P a ∧ Q a&amp;quot; using assms ..&lt;br /&gt;
  hence &amp;quot;P a&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃x. P x&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;∃x. Q x&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
      obtain a where &amp;quot;P a ∧ Q a&amp;quot; using assms ..&lt;br /&gt;
      hence &amp;quot;Q a&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;∃x. Q x&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_14b: &lt;br /&gt;
  assumes &amp;quot;∃x. P x ∧ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃x. P x) ∧ (∃x. Q x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  obtain a where &amp;quot;P a ∧ Q a&amp;quot; using assms ..&lt;br /&gt;
  hence &amp;quot;P a&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃x. P x&amp;quot; ..&lt;br /&gt;
next&lt;br /&gt;
  obtain a where &amp;quot;P a ∧ Q a&amp;quot; using assms ..&lt;br /&gt;
  hence &amp;quot;Q a&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃x. Q x&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_14c:&lt;br /&gt;
  assumes &amp;quot;∃x. P x ∧ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃x. P x) ∧ (∃x. Q x)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain a where &amp;quot;P a ∧ Q a&amp;quot; using assms ..&lt;br /&gt;
  {have &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
      have &amp;quot;P a&amp;quot; using `P a ∧ Q a` ..&lt;br /&gt;
      thus &amp;quot;∃x. P x&amp;quot; ..&lt;br /&gt;
    qed}&lt;br /&gt;
moreover&lt;br /&gt;
  {have &amp;quot;∃x. Q x&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;Q a&amp;quot; using `P a ∧ Q a` ..&lt;br /&gt;
    thus &amp;quot;∃x. Q x&amp;quot; ..&lt;br /&gt;
  qed}&lt;br /&gt;
  ultimately show &amp;quot;(∃x. P x) ∧ (∃x. Q x)&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_14d:&lt;br /&gt;
  assumes &amp;quot;∃x. P x ∧ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃x. P x) ∧ (∃x. Q x)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar&lt;br /&gt;
       ∀x y. P y ⟶ Q x ⊢ (∃y. P y) ⟶ (∀x. Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_15a: &lt;br /&gt;
  assumes &amp;quot;∀x y. P y ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃y. P y) ⟶ (∀x. Q x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∃y. P y&amp;quot;&lt;br /&gt;
  then obtain b where &amp;quot;P b&amp;quot; ..&lt;br /&gt;
  show &amp;quot;∀x. Q x&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix a&lt;br /&gt;
    have &amp;quot;∀y. P y ⟶ Q a&amp;quot; using assms ..&lt;br /&gt;
    hence &amp;quot;P b ⟶ Q a&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;Q a&amp;quot; using `P b` ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_15b: &lt;br /&gt;
  assumes &amp;quot;∀x y. P y ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃y. P y) ⟶ (∀x. Q x)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar&lt;br /&gt;
       ¬(∀x. ¬(P x)) ⊢ ∃x. P x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16a: &lt;br /&gt;
  assumes &amp;quot;¬(∀x. ¬(P x))&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬(∃x. P x)&amp;quot;&lt;br /&gt;
  have &amp;quot;∀x. ¬(P x)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix a&lt;br /&gt;
      show &amp;quot;¬(P a)&amp;quot;&lt;br /&gt;
        proof&lt;br /&gt;
          assume &amp;quot;P a&amp;quot;&lt;br /&gt;
          hence &amp;quot;∃x. P x&amp;quot; ..&lt;br /&gt;
          with `¬(∃x. P x)` show False ..&lt;br /&gt;
        qed&lt;br /&gt;
    qed&lt;br /&gt;
    with assms show False ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16b: &lt;br /&gt;
  assumes &amp;quot;¬(∀x. ¬(P x))&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar&lt;br /&gt;
       ∀x. ¬(P x) ⊢ ¬(∃x. P x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_17a: &lt;br /&gt;
  assumes &amp;quot;∀x. ¬(P x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∃x. P x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
  then obtain a where &amp;quot;P a &amp;quot; ..&lt;br /&gt;
  have &amp;quot;¬(P a)&amp;quot; using assms ..&lt;br /&gt;
  thus False using `P a` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_17b: &lt;br /&gt;
  assumes &amp;quot;∀x. ¬(P x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∃x. P x)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar&lt;br /&gt;
       ∃x. P x ⊢ ¬(∀x. ¬(P x))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18a: &lt;br /&gt;
  assumes &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∀x. ¬(P x))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  obtain a where &amp;quot;P a&amp;quot; using assms ..&lt;br /&gt;
  assume &amp;quot;∀x. ¬(P x)&amp;quot;&lt;br /&gt;
  hence &amp;quot;¬(P a)&amp;quot; ..&lt;br /&gt;
  thus False using `P a` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18b: &lt;br /&gt;
  assumes &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∀x. ¬(P x))&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar&lt;br /&gt;
       P a ⟶ (∀x. Q x) ⊢ ∀x. P a ⟶ Q x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_19a: &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∀x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix b&lt;br /&gt;
  show &amp;quot;P a ⟶ Q b&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;P a&amp;quot;&lt;br /&gt;
    with assms have &amp;quot;∀x. Q x&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;Q b&amp;quot; ..&lt;br /&gt;
  qed &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_19b: &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∀x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar&lt;br /&gt;
       {∀x y z. R x y ∧ R y z ⟶ R x z, &lt;br /&gt;
        ∀x. ¬(R x x)}&lt;br /&gt;
       ⊢ ∀x y. R x y ⟶ ¬(R y x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_20a: &lt;br /&gt;
  assumes &amp;quot;∀x y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. ¬(R x x)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;∀x y. R x y ⟶ ¬(R y x)&amp;quot;&lt;br /&gt;
proof (rule allI)+&lt;br /&gt;
  fix a b&lt;br /&gt;
  show &amp;quot;R a b ⟶ ¬(R b a)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;R a b&amp;quot;&lt;br /&gt;
    show &amp;quot;¬(R b a)&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;R b a&amp;quot;&lt;br /&gt;
        with `R a b` have &amp;quot;R a b ∧ R b a&amp;quot; ..&lt;br /&gt;
        have &amp;quot;¬(R a a)&amp;quot; using assms(2) ..&lt;br /&gt;
        have &amp;quot;∀y z. R a y ∧ R y z ⟶ R a z&amp;quot; using assms(1) ..&lt;br /&gt;
        hence &amp;quot;∀z. R a b ∧ R b z ⟶ R a z&amp;quot;  ..&lt;br /&gt;
        hence &amp;quot;R a b ∧ R b a ⟶ R a a&amp;quot; ..&lt;br /&gt;
        hence &amp;quot;R a a&amp;quot; using `R a b ∧ R b a` ..&lt;br /&gt;
        with `¬(R a a)` show False ..&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_20b:&lt;br /&gt;
  &amp;quot;⟦∀x y z. R x y ∧ R y z ⟶ R x z; ∀x. ¬(R x x)⟧ ⟹ ∀x y. R x y ⟶ ¬(R y x)&amp;quot;&lt;br /&gt;
by metis&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar&lt;br /&gt;
     {∀x. P x ∨ Q x, ∃x. ¬(Q x), ∀x. R x ⟶ ¬(P x)} ⊢ ∃x. ¬(R x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21a:&lt;br /&gt;
  assumes &amp;quot;∀x. P x ∨ Q x&amp;quot; &lt;br /&gt;
          &amp;quot;∃x. ¬(Q x)&amp;quot; &lt;br /&gt;
          &amp;quot;∀x. R x ⟶ ¬(P x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. ¬(R x)&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  obtain a where &amp;quot;¬(Q a)&amp;quot; using assms(2) ..&lt;br /&gt;
  have &amp;quot;P a ∨ Q a&amp;quot; using assms(1) ..&lt;br /&gt;
  hence &amp;quot;¬(R a)&amp;quot; &lt;br /&gt;
    proof &lt;br /&gt;
      assume &amp;quot;P a&amp;quot;&lt;br /&gt;
      hence &amp;quot;¬¬(P a)&amp;quot; by (rule notnotI)&lt;br /&gt;
      have &amp;quot;R a ⟶ ¬(P a)&amp;quot; using assms(3) ..&lt;br /&gt;
      thus &amp;quot;¬(R a)&amp;quot; using `¬¬(P a)` by (rule mt)&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;Q a&amp;quot;&lt;br /&gt;
      with `¬(Q a)` show &amp;quot;¬(R a)&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
    thus &amp;quot;∃x. ¬(R x)&amp;quot;  ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21b:&lt;br /&gt;
  assumes &amp;quot;∀x. P x ∨ Q x&amp;quot; &lt;br /&gt;
          &amp;quot;∃x. ¬(Q x)&amp;quot; &lt;br /&gt;
          &amp;quot;∀x. R x ⟶ ¬(P x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. ¬(R x)&amp;quot; &lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar&lt;br /&gt;
     {∀x. P x ⟶ Q x ∨ R x, ¬(∃x. P x ∧ R x)} ⊢ ∀x. P x ⟶ Q x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_22a:&lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x ∨ R x&amp;quot; &lt;br /&gt;
          &amp;quot;¬(∃x. P x ∧ R x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ⟶ Q x&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix a&lt;br /&gt;
  show &amp;quot;P a ⟶ Q a&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;P a&amp;quot;&lt;br /&gt;
      have &amp;quot;P a ⟶ Q a ∨ R a&amp;quot; using assms(1) ..&lt;br /&gt;
      hence &amp;quot;Q a ∨ R a&amp;quot; using `P a` ..&lt;br /&gt;
      thus &amp;quot;Q a&amp;quot;&lt;br /&gt;
        proof&lt;br /&gt;
          assume &amp;quot;Q a&amp;quot; thus &amp;quot;Q a&amp;quot; .&lt;br /&gt;
        next&lt;br /&gt;
          assume &amp;quot;R a&amp;quot;&lt;br /&gt;
          with `P a` have &amp;quot;P a ∧ R a&amp;quot; ..&lt;br /&gt;
          hence &amp;quot;∃x. P x ∧ R x&amp;quot; ..&lt;br /&gt;
          with assms(2) show &amp;quot;Q a&amp;quot; ..&lt;br /&gt;
        qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_22b:&lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x ∨ R x&amp;quot; &lt;br /&gt;
          &amp;quot;¬(∃x. P x ∧ R x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ⟶ Q x&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Demostrar&lt;br /&gt;
     ∃x y. R x y ∨ R y x ⊢ ∃x y. R x y&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_23a:&lt;br /&gt;
  assumes &amp;quot;∃x y. R x y ∨ R y x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x y. R x y&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain a where &amp;quot;∃y. R a y ∨ R y a&amp;quot; using assms ..&lt;br /&gt;
  then obtain b where &amp;quot;R a b ∨ R b a&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃x y. R x y&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;R a b&amp;quot;&lt;br /&gt;
    hence &amp;quot;∃y. R a y&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;∃x y. R x y&amp;quot; ..&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;R b a&amp;quot;&lt;br /&gt;
    hence &amp;quot;∃y. R b y&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;∃x y. R x y&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_23b:&lt;br /&gt;
  assumes &amp;quot;∃x y. R x y ∨ R y x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x y. R x y&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar&lt;br /&gt;
       (∃x. ∀y. P x y) ⟶ (∀y. ∃x. P x y)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_24a: &lt;br /&gt;
  &amp;quot;(∃x. ∀y. P x y) ⟶ (∀y. ∃x. P x y)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∃x. ∀y. P x y&amp;quot;&lt;br /&gt;
  then obtain a where &amp;quot;∀y. P a y&amp;quot; ..&lt;br /&gt;
  show &amp;quot;∀y. ∃x. P x y&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix b&lt;br /&gt;
      have &amp;quot;P a b&amp;quot; using `∀y. P a y` ..&lt;br /&gt;
      thus &amp;quot;∃x. P x b&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_24b: &lt;br /&gt;
  &amp;quot;(∃x. ∀y. P x y) ⟶ (∀y. ∃x. P x y)&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar&lt;br /&gt;
       (∀x. P x ⟶ Q) ⟷ ((∃x. P x) ⟶ Q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_25a: &lt;br /&gt;
  &amp;quot;(∀x. P x ⟶ Q) ⟷ ((∃x. P x) ⟶ Q)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∀x. P x ⟶ Q&amp;quot;&lt;br /&gt;
  show &amp;quot;(∃x. P x) ⟶ Q&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
      then obtain a where &amp;quot;P a&amp;quot; ..&lt;br /&gt;
      have &amp;quot;P a ⟶ Q&amp;quot; using `∀x. P x ⟶ Q` ..&lt;br /&gt;
      thus &amp;quot;Q&amp;quot; using `P a` ..&lt;br /&gt;
    qed&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;(∃x. P x) ⟶ Q&amp;quot;&lt;br /&gt;
  show &amp;quot;∀x. P x ⟶ Q&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix a&lt;br /&gt;
      show &amp;quot;P a ⟶ Q&amp;quot;&lt;br /&gt;
        proof&lt;br /&gt;
          assume &amp;quot;P a&amp;quot;&lt;br /&gt;
          hence &amp;quot;∃x. P x&amp;quot; ..&lt;br /&gt;
          with `(∃x. P x) ⟶ Q` show &amp;quot;Q&amp;quot; ..&lt;br /&gt;
        qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_25b: &lt;br /&gt;
  &amp;quot;(∀x. P x ⟶ Q) ⟷ ((∃x. P x) ⟶ Q)&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar&lt;br /&gt;
       ((∀x. P x) ∧ (∀x. Q x)) ⟷ (∀x. P x ∧ Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_26a: &lt;br /&gt;
  &amp;quot;((∀x. P x) ∧ (∀x. Q x)) ⟷ (∀x. P x ∧ Q x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;(∀x. P x) ∧ (∀x. Q x)&amp;quot;&lt;br /&gt;
  hence &amp;quot;∀x. P x&amp;quot; ..&lt;br /&gt;
  have &amp;quot;∀x. Q x&amp;quot; using `(∀x. P x) ∧ (∀x. Q x)` ..&lt;br /&gt;
  show &amp;quot;∀x. P x ∧ Q x&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix a&lt;br /&gt;
    have &amp;quot;Q a&amp;quot; using `∀x. Q x` ..&lt;br /&gt;
    have &amp;quot;P a&amp;quot; using `∀x. P x` ..&lt;br /&gt;
    thus &amp;quot;P a ∧ Q a&amp;quot;  using `Q a` ..&lt;br /&gt;
  qed&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;∀x. P x ∧ Q x&amp;quot;&lt;br /&gt;
    show &amp;quot;(∀x. P x) ∧ (∀x. Q x)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      show &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        fix a&lt;br /&gt;
        have &amp;quot;P a ∧ Q a&amp;quot; using `∀x. P x ∧ Q x` ..&lt;br /&gt;
        thus &amp;quot;P a&amp;quot; ..&lt;br /&gt;
      qed&lt;br /&gt;
    next&lt;br /&gt;
      show &amp;quot;∀x. Q x&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        fix a&lt;br /&gt;
        have &amp;quot;P a ∧ Q a&amp;quot; using `∀x. P x ∧ Q x` ..&lt;br /&gt;
        thus &amp;quot;Q a&amp;quot; ..&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_26b: &lt;br /&gt;
  &amp;quot;((∀x. P x) ∧ (∀x. Q x)) ⟷ (∀x. P x ∧ Q x)&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar o refutar&lt;br /&gt;
       ((∀x. P x) ∨ (∀x. Q x)) ⟷ (∀x. P x ∨ Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_27a: &lt;br /&gt;
  &amp;quot;((∀x. P x) ∨ (∀x. Q x)) ⟷ (∀x. P x ∨ Q x)&amp;quot;&lt;br /&gt;
  nitpick&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* Nitpicking formula... *)&lt;br /&gt;
&lt;br /&gt;
(* Nitpick found a counterexample for card &amp;#039;a = 2: *)&lt;br /&gt;
&lt;br /&gt;
(*   Free variables: *)&lt;br /&gt;
(*     P = (λx. _)(a\&amp;lt;^isub&amp;gt;1 := False, a\&amp;lt;^isub&amp;gt;2 := True) *)&lt;br /&gt;
(*     Q = (λx. _)(a\&amp;lt;^isub&amp;gt;1 := True, a\&amp;lt;^isub&amp;gt;2 := False) *)&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 28. Demostrar o refutar&lt;br /&gt;
       ((∃x. P x) ∨ (∃x. Q x)) ⟷ (∃x. P x ∨ Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_28a: &lt;br /&gt;
  &amp;quot;((∃x. P x) ∨ (∃x. Q x)) ⟷ (∃x. P x ∨ Q x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_28b: &lt;br /&gt;
  &amp;quot;((∃x. P x) ∨ (∃x. Q x)) ⟷ (∃x. P x ∨ Q x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;(∃x. P x) ∨ (∃x. Q x)&amp;quot;&lt;br /&gt;
  thus &amp;quot;∃x. P x ∨ Q x&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
      then obtain a where &amp;quot;P a&amp;quot; ..&lt;br /&gt;
      hence &amp;quot;P a ∨ Q a&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;∃x. P x ∨ Q x&amp;quot; ..&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;∃x. Q x&amp;quot;&lt;br /&gt;
      then obtain a where &amp;quot;Q a&amp;quot; ..&lt;br /&gt;
      hence &amp;quot;P a ∨ Q a&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;∃x. P x ∨ Q x&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;∃x. P x ∨ Q x&amp;quot;&lt;br /&gt;
    then obtain a where &amp;quot;P a ∨ Q a&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;(∃x. P x) ∨ (∃x. Q x)&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;P a&amp;quot;&lt;br /&gt;
        hence &amp;quot;∃x. P x&amp;quot; ..&lt;br /&gt;
        thus &amp;quot;(∃x. P x) ∨ (∃x. Q x)&amp;quot; ..&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;Q a&amp;quot;&lt;br /&gt;
        hence &amp;quot;∃x. Q x&amp;quot; ..&lt;br /&gt;
        thus &amp;quot;(∃x. P x) ∨ (∃x. Q x)&amp;quot; ..&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 29. Demostrar o refutar&lt;br /&gt;
       (∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_29: &lt;br /&gt;
&lt;br /&gt;
  &amp;quot;(∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&amp;quot;&lt;br /&gt;
nitpick&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
Nitpicking formula...&lt;br /&gt;
&lt;br /&gt;
Nitpick found a counterexample for card &amp;#039;a = 2 and card &amp;#039;b = 2:&lt;br /&gt;
&lt;br /&gt;
  Free variable:&lt;br /&gt;
    P = (λx. _)&lt;br /&gt;
        (a\&amp;lt;^isub&amp;gt;1 := (λx. _)(b\&amp;lt;^isub&amp;gt;1 := False, b\&amp;lt;^isub&amp;gt;2 := True),&lt;br /&gt;
         a\&amp;lt;^isub&amp;gt;2 := (λx. _)(b\&amp;lt;^isub&amp;gt;1 := True, b\&amp;lt;^isub&amp;gt;2 := False))&lt;br /&gt;
  Skolem constants:&lt;br /&gt;
    λy. x = (λx. _)(b\&amp;lt;^isub&amp;gt;1 := a\&amp;lt;^isub&amp;gt;1, b\&amp;lt;^isub&amp;gt;2 := a\&amp;lt;^isub&amp;gt;2)&lt;br /&gt;
    λx. y = (λx. _)(a\&amp;lt;^isub&amp;gt;1 := b\&amp;lt;^isub&amp;gt;2, a\&amp;lt;^isub&amp;gt;2 := b\&amp;lt;^isub&amp;gt;1)&lt;br /&gt;
*)&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 30. Demostrar o refutar&lt;br /&gt;
       (¬(∀x. P x)) ⟷ (∃x. ¬P x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_30a: &lt;br /&gt;
  &amp;quot;(¬(∀x. P x)) ⟷ (∃x. ¬P x)&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_30b: &lt;br /&gt;
  &amp;quot;(¬(∀x. P x)) ⟷ (∃x. ¬P x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;¬(∀x. P x)&amp;quot;&lt;br /&gt;
  show &amp;quot;∃x. ¬P x&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬(∃x. ¬P x)&amp;quot;&lt;br /&gt;
    have &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        fix a show &amp;quot;P a&amp;quot;&lt;br /&gt;
          proof (rule ccontr)&lt;br /&gt;
            assume &amp;quot;¬(P a)&amp;quot;&lt;br /&gt;
            hence &amp;quot;∃x. ¬P x&amp;quot; ..&lt;br /&gt;
            with `¬(∃x. ¬P x)` show False ..&lt;br /&gt;
          qed&lt;br /&gt;
      qed&lt;br /&gt;
      with `¬(∀x. P x)` show False .. &lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;∃x. ¬P x&amp;quot;&lt;br /&gt;
  then obtain a where &amp;quot;¬ (P a)&amp;quot; ..&lt;br /&gt;
  show  &amp;quot;¬ (∀x. P x)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
      hence &amp;quot;P a&amp;quot; ..&lt;br /&gt;
      with `¬ (P a)` show False ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Ejercicios sobre igualdad *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 31. Demostrar o refutar&lt;br /&gt;
       P a ⟹ ∀x. x = a ⟶ P x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_31a:&lt;br /&gt;
  assumes &amp;quot;P a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. x = a ⟶ P x&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_31b:&lt;br /&gt;
  assumes &amp;quot;P a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. x = a ⟶ P x&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix b &lt;br /&gt;
  show &amp;quot;b = a ⟶ P b&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
  assume &amp;quot;b = a&amp;quot; thus &amp;quot;P b&amp;quot; using assms by (rule ssubst)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 32. Demostrar o refutar&lt;br /&gt;
       ∃x y. R x y ∨ R y x; ¬(∃x. R x x)⟧ ⟹ ∃x y. x ≠ y&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_32a:&lt;br /&gt;
  fixes R :: &amp;quot;&amp;#039;c ⇒ &amp;#039;c ⇒ bool&amp;quot;&lt;br /&gt;
  assumes &amp;quot;∃x y. R x y ∨ R y x&amp;quot;&lt;br /&gt;
          &amp;quot;¬(∃x. R x x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃(x::&amp;#039;c) y. x ≠ y&amp;quot;&lt;br /&gt;
  using assms by metis&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_32b:&lt;br /&gt;
  fixes R :: &amp;quot;&amp;#039;c ⇒ &amp;#039;c ⇒ bool&amp;quot;&lt;br /&gt;
  assumes &amp;quot;∃x y. R x y ∨ R y x&amp;quot;&lt;br /&gt;
          &amp;quot;¬(∃x. R x x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃(x::&amp;#039;c) y. x ≠ y&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  from assms(1) obtain a where &amp;quot;∃y. R a y ∨ R y a&amp;quot; ..&lt;br /&gt;
  then obtain b where &amp;quot;R a b ∨ R b a&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃(x::&amp;#039;c) y. x ≠ y&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;R a b&amp;quot;&lt;br /&gt;
    have &amp;quot;¬(a = b)&amp;quot;&lt;br /&gt;
      proof &lt;br /&gt;
        assume &amp;quot;a = b&amp;quot;&lt;br /&gt;
        hence &amp;quot;R a a&amp;quot; using `R a b` by (rule ssubst)&lt;br /&gt;
        hence &amp;quot;∃x. R x x&amp;quot; ..&lt;br /&gt;
        with assms(2) show False ..&lt;br /&gt;
      qed&lt;br /&gt;
      hence &amp;quot;∃y. a ≠ y&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;∃(x::&amp;#039;c) y. x ≠ y&amp;quot; ..&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;R b a&amp;quot;&lt;br /&gt;
    have &amp;quot;¬(a = b)&amp;quot;&lt;br /&gt;
      proof &lt;br /&gt;
        assume &amp;quot;a = b&amp;quot;&lt;br /&gt;
        hence &amp;quot;R a a&amp;quot; using `R b a` by (rule ssubst)&lt;br /&gt;
        hence &amp;quot;∃x. R x x&amp;quot; ..&lt;br /&gt;
        with assms(2) show False ..&lt;br /&gt;
      qed&lt;br /&gt;
      hence &amp;quot;∃y. a ≠ y&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;∃(x::&amp;#039;c) y. x ≠ y&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 33. Demostrar o refutar&lt;br /&gt;
     {∀x. P a x x, &lt;br /&gt;
      ∀x y z. P x y z ⟶ P (f x) y (f z)} &lt;br /&gt;
     ⊢ P (f a) a (f a)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_33a:&lt;br /&gt;
  assumes &amp;quot;∀x. P a x x&amp;quot;&lt;br /&gt;
          &amp;quot;∀x y z. P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;P (f a) a (f a)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_33b:&lt;br /&gt;
  assumes &amp;quot;∀x. P a x x&amp;quot;&lt;br /&gt;
          &amp;quot;∀x y z. P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;P (f a) a (f a)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;P a a a&amp;quot; using assms(1) ..&lt;br /&gt;
  have &amp;quot;∀y z. P a y z ⟶ P (f a) y (f z)&amp;quot; using assms(2) ..&lt;br /&gt;
  hence &amp;quot;∀z. P a a z ⟶ P (f a) a (f z)&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;P a a a ⟶ P (f a) a (f a)&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;P (f a) a (f a)&amp;quot; using `P a a a` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 34. Demostrar o refutar&lt;br /&gt;
     {∀x. P a x x, &lt;br /&gt;
      ∀x y z. P x y z ⟶ P (f x) y (f z)⟧&lt;br /&gt;
     ⊢ ∃z. P (f a) z (f (f a))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_34a:&lt;br /&gt;
  assumes &amp;quot;∀x. P a x x&amp;quot; &lt;br /&gt;
          &amp;quot;∀x y z. P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃z. P (f a) z (f (f a))&amp;quot;&lt;br /&gt;
  using assms by metis&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_34b:&lt;br /&gt;
  assumes &amp;quot;∀x. P a x x&amp;quot; &lt;br /&gt;
           &amp;quot;∀x y z. P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃z. P (f a) z (f (f a))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;P a (f a) (f a)&amp;quot; using assms(1) ..&lt;br /&gt;
  have &amp;quot;∀y z. P a y z ⟶ P (f a) y (f z)&amp;quot; using assms(2) ..&lt;br /&gt;
  hence &amp;quot;∀z. P a (f a) z ⟶ P (f a) (f a) (f z)&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;P a (f a) (f a) ⟶ P (f a) (f a) (f (f a))&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;P (f a) (f a) (f (f a))&amp;quot; using `P a (f a) (f a)` ..&lt;br /&gt;
  thus &amp;quot;∃z. P (f a) z (f (f a))&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 35. Demostrar o refutar&lt;br /&gt;
     {∀y. Q a y, &lt;br /&gt;
      ∀x y. Q x y ⟶ Q (s x) (s y)} &lt;br /&gt;
     ⊢ ∃z. Qa z ∧ Q z (s (s a))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_35a:&lt;br /&gt;
  assumes &amp;quot;∀y. Q a y&amp;quot; &lt;br /&gt;
          &amp;quot;∀x y. Q x y ⟶ Q (s x) (s y)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;∃z. Q a z ∧ Q z (s (s a))&amp;quot;&lt;br /&gt;
  using assms by metis&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_35b:&lt;br /&gt;
  assumes &amp;quot;∀y. Q a y&amp;quot; &lt;br /&gt;
          &amp;quot;∀x y. Q x y ⟶ Q (s x) (s y)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;∃z. Q a z ∧ Q z (s (s a))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;Q a (s a)&amp;quot; using assms(1) ..&lt;br /&gt;
  have &amp;quot;∀y. Q a y ⟶ Q (s a) (s y)&amp;quot; using assms(2) ..&lt;br /&gt;
  hence &amp;quot;Q a (s a) ⟶ Q (s a) (s (s a))&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;Q (s a) (s (s a))&amp;quot; using `Q a (s a)` ..&lt;br /&gt;
  with `Q a (s a)` have &amp;quot;Q a (s a) ∧ Q (s a) (s (s a))&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃z. Q a z ∧ Q z (s (s a))&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 36. Demostrar o refutar&lt;br /&gt;
     {x = f x, odd (f x)} ⊢ odd x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_36a:&lt;br /&gt;
  &amp;quot;⟦x = f x; odd (f x)⟧ ⟹ odd x&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_36b:&lt;br /&gt;
  assumes &amp;quot;x = f x&amp;quot; and&lt;br /&gt;
          &amp;quot;odd (f x)&amp;quot;&lt;br /&gt;
  shows &amp;quot;odd x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;odd x&amp;quot; using assms by (rule ssubst)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 37. Demostrar o refutar&lt;br /&gt;
     {x = f x, triple (f x) (f x) x} ⊢ triple x x x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_37a:&lt;br /&gt;
  &amp;quot;⟦x = f x; triple (f x) (f x) x⟧ ⟹ triple x x x&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_37b:&lt;br /&gt;
  assumes &amp;quot;x = f x&amp;quot; and&lt;br /&gt;
          &amp;quot;triple (f x) (f x) x&amp;quot;&lt;br /&gt;
  shows &amp;quot;triple x x x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;triple x x x&amp;quot; using assms by (rule ssubst)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ej_8_8_26: &lt;br /&gt;
  assumes 1:&amp;quot;∀x. P x ⟶ ((∃y. Q x y) ⟶ (∃y. Q y x)) &amp;quot; and&lt;br /&gt;
          2:&amp;quot;∀x. (∃y. Q y x) ⟶ Q x x&amp;quot; and&lt;br /&gt;
          3: &amp;quot;¬ (∃x. Q x x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ⟶ (∀y. (¬ Q x y))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix a &lt;br /&gt;
  show &amp;quot;P a ⟶ (∀y. (¬ Q a y))&amp;quot;&lt;br /&gt;
   proof&lt;br /&gt;
      assume &amp;quot;P a&amp;quot;&lt;br /&gt;
        show &amp;quot;∀y. (¬ Q a y)&amp;quot;&lt;br /&gt;
         proof&lt;br /&gt;
            fix b&lt;br /&gt;
            show &amp;quot;¬ Q a b&amp;quot;&lt;br /&gt;
              proof&lt;br /&gt;
                 assume &amp;quot;Q a b&amp;quot;&lt;br /&gt;
                 hence 4:&amp;quot;∃y. Q a y&amp;quot; ..&lt;br /&gt;
                 have &amp;quot;P a ⟶ ((∃y. Q a y) ⟶ (∃y. Q y a))&amp;quot; using 1 ..&lt;br /&gt;
                 hence &amp;quot;(∃y. Q a y) ⟶ (∃y. Q y a)&amp;quot; using `P a` ..&lt;br /&gt;
                 hence 5:&amp;quot;∃y. Q y a&amp;quot; using 4 ..&lt;br /&gt;
                 have &amp;quot;(∃y. Q y a) ⟶ Q a a&amp;quot; using 2 ..&lt;br /&gt;
                 hence &amp;quot;Q a a&amp;quot; using 5 ..&lt;br /&gt;
                 hence &amp;quot;∃x. Q x x&amp;quot; ..&lt;br /&gt;
                 with 3 show False ..&lt;br /&gt;
              qed&lt;br /&gt;
         qed&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_6&amp;diff=561</id>
		<title>Sol 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_6&amp;diff=561"/>
		<updated>2019-04-09T10:51:00Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R6: Deducción natural en lógica de de primer orden *}&lt;br /&gt;
&lt;br /&gt;
theory R6_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional, de los&lt;br /&gt;
  cuantificadores y de la igualdad: &lt;br /&gt;
  · conjI:      ⟦P; Q⟧ ⟹ P ∧ Q&lt;br /&gt;
  · conjunct1:  P ∧ Q ⟹ P&lt;br /&gt;
  · conjunct2:  P ∧ Q ⟹ Q  &lt;br /&gt;
  · notnotD:    ¬¬ P ⟹ P&lt;br /&gt;
  · mp:         ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
  · impI:       (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
  · disjI1:     P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2:     Q ⟹ P ∨ Q&lt;br /&gt;
  · disjE:      ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R &lt;br /&gt;
  · FalseE:     False ⟹ P&lt;br /&gt;
  · notE:       ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  · notI:       (P ⟹ False) ⟹ ¬P&lt;br /&gt;
  · iffI:       ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P = Q&lt;br /&gt;
  · iffD1:      ⟦Q = P; Q⟧ ⟹ P &lt;br /&gt;
  · iffD2:      ⟦P = Q; Q⟧ ⟹ P&lt;br /&gt;
  · ccontr:     (¬P ⟹ False) ⟹ P&lt;br /&gt;
  . excluded_middel:(¬P ∨ P) &lt;br /&gt;
&lt;br /&gt;
  · allE:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allI:       (⋀x. P x) ⟹ ∀x. P x&lt;br /&gt;
  · exI:        P x ⟹ ∃x. P x&lt;br /&gt;
  · exE:        ⟦∃x. P x; ⋀x. P x ⟹ Q⟧ ⟹ Q&lt;br /&gt;
&lt;br /&gt;
  · refl:       t = t&lt;br /&gt;
  · subst:      ⟦s = t; P s⟧ ⟹ P t&lt;br /&gt;
  · trans:      ⟦r = s; s = t⟧ ⟹ r = t&lt;br /&gt;
  · sym:        s = t ⟹ t = s&lt;br /&gt;
  · not_sym:    t ≠ s ⟹ s ≠ t&lt;br /&gt;
  · ssubst:     ⟦t = s; P s⟧ ⟹ P t&lt;br /&gt;
  · box_equals: ⟦a = b; a = c; b = d⟧ ⟹ a: = d&lt;br /&gt;
  · arg_cong:   x = y ⟹ f x = f y&lt;br /&gt;
  · fun_cong:   f = g ⟹ f x = g x&lt;br /&gt;
  · cong:       ⟦f = g; x = y⟧ ⟹ f x = g y&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI y mt que demostramos a continuación.&lt;br /&gt;
  *}&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       ∀x. P x ⟶ Q x ⊢ (∀x. P x) ⟶ (∀x. Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1a: &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀x. P x) ⟶ (∀x. Q x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  show &amp;quot;∀x. Q x&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix a&lt;br /&gt;
    have &amp;quot;P a&amp;quot; using `∀x. P x` by (rule allE)&lt;br /&gt;
    have &amp;quot;P a ⟶ Q a&amp;quot; using assms ..&lt;br /&gt;
    thus &amp;quot;Q a&amp;quot;  using `P a` ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1b: &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀x. P x) ⟶ (∀x. Q x)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
       ∃x. ¬(P x) ⊢ ¬(∀x. P x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2a: &lt;br /&gt;
  assumes &amp;quot;∃x. ¬(P x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∀x. P x)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
    obtain a where &amp;quot;¬(P a)&amp;quot; using assms ..&lt;br /&gt;
    have &amp;quot;P a&amp;quot; using `∀x. P x` ..&lt;br /&gt;
    with `¬(P a)` show False ..&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2b: &lt;br /&gt;
  assumes &amp;quot;∃x. ¬(P x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∀x. P x)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
       ∀x. P x ⊢ ∀y. P y&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3a: &lt;br /&gt;
  assumes &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀y. P y&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix a show &amp;quot;P a&amp;quot; using assms ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3b: &lt;br /&gt;
  assumes &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀y. P y&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
       ∀x. P x ⟶ Q x ⊢ (∀x. ¬(Q x)) ⟶ (∀x. ¬ (P x))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4a: &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀x. ¬(Q x)) ⟶ (∀x. ¬ (P x))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∀x. ¬(Q x)&amp;quot;&lt;br /&gt;
  show &amp;quot;∀x. ¬ (P x)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix a&lt;br /&gt;
    have &amp;quot;¬(Q a)&amp;quot; using `∀x. ¬(Q x)` ..&lt;br /&gt;
    have &amp;quot;P a ⟶ Q a&amp;quot; using assms ..&lt;br /&gt;
    thus &amp;quot;¬(P a)&amp;quot; using `¬(Q a)`  by (rule mt)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4b: &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀x. ¬(Q x)) ⟶ (∀x. ¬ (P x))&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
       ∀x. P x  ⟶ ¬(Q x) ⊢ ¬(∃x. P x ∧ Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5a: &lt;br /&gt;
  assumes &amp;quot;∀x. P x  ⟶ ¬(Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∃x. P x ∧ Q x)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;∃x. P x ∧ Q x&amp;quot;&lt;br /&gt;
    then obtain a where &amp;quot;P a ∧ Q a&amp;quot; ..&lt;br /&gt;
    hence &amp;quot;P a&amp;quot; ..&lt;br /&gt;
    have &amp;quot;P a  ⟶ ¬(Q a)&amp;quot; using assms ..&lt;br /&gt;
    hence &amp;quot;¬(Q a)&amp;quot; using `P a` ..&lt;br /&gt;
    have &amp;quot;Q a&amp;quot; using `P a ∧ Q a` ..&lt;br /&gt;
    with `¬(Q a)` show False ..&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5b: &lt;br /&gt;
  assumes &amp;quot;∀x. P x  ⟶ ¬(Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∃x. P x ∧ Q x)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar&lt;br /&gt;
       ∀x y. P x y ⊢ ∀u v. P u v&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6a: &lt;br /&gt;
  assumes &amp;quot;∀x y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀u v. P u v&amp;quot;&lt;br /&gt;
proof (rule allI)+&lt;br /&gt;
  fix a b&lt;br /&gt;
  have &amp;quot;∀y. P a y&amp;quot; using assms ..&lt;br /&gt;
  thus &amp;quot;P a b&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6b: &lt;br /&gt;
  assumes &amp;quot;∀x y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀u v. P u v&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
  fix a&lt;br /&gt;
  show &amp;quot;∀y. P a y&amp;quot; using assms ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6c: &lt;br /&gt;
  assumes &amp;quot;∀x y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀u v. P u v&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix a&lt;br /&gt;
  show &amp;quot;∀y. P a y&amp;quot; using assms ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6d: &lt;br /&gt;
  assumes &amp;quot;∀x y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀u v. P u v&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar&lt;br /&gt;
       ∃x y. P x y ⟹ ∃u v. P u v&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7a: &lt;br /&gt;
  assumes &amp;quot;∃x y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃u v. P u v&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    obtain a where &amp;quot;∃y. P a y&amp;quot; using assms ..&lt;br /&gt;
    then obtain b where &amp;quot;P a b&amp;quot; ..&lt;br /&gt;
    hence &amp;quot;∃v. P a v&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;∃u v. P u v&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7c: &lt;br /&gt;
  assumes &amp;quot;∃x y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃u v. P u v&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar&lt;br /&gt;
       ∃x. ∀y. P x y ⊢ ∀y. ∃x. P x y&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8a: &lt;br /&gt;
  assumes &amp;quot;∃x. ∀y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀y. ∃x. P x y&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix b&lt;br /&gt;
  obtain a where &amp;quot;∀y. P a y&amp;quot; using assms ..&lt;br /&gt;
  hence &amp;quot;P a b&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃x. P x b&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8b: &lt;br /&gt;
  assumes &amp;quot;∃x. ∀y. P x y&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀y. ∃x. P x y&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar&lt;br /&gt;
       ∃x. P a ⟶ Q x ⊢ P a ⟶ (∃x. Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9a: &lt;br /&gt;
  assumes &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;P a&amp;quot;&lt;br /&gt;
    obtain b where &amp;quot;P a ⟶ Q b&amp;quot; using assms ..&lt;br /&gt;
    hence &amp;quot;Q b&amp;quot; using `P a`..&lt;br /&gt;
    thus &amp;quot;∃x . Q x&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9b: &lt;br /&gt;
  assumes &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar&lt;br /&gt;
       P a ⟶ (∃x. Q x) ⊢ ∃x. P a ⟶ Q x &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10a: &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot;&lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;¬(P a) ∨ (P a)&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;¬(P a)&amp;quot;&lt;br /&gt;
        have &amp;quot;P a ⟶ Q a&amp;quot;&lt;br /&gt;
          proof&lt;br /&gt;
            assume &amp;quot;P a&amp;quot;&lt;br /&gt;
            with `¬(P a)` show &amp;quot;Q a&amp;quot; ..&lt;br /&gt;
          qed&lt;br /&gt;
          thus &amp;quot;∃x. P a ⟶ Q x&amp;quot; ..&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;P a&amp;quot;&lt;br /&gt;
        with assms have &amp;quot;∃x. Q x&amp;quot; ..&lt;br /&gt;
        then obtain b where &amp;quot;Q b&amp;quot; ..&lt;br /&gt;
        hence &amp;quot;P a ⟶  Q b&amp;quot; ..&lt;br /&gt;
        thus &amp;quot;∃x. P a ⟶ Q x&amp;quot; ..&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10b: &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar&lt;br /&gt;
       (∃x. P x) ⟶ Q a ⊢ ∀x. P x ⟶ Q a&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_11a: &lt;br /&gt;
  assumes &amp;quot;(∃x. P x) ⟶ Q a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ⟶ Q a&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix b&lt;br /&gt;
  show &amp;quot;P b ⟶  Q a&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;P b&amp;quot;&lt;br /&gt;
      hence &amp;quot;∃x. P x&amp;quot; ..&lt;br /&gt;
      with assms show &amp;quot;Q a&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_11b: &lt;br /&gt;
  assumes &amp;quot;(∃x. P x) ⟶ Q a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ⟶ Q a&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar&lt;br /&gt;
       ∀x. P x ⟶ Q a ⊢ ∃ x. P x ⟶ Q a&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_12a: &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P x ⟶ Q a&amp;quot;&lt;br /&gt;
proof - (* comentar sin - *)&lt;br /&gt;
  have &amp;quot;P b ⟶  Q a&amp;quot; using assms .. (* ¿universo? *)&lt;br /&gt;
  thus &amp;quot;∃x. P x ⟶ Q a&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_12b: &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P x ⟶ Q a&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar&lt;br /&gt;
       (∀x. P x) ∨ (∀x. Q x) ⊢ ∀x. P x ∨ Q x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13a: &lt;br /&gt;
  assumes &amp;quot;(∀x. P x) ∨ (∀x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ∨ Q x&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  show &amp;quot;∀x. P x ∨ Q x&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix a&lt;br /&gt;
      have &amp;quot;P a&amp;quot; using `∀x. P x` ..&lt;br /&gt;
      thus &amp;quot;P a ∨ Q a&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;∀x. Q x&amp;quot;&lt;br /&gt;
  show &amp;quot;∀x. P x ∨ Q x&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix a&lt;br /&gt;
      have &amp;quot;Q a&amp;quot; using `∀x. Q x` ..&lt;br /&gt;
      thus &amp;quot;P a ∨ Q a&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13b: &lt;br /&gt;
  assumes &amp;quot;(∀x. P x) ∨ (∀x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ∨ Q x&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix a&lt;br /&gt;
  note assms&lt;br /&gt;
  thus &amp;quot;P a ∨ Q a&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
    hence &amp;quot;P a&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;P a ∨ Q a&amp;quot; ..&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;∀x. Q x&amp;quot;&lt;br /&gt;
    hence &amp;quot;Q a&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;P a ∨ Q a&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13c: &lt;br /&gt;
  assumes &amp;quot;(∀x. P x) ∨ (∀x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ∨ Q x&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar&lt;br /&gt;
       ∃x. P x ∧ Q x ⊢ (∃x. P x) ∧ (∃x. Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_14a: &lt;br /&gt;
  assumes &amp;quot;∃x. P x ∧ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃x. P x) ∧ (∃x. Q x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
  obtain a where &amp;quot;P a ∧ Q a&amp;quot; using assms ..&lt;br /&gt;
  hence &amp;quot;P a&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃x. P x&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;∃x. Q x&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
      obtain a where &amp;quot;P a ∧ Q a&amp;quot; using assms ..&lt;br /&gt;
      hence &amp;quot;Q a&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;∃x. Q x&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_14b: &lt;br /&gt;
  assumes &amp;quot;∃x. P x ∧ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃x. P x) ∧ (∃x. Q x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  obtain a where &amp;quot;P a ∧ Q a&amp;quot; using assms ..&lt;br /&gt;
  hence &amp;quot;P a&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃x. P x&amp;quot; ..&lt;br /&gt;
next&lt;br /&gt;
  obtain a where &amp;quot;P a ∧ Q a&amp;quot; using assms ..&lt;br /&gt;
  hence &amp;quot;Q a&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃x. Q x&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_14c:&lt;br /&gt;
  assumes &amp;quot;∃x. P x ∧ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃x. P x) ∧ (∃x. Q x)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain a where &amp;quot;P a ∧ Q a&amp;quot; using assms ..&lt;br /&gt;
  {have &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
      have &amp;quot;P a&amp;quot; using `P a ∧ Q a` ..&lt;br /&gt;
      thus &amp;quot;∃x. P x&amp;quot; ..&lt;br /&gt;
    qed}&lt;br /&gt;
moreover&lt;br /&gt;
  {have &amp;quot;∃x. Q x&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;Q a&amp;quot; using `P a ∧ Q a` ..&lt;br /&gt;
    thus &amp;quot;∃x. Q x&amp;quot; ..&lt;br /&gt;
  qed}&lt;br /&gt;
  ultimately show &amp;quot;(∃x. P x) ∧ (∃x. Q x)&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_14d:&lt;br /&gt;
  assumes &amp;quot;∃x. P x ∧ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃x. P x) ∧ (∃x. Q x)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar&lt;br /&gt;
       ∀x y. P y ⟶ Q x ⊢ (∃y. P y) ⟶ (∀x. Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_15a: &lt;br /&gt;
  assumes &amp;quot;∀x y. P y ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃y. P y) ⟶ (∀x. Q x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∃y. P y&amp;quot;&lt;br /&gt;
  then obtain b where &amp;quot;P b&amp;quot; ..&lt;br /&gt;
  show &amp;quot;∀x. Q x&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix a&lt;br /&gt;
    have &amp;quot;∀y. P y ⟶ Q a&amp;quot; using assms ..&lt;br /&gt;
    hence &amp;quot;P b ⟶ Q a&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;Q a&amp;quot; using `P b` ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_15b: &lt;br /&gt;
  assumes &amp;quot;∀x y. P y ⟶ Q x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃y. P y) ⟶ (∀x. Q x)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar&lt;br /&gt;
       ¬(∀x. ¬(P x)) ⊢ ∃x. P x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16a: &lt;br /&gt;
  assumes &amp;quot;¬(∀x. ¬(P x))&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬(∃x. P x)&amp;quot;&lt;br /&gt;
  have &amp;quot;∀x. ¬(P x)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix a&lt;br /&gt;
      show &amp;quot;¬(P a)&amp;quot;&lt;br /&gt;
        proof&lt;br /&gt;
          assume &amp;quot;P a&amp;quot;&lt;br /&gt;
          hence &amp;quot;∃x. P x&amp;quot; ..&lt;br /&gt;
          with `¬(∃x. P x)` show False ..&lt;br /&gt;
        qed&lt;br /&gt;
    qed&lt;br /&gt;
    with assms show False ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16b: &lt;br /&gt;
  assumes &amp;quot;¬(∀x. ¬(P x))&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar&lt;br /&gt;
       ∀x. ¬(P x) ⊢ ¬(∃x. P x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_17a: &lt;br /&gt;
  assumes &amp;quot;∀x. ¬(P x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∃x. P x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
  then obtain a where &amp;quot;P a &amp;quot; ..&lt;br /&gt;
  have &amp;quot;¬(P a)&amp;quot; using assms ..&lt;br /&gt;
  thus False using `P a` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_17b: &lt;br /&gt;
  assumes &amp;quot;∀x. ¬(P x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∃x. P x)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar&lt;br /&gt;
       ∃x. P x ⊢ ¬(∀x. ¬(P x))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18a: &lt;br /&gt;
  assumes &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∀x. ¬(P x))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  obtain a where &amp;quot;P a&amp;quot; using assms ..&lt;br /&gt;
  assume &amp;quot;∀x. ¬(P x)&amp;quot;&lt;br /&gt;
  hence &amp;quot;¬(P a)&amp;quot; ..&lt;br /&gt;
  thus False using `P a` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18b: &lt;br /&gt;
  assumes &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∀x. ¬(P x))&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar&lt;br /&gt;
       P a ⟶ (∀x. Q x) ⊢ ∀x. P a ⟶ Q x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_19a: &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∀x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix b&lt;br /&gt;
  show &amp;quot;P a ⟶ Q b&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;P a&amp;quot;&lt;br /&gt;
    with assms have &amp;quot;∀x. Q x&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;Q b&amp;quot; ..&lt;br /&gt;
  qed &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_19b: &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∀x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar&lt;br /&gt;
       {∀x y z. R x y ∧ R y z ⟶ R x z, &lt;br /&gt;
        ∀x. ¬(R x x)}&lt;br /&gt;
       ⊢ ∀x y. R x y ⟶ ¬(R y x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_20a: &lt;br /&gt;
  assumes &amp;quot;∀x y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. ¬(R x x)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;∀x y. R x y ⟶ ¬(R y x)&amp;quot;&lt;br /&gt;
proof (rule allI)+&lt;br /&gt;
  fix a b&lt;br /&gt;
  show &amp;quot;R a b ⟶ ¬(R b a)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;R a b&amp;quot;&lt;br /&gt;
    show &amp;quot;¬(R b a)&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;R b a&amp;quot;&lt;br /&gt;
        with `R a b` have &amp;quot;R a b ∧ R b a&amp;quot; ..&lt;br /&gt;
        have &amp;quot;¬(R a a)&amp;quot; using assms(2) ..&lt;br /&gt;
        have &amp;quot;∀y z. R a y ∧ R y z ⟶ R a z&amp;quot; using assms(1) ..&lt;br /&gt;
        hence &amp;quot;∀z. R a b ∧ R b z ⟶ R a z&amp;quot;  ..&lt;br /&gt;
        hence &amp;quot;R a b ∧ R b a ⟶ R a a&amp;quot; ..&lt;br /&gt;
        hence &amp;quot;R a a&amp;quot; using `R a b ∧ R b a` ..&lt;br /&gt;
        with `¬(R a a)` show False ..&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_20b:&lt;br /&gt;
  &amp;quot;⟦∀x y z. R x y ∧ R y z ⟶ R x z; ∀x. ¬(R x x)⟧ ⟹ ∀x y. R x y ⟶ ¬(R y x)&amp;quot;&lt;br /&gt;
by metis&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar&lt;br /&gt;
     {∀x. P x ∨ Q x, ∃x. ¬(Q x), ∀x. R x ⟶ ¬(P x)} ⊢ ∃x. ¬(R x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21a:&lt;br /&gt;
  assumes &amp;quot;∀x. P x ∨ Q x&amp;quot; &lt;br /&gt;
          &amp;quot;∃x. ¬(Q x)&amp;quot; &lt;br /&gt;
          &amp;quot;∀x. R x ⟶ ¬(P x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. ¬(R x)&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  obtain a where &amp;quot;¬(Q a)&amp;quot; using assms(2) ..&lt;br /&gt;
  have &amp;quot;P a ∨ Q a&amp;quot; using assms(1) ..&lt;br /&gt;
  hence &amp;quot;¬(R a)&amp;quot; &lt;br /&gt;
    proof &lt;br /&gt;
      assume &amp;quot;P a&amp;quot;&lt;br /&gt;
      hence &amp;quot;¬¬(P a)&amp;quot; by (rule notnotI)&lt;br /&gt;
      have &amp;quot;R a ⟶ ¬(P a)&amp;quot; using assms(3) ..&lt;br /&gt;
      thus &amp;quot;¬(R a)&amp;quot; using `¬¬(P a)` by (rule mt)&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;Q a&amp;quot;&lt;br /&gt;
      with `¬(Q a)` show &amp;quot;¬(R a)&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
    thus &amp;quot;∃x. ¬(R x)&amp;quot;  ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21b:&lt;br /&gt;
  assumes &amp;quot;∀x. P x ∨ Q x&amp;quot; &lt;br /&gt;
          &amp;quot;∃x. ¬(Q x)&amp;quot; &lt;br /&gt;
          &amp;quot;∀x. R x ⟶ ¬(P x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. ¬(R x)&amp;quot; &lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar&lt;br /&gt;
     {∀x. P x ⟶ Q x ∨ R x, ¬(∃x. P x ∧ R x)} ⊢ ∀x. P x ⟶ Q x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_22a:&lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x ∨ R x&amp;quot; &lt;br /&gt;
          &amp;quot;¬(∃x. P x ∧ R x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ⟶ Q x&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix a&lt;br /&gt;
  show &amp;quot;P a ⟶ Q a&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;P a&amp;quot;&lt;br /&gt;
      have &amp;quot;P a ⟶ Q a ∨ R a&amp;quot; using assms(1) ..&lt;br /&gt;
      hence &amp;quot;Q a ∨ R a&amp;quot; using `P a` ..&lt;br /&gt;
      thus &amp;quot;Q a&amp;quot;&lt;br /&gt;
        proof&lt;br /&gt;
          assume &amp;quot;Q a&amp;quot; thus &amp;quot;Q a&amp;quot; .&lt;br /&gt;
        next&lt;br /&gt;
          assume &amp;quot;R a&amp;quot;&lt;br /&gt;
          with `P a` have &amp;quot;P a ∧ R a&amp;quot; ..&lt;br /&gt;
          hence &amp;quot;∃x. P x ∧ R x&amp;quot; ..&lt;br /&gt;
          with assms(2) show &amp;quot;Q a&amp;quot; ..&lt;br /&gt;
        qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_22b:&lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x ∨ R x&amp;quot; &lt;br /&gt;
          &amp;quot;¬(∃x. P x ∧ R x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ⟶ Q x&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Demostrar&lt;br /&gt;
     ∃x y. R x y ∨ R y x ⊢ ∃x y. R x y&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_23a:&lt;br /&gt;
  assumes &amp;quot;∃x y. R x y ∨ R y x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x y. R x y&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain a where &amp;quot;∃y. R a y ∨ R y a&amp;quot; using assms ..&lt;br /&gt;
  then obtain b where &amp;quot;R a b ∨ R b a&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃x y. R x y&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;R a b&amp;quot;&lt;br /&gt;
    hence &amp;quot;∃y. R a y&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;∃x y. R x y&amp;quot; ..&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;R b a&amp;quot;&lt;br /&gt;
    hence &amp;quot;∃y. R b y&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;∃x y. R x y&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_23b:&lt;br /&gt;
  assumes &amp;quot;∃x y. R x y ∨ R y x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x y. R x y&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar&lt;br /&gt;
       (∃x. ∀y. P x y) ⟶ (∀y. ∃x. P x y)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_24a: &lt;br /&gt;
  &amp;quot;(∃x. ∀y. P x y) ⟶ (∀y. ∃x. P x y)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∃x. ∀y. P x y&amp;quot;&lt;br /&gt;
  then obtain a where &amp;quot;∀y. P a y&amp;quot; ..&lt;br /&gt;
  show &amp;quot;∀y. ∃x. P x y&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix b&lt;br /&gt;
      have &amp;quot;P a b&amp;quot; using `∀y. P a y` ..&lt;br /&gt;
      thus &amp;quot;∃x. P x b&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_24b: &lt;br /&gt;
  &amp;quot;(∃x. ∀y. P x y) ⟶ (∀y. ∃x. P x y)&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar&lt;br /&gt;
       (∀x. P x ⟶ Q) ⟷ ((∃x. P x) ⟶ Q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_25a: &lt;br /&gt;
  &amp;quot;(∀x. P x ⟶ Q) ⟷ ((∃x. P x) ⟶ Q)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∀x. P x ⟶ Q&amp;quot;&lt;br /&gt;
  show &amp;quot;(∃x. P x) ⟶ Q&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
      then obtain a where &amp;quot;P a&amp;quot; ..&lt;br /&gt;
      have &amp;quot;P a ⟶ Q&amp;quot; using `∀x. P x ⟶ Q` ..&lt;br /&gt;
      thus &amp;quot;Q&amp;quot; using `P a` ..&lt;br /&gt;
    qed&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;(∃x. P x) ⟶ Q&amp;quot;&lt;br /&gt;
  show &amp;quot;∀x. P x ⟶ Q&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix a&lt;br /&gt;
      show &amp;quot;P a ⟶ Q&amp;quot;&lt;br /&gt;
        proof&lt;br /&gt;
          assume &amp;quot;P a&amp;quot;&lt;br /&gt;
          hence &amp;quot;∃x. P x&amp;quot; ..&lt;br /&gt;
          with `(∃x. P x) ⟶ Q` show &amp;quot;Q&amp;quot; ..&lt;br /&gt;
        qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_25b: &lt;br /&gt;
  &amp;quot;(∀x. P x ⟶ Q) ⟷ ((∃x. P x) ⟶ Q)&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar&lt;br /&gt;
       ((∀x. P x) ∧ (∀x. Q x)) ⟷ (∀x. P x ∧ Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_26a: &lt;br /&gt;
  &amp;quot;((∀x. P x) ∧ (∀x. Q x)) ⟷ (∀x. P x ∧ Q x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;(∀x. P x) ∧ (∀x. Q x)&amp;quot;&lt;br /&gt;
  hence &amp;quot;∀x. P x&amp;quot; ..&lt;br /&gt;
  have &amp;quot;∀x. Q x&amp;quot; using `(∀x. P x) ∧ (∀x. Q x)` ..&lt;br /&gt;
  show &amp;quot;∀x. P x ∧ Q x&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix a&lt;br /&gt;
    have &amp;quot;Q a&amp;quot; using `∀x. Q x` ..&lt;br /&gt;
    have &amp;quot;P a&amp;quot; using `∀x. P x` ..&lt;br /&gt;
    thus &amp;quot;P a ∧ Q a&amp;quot;  using `Q a` ..&lt;br /&gt;
  qed&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;∀x. P x ∧ Q x&amp;quot;&lt;br /&gt;
    show &amp;quot;(∀x. P x) ∧ (∀x. Q x)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      show &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        fix a&lt;br /&gt;
        have &amp;quot;P a ∧ Q a&amp;quot; using `∀x. P x ∧ Q x` ..&lt;br /&gt;
        thus &amp;quot;P a&amp;quot; ..&lt;br /&gt;
      qed&lt;br /&gt;
    next&lt;br /&gt;
      show &amp;quot;∀x. Q x&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        fix a&lt;br /&gt;
        have &amp;quot;P a ∧ Q a&amp;quot; using `∀x. P x ∧ Q x` ..&lt;br /&gt;
        thus &amp;quot;Q a&amp;quot; ..&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_26b: &lt;br /&gt;
  &amp;quot;((∀x. P x) ∧ (∀x. Q x)) ⟷ (∀x. P x ∧ Q x)&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar o refutar&lt;br /&gt;
       ((∀x. P x) ∨ (∀x. Q x)) ⟷ (∀x. P x ∨ Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_27a: &lt;br /&gt;
  &amp;quot;((∀x. P x) ∨ (∀x. Q x)) ⟷ (∀x. P x ∨ Q x)&amp;quot;&lt;br /&gt;
  nitpick&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* Nitpicking formula... *)&lt;br /&gt;
&lt;br /&gt;
(* Nitpick found a counterexample for card &amp;#039;a = 2: *)&lt;br /&gt;
&lt;br /&gt;
(*   Free variables: *)&lt;br /&gt;
(*     P = (λx. _)(a\&amp;lt;^isub&amp;gt;1 := False, a\&amp;lt;^isub&amp;gt;2 := True) *)&lt;br /&gt;
(*     Q = (λx. _)(a\&amp;lt;^isub&amp;gt;1 := True, a\&amp;lt;^isub&amp;gt;2 := False) *)&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 28. Demostrar o refutar&lt;br /&gt;
       ((∃x. P x) ∨ (∃x. Q x)) ⟷ (∃x. P x ∨ Q x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_28a: &lt;br /&gt;
  &amp;quot;((∃x. P x) ∨ (∃x. Q x)) ⟷ (∃x. P x ∨ Q x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_28b: &lt;br /&gt;
  &amp;quot;((∃x. P x) ∨ (∃x. Q x)) ⟷ (∃x. P x ∨ Q x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;(∃x. P x) ∨ (∃x. Q x)&amp;quot;&lt;br /&gt;
  thus &amp;quot;∃x. P x ∨ Q x&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
      then obtain a where &amp;quot;P a&amp;quot; ..&lt;br /&gt;
      hence &amp;quot;P a ∨ Q a&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;∃x. P x ∨ Q x&amp;quot; ..&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;∃x. Q x&amp;quot;&lt;br /&gt;
      then obtain a where &amp;quot;Q a&amp;quot; ..&lt;br /&gt;
      hence &amp;quot;P a ∨ Q a&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;∃x. P x ∨ Q x&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;∃x. P x ∨ Q x&amp;quot;&lt;br /&gt;
    then obtain a where &amp;quot;P a ∨ Q a&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;(∃x. P x) ∨ (∃x. Q x)&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;P a&amp;quot;&lt;br /&gt;
        hence &amp;quot;∃x. P x&amp;quot; ..&lt;br /&gt;
        thus &amp;quot;(∃x. P x) ∨ (∃x. Q x)&amp;quot; ..&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;Q a&amp;quot;&lt;br /&gt;
        hence &amp;quot;∃x. Q x&amp;quot; ..&lt;br /&gt;
        thus &amp;quot;(∃x. P x) ∨ (∃x. Q x)&amp;quot; ..&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 29. Demostrar o refutar&lt;br /&gt;
       (∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_29: &lt;br /&gt;
&lt;br /&gt;
  &amp;quot;(∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&amp;quot;&lt;br /&gt;
nitpick&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
Nitpicking formula...&lt;br /&gt;
&lt;br /&gt;
Nitpick found a counterexample for card &amp;#039;a = 2 and card &amp;#039;b = 2:&lt;br /&gt;
&lt;br /&gt;
  Free variable:&lt;br /&gt;
    P = (λx. _)&lt;br /&gt;
        (a\&amp;lt;^isub&amp;gt;1 := (λx. _)(b\&amp;lt;^isub&amp;gt;1 := False, b\&amp;lt;^isub&amp;gt;2 := True),&lt;br /&gt;
         a\&amp;lt;^isub&amp;gt;2 := (λx. _)(b\&amp;lt;^isub&amp;gt;1 := True, b\&amp;lt;^isub&amp;gt;2 := False))&lt;br /&gt;
  Skolem constants:&lt;br /&gt;
    λy. x = (λx. _)(b\&amp;lt;^isub&amp;gt;1 := a\&amp;lt;^isub&amp;gt;1, b\&amp;lt;^isub&amp;gt;2 := a\&amp;lt;^isub&amp;gt;2)&lt;br /&gt;
    λx. y = (λx. _)(a\&amp;lt;^isub&amp;gt;1 := b\&amp;lt;^isub&amp;gt;2, a\&amp;lt;^isub&amp;gt;2 := b\&amp;lt;^isub&amp;gt;1)&lt;br /&gt;
*)&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 30. Demostrar o refutar&lt;br /&gt;
       (¬(∀x. P x)) ⟷ (∃x. ¬P x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_30a: &lt;br /&gt;
  &amp;quot;(¬(∀x. P x)) ⟷ (∃x. ¬P x)&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_30b: &lt;br /&gt;
  &amp;quot;(¬(∀x. P x)) ⟷ (∃x. ¬P x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;¬(∀x. P x)&amp;quot;&lt;br /&gt;
  show &amp;quot;∃x. ¬P x&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬(∃x. ¬P x)&amp;quot;&lt;br /&gt;
    have &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        fix a show &amp;quot;P a&amp;quot;&lt;br /&gt;
          proof (rule ccontr)&lt;br /&gt;
            assume &amp;quot;¬(P a)&amp;quot;&lt;br /&gt;
            hence &amp;quot;∃x. ¬P x&amp;quot; ..&lt;br /&gt;
            with `¬(∃x. ¬P x)` show False ..&lt;br /&gt;
          qed&lt;br /&gt;
      qed&lt;br /&gt;
      with `¬(∀x. P x)` show False .. &lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;∃x. ¬P x&amp;quot;&lt;br /&gt;
  then obtain a where &amp;quot;¬ (P a)&amp;quot; ..&lt;br /&gt;
  show  &amp;quot;¬ (∀x. P x)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
      hence &amp;quot;P a&amp;quot; ..&lt;br /&gt;
      with `¬ (P a)` show False ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Ejercicios sobre igualdad *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 31. Demostrar o refutar&lt;br /&gt;
       P a ⟹ ∀x. x = a ⟶ P x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_31a:&lt;br /&gt;
  assumes &amp;quot;P a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. x = a ⟶ P x&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_31b:&lt;br /&gt;
  assumes &amp;quot;P a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. x = a ⟶ P x&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix b &lt;br /&gt;
  show &amp;quot;b = a ⟶ P b&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
  assume &amp;quot;b = a&amp;quot; thus &amp;quot;P b&amp;quot; using assms by (rule ssubst)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 32. Demostrar o refutar&lt;br /&gt;
       ∃x y. R x y ∨ R y x; ¬(∃x. R x x)⟧ ⟹ ∃x y. x ≠ y&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_32a:&lt;br /&gt;
  fixes R :: &amp;quot;&amp;#039;c ⇒ &amp;#039;c ⇒ bool&amp;quot;&lt;br /&gt;
  assumes &amp;quot;∃x y. R x y ∨ R y x&amp;quot;&lt;br /&gt;
          &amp;quot;¬(∃x. R x x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃(x::&amp;#039;c) y. x ≠ y&amp;quot;&lt;br /&gt;
  using assms by metis&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_32b:&lt;br /&gt;
  fixes R :: &amp;quot;&amp;#039;c ⇒ &amp;#039;c ⇒ bool&amp;quot;&lt;br /&gt;
  assumes &amp;quot;∃x y. R x y ∨ R y x&amp;quot;&lt;br /&gt;
          &amp;quot;¬(∃x. R x x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃(x::&amp;#039;c) y. x ≠ y&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  from assms(1) obtain a where &amp;quot;∃y. R a y ∨ R y a&amp;quot; ..&lt;br /&gt;
  then obtain b where &amp;quot;R a b ∨ R b a&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃(x::&amp;#039;c) y. x ≠ y&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;R a b&amp;quot;&lt;br /&gt;
    have &amp;quot;¬(a = b)&amp;quot;&lt;br /&gt;
      proof &lt;br /&gt;
        assume &amp;quot;a = b&amp;quot;&lt;br /&gt;
        hence &amp;quot;R a a&amp;quot; using `R a b` by (rule ssubst)&lt;br /&gt;
        hence &amp;quot;∃x. R x x&amp;quot; ..&lt;br /&gt;
        with assms(2) show False ..&lt;br /&gt;
      qed&lt;br /&gt;
      hence &amp;quot;∃y. a ≠ y&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;∃(x::&amp;#039;c) y. x ≠ y&amp;quot; ..&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;R b a&amp;quot;&lt;br /&gt;
    have &amp;quot;¬(a = b)&amp;quot;&lt;br /&gt;
      proof &lt;br /&gt;
        assume &amp;quot;a = b&amp;quot;&lt;br /&gt;
        hence &amp;quot;R a a&amp;quot; using `R b a` by (rule ssubst)&lt;br /&gt;
        hence &amp;quot;∃x. R x x&amp;quot; ..&lt;br /&gt;
        with assms(2) show False ..&lt;br /&gt;
      qed&lt;br /&gt;
      hence &amp;quot;∃y. a ≠ y&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;∃(x::&amp;#039;c) y. x ≠ y&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 33. Demostrar o refutar&lt;br /&gt;
     {∀x. P a x x, &lt;br /&gt;
      ∀x y z. P x y z ⟶ P (f x) y (f z)} &lt;br /&gt;
     ⊢ P (f a) a (f a)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_33a:&lt;br /&gt;
  assumes &amp;quot;∀x. P a x x&amp;quot;&lt;br /&gt;
          &amp;quot;∀x y z. P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;P (f a) a (f a)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_33b:&lt;br /&gt;
  assumes &amp;quot;∀x. P a x x&amp;quot;&lt;br /&gt;
          &amp;quot;∀x y z. P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;P (f a) a (f a)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;P a a a&amp;quot; using assms(1) ..&lt;br /&gt;
  have &amp;quot;∀y z. P a y z ⟶ P (f a) y (f z)&amp;quot; using assms(2) ..&lt;br /&gt;
  hence &amp;quot;∀z. P a a z ⟶ P (f a) a (f z)&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;P a a a ⟶ P (f a) a (f a)&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;P (f a) a (f a)&amp;quot; using `P a a a` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 34. Demostrar o refutar&lt;br /&gt;
     {∀x. P a x x, &lt;br /&gt;
      ∀x y z. P x y z ⟶ P (f x) y (f z)⟧&lt;br /&gt;
     ⊢ ∃z. P (f a) z (f (f a))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_34a:&lt;br /&gt;
  assumes &amp;quot;∀x. P a x x&amp;quot; &lt;br /&gt;
          &amp;quot;∀x y z. P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃z. P (f a) z (f (f a))&amp;quot;&lt;br /&gt;
  using assms by metis&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_34b:&lt;br /&gt;
  assumes &amp;quot;∀x. P a x x&amp;quot; &lt;br /&gt;
           &amp;quot;∀x y z. P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃z. P (f a) z (f (f a))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;P a (f a) (f a)&amp;quot; using assms(1) ..&lt;br /&gt;
  have &amp;quot;∀y z. P a y z ⟶ P (f a) y (f z)&amp;quot; using assms(2) ..&lt;br /&gt;
  hence &amp;quot;∀z. P a (f a) z ⟶ P (f a) (f a) (f z)&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;P a (f a) (f a) ⟶ P (f a) (f a) (f (f a))&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;P (f a) (f a) (f (f a))&amp;quot; using `P a (f a) (f a)` ..&lt;br /&gt;
  thus &amp;quot;∃z. P (f a) z (f (f a))&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 35. Demostrar o refutar&lt;br /&gt;
     {∀y. Q a y, &lt;br /&gt;
      ∀x y. Q x y ⟶ Q (s x) (s y)} &lt;br /&gt;
     ⊢ ∃z. Qa z ∧ Q z (s (s a))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_35a:&lt;br /&gt;
  assumes &amp;quot;∀y. Q a y&amp;quot; &lt;br /&gt;
          &amp;quot;∀x y. Q x y ⟶ Q (s x) (s y)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;∃z. Q a z ∧ Q z (s (s a))&amp;quot;&lt;br /&gt;
  using assms by metis&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_35b:&lt;br /&gt;
  assumes &amp;quot;∀y. Q a y&amp;quot; &lt;br /&gt;
          &amp;quot;∀x y. Q x y ⟶ Q (s x) (s y)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;∃z. Q a z ∧ Q z (s (s a))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;Q a (s a)&amp;quot; using assms(1) ..&lt;br /&gt;
  have &amp;quot;∀y. Q a y ⟶ Q (s a) (s y)&amp;quot; using assms(2) ..&lt;br /&gt;
  hence &amp;quot;Q a (s a) ⟶ Q (s a) (s (s a))&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;Q (s a) (s (s a))&amp;quot; using `Q a (s a)` ..&lt;br /&gt;
  with `Q a (s a)` have &amp;quot;Q a (s a) ∧ Q (s a) (s (s a))&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃z. Q a z ∧ Q z (s (s a))&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 36. Demostrar o refutar&lt;br /&gt;
     {x = f x, odd (f x)} ⊢ odd x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_36a:&lt;br /&gt;
  &amp;quot;⟦x = f x; odd (f x)⟧ ⟹ odd x&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_36b:&lt;br /&gt;
  assumes &amp;quot;x = f x&amp;quot; and&lt;br /&gt;
          &amp;quot;odd (f x)&amp;quot;&lt;br /&gt;
  shows &amp;quot;odd x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;odd x&amp;quot; using assms by (rule ssubst)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 37. Demostrar o refutar&lt;br /&gt;
     {x = f x, triple (f x) (f x) x} ⊢ triple x x x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_37a:&lt;br /&gt;
  &amp;quot;⟦x = f x; triple (f x) (f x) x⟧ ⟹ triple x x x&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_37b:&lt;br /&gt;
  assumes &amp;quot;x = f x&amp;quot; and&lt;br /&gt;
          &amp;quot;triple (f x) (f x) x&amp;quot;&lt;br /&gt;
  shows &amp;quot;triple x x x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;triple x x x&amp;quot; using assms by (rule ssubst)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ej_8_8_26: &lt;br /&gt;
  assumes 1:&amp;quot;∀x. P x ⟶ ((∃y. Q x y) ⟶ (∃y. Q y x)) &amp;quot; and&lt;br /&gt;
          2:&amp;quot;∀x. (∃y. Q y x) ⟶ Q x x&amp;quot; and&lt;br /&gt;
          3: &amp;quot;¬ (∃x. Q x x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P x ⟶ (∀y. (¬ Q x y))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix a &lt;br /&gt;
  show &amp;quot;P a ⟶ (∀y. (¬ Q a y))&amp;quot;&lt;br /&gt;
   proof&lt;br /&gt;
      assume &amp;quot;P a&amp;quot;&lt;br /&gt;
        show &amp;quot;∀y. (¬ Q a y)&amp;quot;&lt;br /&gt;
         proof&lt;br /&gt;
            fix b&lt;br /&gt;
            show &amp;quot;¬ Q a b&amp;quot;&lt;br /&gt;
              proof&lt;br /&gt;
                 assume &amp;quot;Q a b&amp;quot;&lt;br /&gt;
                 hence 4:&amp;quot;∃y. Q a y&amp;quot; ..&lt;br /&gt;
                 have &amp;quot;P a ⟶ ((∃y. Q a y) ⟶ (∃y. Q y a))&amp;quot; using 1 ..&lt;br /&gt;
                 hence &amp;quot;(∃y. Q a y) ⟶ (∃y. Q y a)&amp;quot; using `P a` ..&lt;br /&gt;
                 hence 5:&amp;quot;∃y. Q y a&amp;quot; using 4 ..&lt;br /&gt;
                 have &amp;quot;(∃y. Q y a) ⟶ Q a a&amp;quot; using 2 ..&lt;br /&gt;
                 hence &amp;quot;Q a a&amp;quot; using 5 ..&lt;br /&gt;
                 hence &amp;quot;∃x. Q x x&amp;quot; ..&lt;br /&gt;
                 with 3 show False ..&lt;br /&gt;
              qed&lt;br /&gt;
         qed&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_4&amp;diff=560</id>
		<title>Sol 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_4&amp;diff=560"/>
		<updated>2019-04-09T10:50:20Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R4: Deducción natural proposicional *}&lt;br /&gt;
&lt;br /&gt;
theory R4_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  El objetivo de esta relación es demostrar cada uno de los ejercicios&lt;br /&gt;
  usando sólo las reglas básicas de deducción natural de la lógica&lt;br /&gt;
  proposicional (sin usar el método auto).&lt;br /&gt;
&lt;br /&gt;
  Las reglas básicas de la deducción natural son las siguientes:&lt;br /&gt;
  · conjI:      ⟦P; Q⟧ ⟹ P ∧ Q&lt;br /&gt;
  · conjunct1:  P ∧ Q ⟹ P&lt;br /&gt;
  · conjunct2:  P ∧ Q ⟹ Q  &lt;br /&gt;
  · notnotD:    ¬¬ P ⟹ P&lt;br /&gt;
  · notnotI:    P ⟹ ¬¬ P&lt;br /&gt;
  · mp:         ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
  · mt:         ⟦F ⟶ G; ¬G⟧ ⟹ ¬F &lt;br /&gt;
  · impI:       (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
  · disjI1:     P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2:     Q ⟹ P ∨ Q&lt;br /&gt;
  · disjE:      ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R &lt;br /&gt;
  · FalseE:     False ⟹ P&lt;br /&gt;
  · notE:       ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  · notI:       (P ⟹ False) ⟹ ¬P&lt;br /&gt;
  · iffI:       ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P = Q&lt;br /&gt;
  · iffD1:      ⟦Q = P; Q⟧ ⟹ P &lt;br /&gt;
  · iffD2:      ⟦P = Q; Q⟧ ⟹ P&lt;br /&gt;
  · ccontr:     (¬P ⟹ False) ⟹ P&lt;br /&gt;
  · excluded_middle: ¬P ∨ P&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI y mt que demostramos a continuación. *}&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
section {* Implicaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       p ⟶ q, p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1a:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2: &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
   show &amp;quot;q&amp;quot; using 1 2 by (rule mp) &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1b:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1c:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1d:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms by auto&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2a:&lt;br /&gt;
  assumes 1:&amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2:&amp;quot;q ⟶ r&amp;quot; and&lt;br /&gt;
          3:&amp;quot;p&amp;quot; &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
  show 5: &amp;quot;r&amp;quot; using 2 4 by (rule mp) &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2b:&lt;br /&gt;
  assumes 1:&amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2:&amp;quot;q ⟶ r&amp;quot; and&lt;br /&gt;
          3:&amp;quot;p&amp;quot; &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 2 4 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2c:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          &amp;quot;q ⟶ r&amp;quot; and&lt;br /&gt;
          &amp;quot;p&amp;quot; &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;q&amp;quot; using assms(1,3) .. &lt;br /&gt;
  show &amp;quot;r&amp;quot; using assms(2) `q` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2d:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          &amp;quot;q ⟶ r&amp;quot; and&lt;br /&gt;
          &amp;quot;p&amp;quot; &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;r&amp;quot; using assms by auto&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r), p ⟶ q, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
lemma ejercicio_3a:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and&lt;br /&gt;
          2: &amp;quot;p ⟶ q&amp;quot;       and&lt;br /&gt;
          3: &amp;quot;p&amp;quot;           &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
   have 4: &amp;quot;q ⟶ r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
   have 5: &amp;quot;q&amp;quot; using 2 3 by (rule mp)&lt;br /&gt;
   show 6: &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3b:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and&lt;br /&gt;
          &amp;quot;p ⟶ q&amp;quot;       and&lt;br /&gt;
          &amp;quot;p&amp;quot;           &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
   have 4: &amp;quot;q ⟶ r&amp;quot; using assms(1,3) ..&lt;br /&gt;
   have &amp;quot;q&amp;quot; using assms(2,3) ..&lt;br /&gt;
   show &amp;quot;r&amp;quot; using 4 `q` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3c:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and&lt;br /&gt;
          &amp;quot;p ⟶ q&amp;quot;       and&lt;br /&gt;
          &amp;quot;p&amp;quot;           &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
   have &amp;quot;q&amp;quot; using assms(2,3) ..&lt;br /&gt;
   have &amp;quot;q ⟶ r&amp;quot; using assms(1,3) ..&lt;br /&gt;
   thus &amp;quot;r&amp;quot; using `q` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3d:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and&lt;br /&gt;
          &amp;quot;p ⟶ q&amp;quot;       and&lt;br /&gt;
          &amp;quot;p&amp;quot;           &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
   show &amp;quot;r&amp;quot; using assms by auto&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r ⊢ p ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
lemma ejercicio_4a:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2: &amp;quot;q ⟶ r&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  {assume 3:&amp;quot;p&amp;quot; &lt;br /&gt;
    have 4: &amp;quot;q&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
    have 5: &amp;quot;r&amp;quot; using 2 4 by (rule mp)}&lt;br /&gt;
  thus &amp;quot;p⟶ r&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4b:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2: &amp;quot;q ⟶ r&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 3:&amp;quot;p&amp;quot; &lt;br /&gt;
    have &amp;quot;q&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 2 `q` by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4c:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          &amp;quot;q ⟶ r&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p&amp;quot; &lt;br /&gt;
    have &amp;quot;q&amp;quot; using assms(1) `p` ..&lt;br /&gt;
    show &amp;quot;r&amp;quot; using assms(2) `q` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4d:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          &amp;quot;q ⟶ r&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ q ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5a:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  {assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    {assume 4: &amp;quot;p&amp;quot;&lt;br /&gt;
      have  &amp;quot;q ⟶ r&amp;quot; using 1 4 ..&lt;br /&gt;
      hence 5: &amp;quot;r&amp;quot; using 3 ..}&lt;br /&gt;
    hence 6: &amp;quot;p ⟶ r&amp;quot; by (rule impI)}&lt;br /&gt;
  thus &amp;quot;q ⟶ (p ⟶ r)&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5b:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;q&amp;quot;&lt;br /&gt;
  show &amp;quot;p ⟶  r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    have &amp;quot;q ⟶ r&amp;quot; using assms(1) `p` ..&lt;br /&gt;
    thus &amp;quot;r&amp;quot; using `q` ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5c:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;q&amp;quot;&lt;br /&gt;
  show &amp;quot;p ⟶  r&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with assms(1) have &amp;quot;q ⟶ r&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;r&amp;quot; using `q` ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5d:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ (p ⟶ q) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6a:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 {assume 2: &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
   {assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
    have 4: &amp;quot;q ⟶ r&amp;quot; using 1 3 ..&lt;br /&gt;
    have 5: &amp;quot;q&amp;quot; using 2 3 ..&lt;br /&gt;
    have &amp;quot;r&amp;quot;  using 4 5 ..}&lt;br /&gt;
   hence &amp;quot;p ⟶ r&amp;quot; by (rule impI)}&lt;br /&gt;
 thus &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot; by (rule impI)&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6b:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
 assume &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
 show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
 proof (rule impI)&lt;br /&gt;
   assume &amp;quot;p&amp;quot;&lt;br /&gt;
   with `p ⟶ q` have &amp;quot;q&amp;quot; ..&lt;br /&gt;
   have &amp;quot;q ⟶ r&amp;quot; using assms(1) `p` ..&lt;br /&gt;
   thus &amp;quot;r&amp;quot; using `q` ..&lt;br /&gt;
 qed&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6c:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar&lt;br /&gt;
     p ⊢ q ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
 assume &amp;quot;q&amp;quot;&lt;br /&gt;
 show &amp;quot;p&amp;quot; using assms(1) by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar&lt;br /&gt;
     ⊢ p ⟶ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8a:&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      show &amp;quot;p&amp;quot; using `p` .&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8b:&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ (q ⟶ r) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9a:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  show &amp;quot;p ⟶  r&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;q&amp;quot; using assms(1) `p` ..&lt;br /&gt;
      show &amp;quot;r&amp;quot; using `q ⟶  r` `q` ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9b:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ (r ⟶ s)) ⊢ r ⟶ (q ⟶ (p ⟶ s))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10a:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ (r ⟶ s))&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;r&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ (p ⟶ s)&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      show &amp;quot;p ⟶ s&amp;quot;&lt;br /&gt;
        proof (rule impI)&lt;br /&gt;
          assume &amp;quot;p&amp;quot;&lt;br /&gt;
          with assms(1) have &amp;quot;q ⟶ (r ⟶ s)&amp;quot; ..&lt;br /&gt;
          hence &amp;quot;r ⟶ s&amp;quot; using `q` ..&lt;br /&gt;
          thus &amp;quot;s&amp;quot; using `r` ..&lt;br /&gt;
        qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10b:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ (r ⟶ s))&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_11a:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  show &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
      show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
        proof (rule impI)&lt;br /&gt;
          assume &amp;quot;p&amp;quot;&lt;br /&gt;
          have &amp;quot;q ⟶ r&amp;quot; using `p ⟶ (q ⟶ r)` `p`..&lt;br /&gt;
          have &amp;quot;q&amp;quot; using `p ⟶ q` `p` ..&lt;br /&gt;
          show &amp;quot;r&amp;quot; using `q ⟶ r` `q` ..&lt;br /&gt;
        qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_11b:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  {assume &amp;quot;p ⟶  q&amp;quot;&lt;br /&gt;
    {assume &amp;quot;p&amp;quot;&lt;br /&gt;
      with `p ⟶  q` have &amp;quot;q&amp;quot; ..&lt;br /&gt;
      have &amp;quot;q ⟶ r&amp;quot; using `p ⟶ (q ⟶ r)` `p` ..&lt;br /&gt;
      hence &amp;quot;r&amp;quot; using `q` ..}&lt;br /&gt;
    hence &amp;quot;p ⟶  r&amp;quot; ..}&lt;br /&gt;
  thus &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_11c:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_12a:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI) &lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶  r&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      show &amp;quot;r&amp;quot;&lt;br /&gt;
        proof -&lt;br /&gt;
          {assume &amp;quot;p&amp;quot;&lt;br /&gt;
          have &amp;quot;q&amp;quot; using `q` .}&lt;br /&gt;
        hence &amp;quot;p ⟶  q&amp;quot; ..&lt;br /&gt;
          show &amp;quot;r&amp;quot; using assms(1) `p ⟶ q` ..&lt;br /&gt;
        qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_12b:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  {assume &amp;quot;q&amp;quot;&lt;br /&gt;
    {assume &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;q&amp;quot; using `q` .}&lt;br /&gt;
  hence &amp;quot;p ⟶  q&amp;quot; ..&lt;br /&gt;
  with assms(1) have &amp;quot;r&amp;quot; ..}&lt;br /&gt;
  thus &amp;quot;q ⟶ r&amp;quot; .. &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_12c:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
section {* Conjunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar&lt;br /&gt;
     p, q ⊢  p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13a:&lt;br /&gt;
  assumes 1:&amp;quot;p&amp;quot; and&lt;br /&gt;
          2:&amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;p ∧ q&amp;quot; using 1 2 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13b:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot; and&lt;br /&gt;
          &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &amp;quot;p&amp;quot; using assms(1) .&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms(2) .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13c:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot; and&lt;br /&gt;
          &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
lemma ejercicio_14:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar&lt;br /&gt;
     p ∧ q ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
lemma ejercicio_15:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar&lt;br /&gt;
     p ∧ (q ∧ r) ⊢ (p ∧ q) ∧ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16a:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∧ q)∧ r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 1: &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have 2: &amp;quot;(q ∧ r)&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  have 3: &amp;quot;q&amp;quot; using 2 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;r&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;(p∧q)&amp;quot; using 1 3 by (rule conjI)&lt;br /&gt;
  show &amp;quot;(p∧q) ∧ r&amp;quot; using 5 4 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16b:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∧ q)∧ r&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  proof (rule conjI)&lt;br /&gt;
    show &amp;quot;p&amp;quot; using assms ..&lt;br /&gt;
    next&lt;br /&gt;
      have &amp;quot;q ∧ r&amp;quot; using assms ..&lt;br /&gt;
      thus &amp;quot;q&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  have &amp;quot;q ∧ r&amp;quot; using assms ..&lt;br /&gt;
  thus &amp;quot;r&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16c:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∧ q)∧ r&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar&lt;br /&gt;
     (p ∧ q) ∧ r ⊢ p ∧ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
lemma ejercicio_17a:&lt;br /&gt;
  assumes &amp;quot;(p∧ q) ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 1: &amp;quot;r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  have 2: &amp;quot;(p∧q)&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot; using 2 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;(q∧r)&amp;quot; using 4 1 by (rule conjI)&lt;br /&gt;
  show &amp;quot;p∧(q∧r)&amp;quot; using 3 5 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_17b:&lt;br /&gt;
  assumes &amp;quot;(p∧ q) ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q∧ r)&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  have &amp;quot;p ∧ q&amp;quot; using assms ..&lt;br /&gt;
  thus &amp;quot;p&amp;quot; ..&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;q ∧ r&amp;quot;&lt;br /&gt;
    proof (rule conjI)&lt;br /&gt;
      have &amp;quot;p ∧ q&amp;quot; using assms ..&lt;br /&gt;
      thus &amp;quot;q&amp;quot; ..&lt;br /&gt;
    next&lt;br /&gt;
      show &amp;quot;r&amp;quot; using assms ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_17c:&lt;br /&gt;
  assumes &amp;quot;(p∧ q) ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q∧ r)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18a:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 1: &amp;quot;q&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;p⟶ q&amp;quot; using 1 by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18b:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18c:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar&lt;br /&gt;
     (p ⟶ q) ∧ (p ⟶ r) ⊢ p ⟶ q ∧ r   &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_19a:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;q ∧ r&amp;quot; &lt;br /&gt;
      proof (rule conjI)&lt;br /&gt;
    have &amp;quot;p ⟶ q&amp;quot; using assms ..&lt;br /&gt;
    thus &amp;quot;q&amp;quot; using `p` ..&lt;br /&gt;
    have &amp;quot;p ⟶ r&amp;quot; using assms ..&lt;br /&gt;
    thus &amp;quot;r&amp;quot; using `p` ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_19c:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar&lt;br /&gt;
     p ⟶ q ∧ r ⊢ (p ⟶ q) ∧ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_20a:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with `p ⟶ q ∧ r` have &amp;quot;q ∧ r&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;q&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;p ⟶ r&amp;quot; &lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with `p ⟶ q ∧ r` have &amp;quot;q ∧ r&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;r&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_20c:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21a:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21b:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  hence &amp;quot;p&amp;quot; ..&lt;br /&gt;
  with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; ..&lt;br /&gt;
  have &amp;quot;q&amp;quot; using `p ∧ q` ..&lt;br /&gt;
  with `q ⟶ r` show &amp;quot;r&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21c:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  hence &amp;quot;p&amp;quot; ..&lt;br /&gt;
  have &amp;quot;q&amp;quot; using `p ∧ q`..&lt;br /&gt;
  have  &amp;quot;q ⟶ r&amp;quot; using assms(1) `p` ..&lt;br /&gt;
thus &amp;quot;r&amp;quot; using `q` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar&lt;br /&gt;
     p ∧ q ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_22a:&lt;br /&gt;
  assumes &amp;quot;p ∧ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      with `p` have &amp;quot;p ∧ q&amp;quot; ..&lt;br /&gt;
      with assms(1) show &amp;quot;r&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_22c:&lt;br /&gt;
  assumes &amp;quot;p ∧ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_23a:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  hence &amp;quot;q&amp;quot; ..&lt;br /&gt;
  have &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      show &amp;quot;q&amp;quot; using `q` .&lt;br /&gt;
    qed&lt;br /&gt;
    with assms(1) show &amp;quot;r&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_23c:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar&lt;br /&gt;
     p ∧ (q ⟶ r) ⊢ (p ⟶ q) ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_24b:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  have &amp;quot;p&amp;quot; using assms(1) ..&lt;br /&gt;
  with `p ⟶ q` have &amp;quot;q&amp;quot; ..&lt;br /&gt;
  have &amp;quot;q ⟶ r&amp;quot; using assms(1) ..&lt;br /&gt;
  thus &amp;quot;r&amp;quot; using `q` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_24c:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
section {* Disyunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar&lt;br /&gt;
     p ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
lemma ejercicio_25:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
show &amp;quot;p∨q&amp;quot; using assms by (rule disjI1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar&lt;br /&gt;
     q ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
lemma ejercicio_26:&lt;br /&gt;
  assumes &amp;quot;q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
show &amp;quot;p∨q&amp;quot; using assms by (rule disjI2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar&lt;br /&gt;
     p ∨ q ⊢ q ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
lemma ejercicio_27a:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
proof - &lt;br /&gt;
have &amp;quot;p ∨ q&amp;quot; using assms by this&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    have &amp;quot;q ∨ p&amp;quot; using 2 by (rule disjI2) }&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    have &amp;quot;q ∨ p&amp;quot; using 3 by (rule disjI1) }&lt;br /&gt;
  ultimately show &amp;quot;q ∨ p&amp;quot; by (rule disjE) &lt;br /&gt;
qed  &lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_27b:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
proof - &lt;br /&gt;
  note `p ∨ q`&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ∨ p&amp;quot; ..}&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume &amp;quot;q&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ∨ p&amp;quot; .. }&lt;br /&gt;
  ultimately show &amp;quot;q ∨ p&amp;quot; .. &lt;br /&gt;
qed  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_27c:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  thus &amp;quot;q ∨ p&amp;quot; ..&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;q&amp;quot;&lt;br /&gt;
  thus &amp;quot;q ∨ p&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_27d:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 28. Demostrar&lt;br /&gt;
     q ⟶ r ⊢ p ∨ q ⟶ p ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_28b:&lt;br /&gt;
  assumes &amp;quot;q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ p ∨ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  show &amp;quot;p ∨ r&amp;quot;&lt;br /&gt;
    using `p ∨ q`&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      thus &amp;quot;p ∨ r&amp;quot; ..&lt;br /&gt;
      next&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      with assms(1) have &amp;quot;r&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;p ∨ r&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_28c:&lt;br /&gt;
  assumes &amp;quot;q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ p ∨ r&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 29. Demostrar&lt;br /&gt;
     p ∨ p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_29b:&lt;br /&gt;
  assumes &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  thus &amp;quot;p&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  thus &amp;quot;p&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_29c:&lt;br /&gt;
  assumes &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 30. Demostrar&lt;br /&gt;
     p ⊢ p ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_30a:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
proof (rule disjI1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_30b:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 31. Demostrar&lt;br /&gt;
     p ∨ (q ∨ r) ⊢ (p ∨ q) ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_31a:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∨ r&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  hence &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
  thus &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;q ∨ r&amp;quot; &lt;br /&gt;
  thus &amp;quot;(p ∨ q) ∨ r&amp;quot;&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
      thus &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;r&amp;quot;&lt;br /&gt;
    thus &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_31b:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∨ r&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 32. Demostrar&lt;br /&gt;
     (p ∨ q) ∨ r ⊢ p ∨ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_32:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∨ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 33. Demostrar&lt;br /&gt;
     p ∧ (q ∨ r) ⊢ (p ∧ q) ∨ (p ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_33:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 34. Demostrar&lt;br /&gt;
     (p ∧ q) ∨ (p ∧ r) ⊢ p ∧ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_34a:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p∧q&amp;quot;&lt;br /&gt;
  show &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
    proof (rule conjI)&lt;br /&gt;
      show &amp;quot;p&amp;quot; using `p∧q` ..&lt;br /&gt;
    next&lt;br /&gt;
      have &amp;quot;q&amp;quot; using `p∧q` ..&lt;br /&gt;
      thus &amp;quot;q∨r&amp;quot; by (rule disjI1)&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
  assume &amp;quot;p∧r&amp;quot;&lt;br /&gt;
  show &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
    proof (rule conjI)&lt;br /&gt;
      show &amp;quot;p&amp;quot; using `p∧r` ..&lt;br /&gt;
    next&lt;br /&gt;
      have &amp;quot;r&amp;quot; using `p∧r` ..&lt;br /&gt;
      thus &amp;quot;q∨r&amp;quot; by (rule disjI2)&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_34b:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 35. Demostrar&lt;br /&gt;
     p ∨ (q ∧ r) ⊢ (p ∨ q) ∧ (p ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_35:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 36. Demostrar&lt;br /&gt;
     (p ∨ q) ∧ (p ∨ r) ⊢ p ∨ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_36a:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ q&amp;quot; using assms ..&lt;br /&gt;
  thus &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    thus &amp;quot;p ∨ (q ∧ r)&amp;quot; by (rule disjI1)&lt;br /&gt;
  next &lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
      have &amp;quot;p ∨ r&amp;quot; using assms ..&lt;br /&gt;
      thus &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;p&amp;quot;&lt;br /&gt;
        thus &amp;quot;p ∨ (q∧r)&amp;quot; by (rule disjI1)&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;r&amp;quot;&lt;br /&gt;
        with `q` have &amp;quot;q ∧ r&amp;quot; ..&lt;br /&gt;
        thus &amp;quot;p ∨ (q ∧ r)&amp;quot; by (rule disjI2)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_36b:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 37. Demostrar&lt;br /&gt;
     (p ⟶ r) ∧ (q ⟶ r) ⊢ p ∨ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_37:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  thus &amp;quot;r&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;p ⟶ r&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
      thus &amp;quot;r&amp;quot; using `p` ..&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      have &amp;quot;q ⟶ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
      thus &amp;quot;r&amp;quot; using `q` ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_37b:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 38. Demostrar&lt;br /&gt;
     p ∨ q ⟶ r ⊢ (p ⟶ r) ∧ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_38a:&lt;br /&gt;
  assumes &amp;quot;p ∨ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
  proof (rule conjI)&lt;br /&gt;
    show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
      proof (rule impI)&lt;br /&gt;
        assume &amp;quot;p&amp;quot;&lt;br /&gt;
        hence &amp;quot;p ∨ q&amp;quot; ..&lt;br /&gt;
        with assms show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
      qed&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
      proof (rule impI)&lt;br /&gt;
        assume &amp;quot;q&amp;quot;&lt;br /&gt;
        hence &amp;quot;p ∨ q&amp;quot; ..&lt;br /&gt;
        with assms show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_38b:&lt;br /&gt;
  assumes &amp;quot;p ∨ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
section {* Negaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 39. Demostrar&lt;br /&gt;
     p ⊢ ¬¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
lemma ejercicio_39:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
show &amp;quot;¬¬p&amp;quot; using assms by (rule notnotI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 40. Demostrar&lt;br /&gt;
     ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_40a:&lt;br /&gt;
  assumes &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  with assms show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_40b:&lt;br /&gt;
  assumes &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 41. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ ¬q ⟶ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_41:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
  with assms show &amp;quot;¬p&amp;quot; by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_41b:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 42. Demostrar&lt;br /&gt;
     p∨q, ¬q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_42a:&lt;br /&gt;
  assumes &amp;quot;p∨q&amp;quot;&lt;br /&gt;
          &amp;quot;¬q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms(1)&lt;br /&gt;
  proof &lt;br /&gt;
    assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;q&amp;quot; &lt;br /&gt;
    with assms(2) show &amp;quot;p&amp;quot; by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_42b:&lt;br /&gt;
  assumes &amp;quot;p∨q&amp;quot;&lt;br /&gt;
          &amp;quot;¬q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 42. Demostrar&lt;br /&gt;
     p ∨ q, ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_43a:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms(1)&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with assms(2) show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;q&amp;quot; thus q .&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_43b:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 40. Demostrar&lt;br /&gt;
     p ∨ q ⊢ ¬(¬p ∧ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_44a:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
  proof &lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
      proof (rule notI)&lt;br /&gt;
        assume &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
        hence &amp;quot;¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
        thus False using `p` by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
      proof (rule notI)&lt;br /&gt;
        assume &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
        hence &amp;quot;¬q&amp;quot; by (rule conjunct2)&lt;br /&gt;
        thus False using `q` by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_44b:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
    show False using assms &lt;br /&gt;
      proof (rule disjE)&lt;br /&gt;
        assume &amp;quot;p&amp;quot;&lt;br /&gt;
        have &amp;quot;¬p&amp;quot; using `¬p ∧ ¬q` by (rule conjunct1)&lt;br /&gt;
        thus False using `p` by (rule notE)&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;q&amp;quot;&lt;br /&gt;
        have &amp;quot;¬q&amp;quot; using `¬p ∧ ¬q` by (rule conjunct2)&lt;br /&gt;
        thus False using `q` by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_44c:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 45. Demostrar&lt;br /&gt;
     p ∧ q ⊢ ¬(¬p ∨ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_45a:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
    thus False&lt;br /&gt;
      proof (rule disjE)&lt;br /&gt;
        assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
        have &amp;quot;p&amp;quot; using assms ..&lt;br /&gt;
        with `¬ p` show False ..&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
        have &amp;quot;q&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
        with `¬ q` show False by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_45c:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 46. Demostrar&lt;br /&gt;
     ¬(p ∨ q) ⊢ ¬p ∧ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_46a:&lt;br /&gt;
  assumes &amp;quot;¬(p ∨ q)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    show &amp;quot;¬p&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      hence &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
      with assms show False by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;¬q&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      hence &amp;quot;p ∨ q&amp;quot; ..&lt;br /&gt;
      with assms show False ..&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_46c:&lt;br /&gt;
  assumes &amp;quot;¬(p ∨ q)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 47. Demostrar&lt;br /&gt;
     ¬p ∧ ¬q ⊢ ¬(p ∨ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_47a:&lt;br /&gt;
  assumes &amp;quot;¬p ∧ ¬q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(p ∨ q)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
    thus False&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;p&amp;quot;&lt;br /&gt;
        have &amp;quot;¬p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
        thus False using `p` by (rule notE)&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;q&amp;quot;&lt;br /&gt;
        have &amp;quot;¬q&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
        thus False using `q` by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_47c:&lt;br /&gt;
  assumes &amp;quot;¬p ∧ ¬q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(p ∨ q)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 48. Demostrar&lt;br /&gt;
     ¬p ∨ ¬q ⊢ ¬(p ∧ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_48a:&lt;br /&gt;
  assumes &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    show &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
        hence &amp;quot;p&amp;quot; by (rule conjunct1)&lt;br /&gt;
        with `¬p` show False by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
    show &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
        hence &amp;quot;q&amp;quot; ..&lt;br /&gt;
        with `¬q` show False ..&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_48b:&lt;br /&gt;
  assumes &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  show False&lt;br /&gt;
  using assms&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    have &amp;quot;p&amp;quot; using `p ∧ q` ..&lt;br /&gt;
    with `¬p` show False ..&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
    have &amp;quot;q&amp;quot; using `p ∧ q` ..&lt;br /&gt;
    with `¬q` show False ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_48c:&lt;br /&gt;
  assumes &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 49. Demostrar&lt;br /&gt;
     ⊢ ¬(p ∧ ¬p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_49a:&lt;br /&gt;
  &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ ¬p&amp;quot;&lt;br /&gt;
  hence &amp;quot;p&amp;quot; ..&lt;br /&gt;
  have &amp;quot;¬ p&amp;quot; using `p ∧ ¬p` ..&lt;br /&gt;
  thus False using `p` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_49b:&lt;br /&gt;
  &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 50. Demostrar&lt;br /&gt;
     p ∧ ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_50:&lt;br /&gt;
  assumes &amp;quot;p ∧ ¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 51. Demostrar&lt;br /&gt;
     ¬¬p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_51a:&lt;br /&gt;
  assumes &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms by (rule notnotD)&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_51b:&lt;br /&gt;
  assumes &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 52. Demostrar&lt;br /&gt;
     ⊢ p ∨ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_52a:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬¬p ∨ ¬p&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;p ∨ ¬p&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_52b:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;p ∨ ¬p&amp;quot; by (rule ejercicio_27a)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_52c:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 53. Demostrar&lt;br /&gt;
     ⊢ ((p ⟶ q) ⟶ p) ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_53b:&lt;br /&gt;
  &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;(p ⟶ q) ⟶ p&amp;quot;&lt;br /&gt;
  show &amp;quot;p&amp;quot;&lt;br /&gt;
    proof (rule ccontr)&lt;br /&gt;
      assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      have &amp;quot;¬ (p ⟶ q)&amp;quot; using `(p ⟶ q) ⟶ p` `¬p` by (rule mt)&lt;br /&gt;
      have &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
      proof (rule impI)&lt;br /&gt;
        assume &amp;quot;p&amp;quot;&lt;br /&gt;
        show &amp;quot;q&amp;quot; using `¬p` `p` by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
      show False using `¬ (p ⟶ q)` `p ⟶ q` ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_53a:&lt;br /&gt;
  &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;(p ⟶ q) ⟶ p&amp;quot;&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;p&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    {assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      have &amp;quot;¬(p⟶ q)&amp;quot; using `(p ⟶ q) ⟶ p` `¬p` by (rule mt)&lt;br /&gt;
      have &amp;quot;p⟶ q&amp;quot;&lt;br /&gt;
        proof (rule impI)&lt;br /&gt;
          assume &amp;quot;p&amp;quot;&lt;br /&gt;
          show &amp;quot;q&amp;quot; using `¬p``p` by (rule notE)&lt;br /&gt;
        qed&lt;br /&gt;
      show &amp;quot;p&amp;quot; using `¬(p⟶ q)` `p⟶ q` by (rule notE)&lt;br /&gt;
    }&lt;br /&gt;
  next&lt;br /&gt;
    {assume &amp;quot;p&amp;quot;&lt;br /&gt;
     thus &amp;quot;p&amp;quot; .&lt;br /&gt;
   }&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_53c:&lt;br /&gt;
  &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 54. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_54:&lt;br /&gt;
  assumes &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  hence &amp;quot;¬¬p&amp;quot; by (rule notnotI)&lt;br /&gt;
  with assms have &amp;quot;¬¬q&amp;quot; by (rule mt)&lt;br /&gt;
  thus &amp;quot;q&amp;quot; by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 55. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_55a:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;p∨q&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      have &amp;quot;¬q ∨ q&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;p∨q&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
        with `¬p` have &amp;quot;¬p ∧ ¬q&amp;quot; by (rule conjI)&lt;br /&gt;
        with assms show &amp;quot;p∨q&amp;quot; by (rule notE)&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;q&amp;quot;&lt;br /&gt;
        thus &amp;quot;p ∨ q&amp;quot; ..&lt;br /&gt;
      qed&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      thus &amp;quot;p ∨q&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_55c:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 56. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_56a:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    show &amp;quot;p&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
      have &amp;quot;¬p ∨ p&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;p&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
        hence &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)&lt;br /&gt;
        with `¬(¬p ∨ ¬q)` show &amp;quot;p&amp;quot; by (rule notE)&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;q&amp;quot;&lt;br /&gt;
   proof -&lt;br /&gt;
      have &amp;quot;¬q ∨ q&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;q&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
        hence &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)&lt;br /&gt;
        with `¬(¬p ∨ ¬q)` show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;q&amp;quot; thus &amp;quot;q&amp;quot; .&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_56c:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 57. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_57a:&lt;br /&gt;
  assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨p&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    thus &amp;quot;¬p ∨ ¬q&amp;quot; ..&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;¬q ∨ q&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
        thus &amp;quot;¬p ∨ ¬q&amp;quot; ..&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;q&amp;quot;&lt;br /&gt;
        with `p` have &amp;quot;p∧q&amp;quot; by (rule conjI)&lt;br /&gt;
        with assms show &amp;quot;¬p ∨ ¬q&amp;quot; by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_57c:&lt;br /&gt;
  assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 58. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_58a:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
      proof (rule disjI1)&lt;br /&gt;
        show &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          proof&lt;br /&gt;
            assume &amp;quot;p&amp;quot;&lt;br /&gt;
            with `¬ p` show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
          qed&lt;br /&gt;
      qed&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
      proof (rule disjI2)&lt;br /&gt;
        show &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
        proof (rule impI)&lt;br /&gt;
          assume &amp;quot;q&amp;quot;&lt;br /&gt;
          show &amp;quot;p&amp;quot; using `p` .&lt;br /&gt;
        qed&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_58b:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; .. (* by (rule excluded_middle) *)&lt;br /&gt;
  thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
      proof (rule disjI1)&lt;br /&gt;
        show &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          proof&lt;br /&gt;
            assume &amp;quot;p&amp;quot;&lt;br /&gt;
            with `¬ p` show &amp;quot;q&amp;quot; .. (* by (rule notE) *)&lt;br /&gt;
          qed&lt;br /&gt;
      qed&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
      proof (rule disjI2)&lt;br /&gt;
        show &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
        proof (* (rule impI) *)&lt;br /&gt;
          assume &amp;quot;q&amp;quot;&lt;br /&gt;
          show &amp;quot;p&amp;quot; using `p` .&lt;br /&gt;
        qed&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_58c:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma ej_59: assumes &amp;quot;p ∧ ¬(q ⟶ r)&amp;quot;&lt;br /&gt;
             shows &amp;quot;(p ∧ q) ∧ ¬r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
   proof&lt;br /&gt;
     show &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
     next&lt;br /&gt;
     show &amp;quot;q&amp;quot;&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
       assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
       have &amp;quot;¬(q ⟶ r)&amp;quot; using assms ..&lt;br /&gt;
       have &amp;quot;q ⟶ r&amp;quot; &lt;br /&gt;
         proof&lt;br /&gt;
           assume &amp;quot;q&amp;quot; &lt;br /&gt;
           with `¬q` show &amp;quot;r&amp;quot; by (rule notE)&lt;br /&gt;
         qed&lt;br /&gt;
      with `¬(q ⟶ r)` show False ..&lt;br /&gt;
      qed&lt;br /&gt;
   qed&lt;br /&gt;
  next&lt;br /&gt;
  show &amp;quot;¬r&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
     assume &amp;quot;r&amp;quot;&lt;br /&gt;
     have &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
       proof&lt;br /&gt;
        assume &amp;quot;q&amp;quot; show &amp;quot;r&amp;quot; using `r` .&lt;br /&gt;
       qed&lt;br /&gt;
     have &amp;quot;¬(q ⟶ r)&amp;quot; using assms ..&lt;br /&gt;
     thus False using `q ⟶ r` ..&lt;br /&gt;
    qed&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ej_60: &amp;quot;¬(s ∨ (p ⟶ q)) ⟶ p ∧ ¬q ∧ ¬s&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1:&amp;quot;¬(s ∨ (p ⟶ q))&amp;quot;&lt;br /&gt;
  show &amp;quot;p ∧ ¬q ∧ ¬s&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
     show &amp;quot;p&amp;quot;&lt;br /&gt;
       proof (rule ccontr)&lt;br /&gt;
         assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
         have &amp;quot;p ⟶q&amp;quot; &lt;br /&gt;
           proof&lt;br /&gt;
             assume &amp;quot;p&amp;quot; with `¬p` show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
           qed&lt;br /&gt;
         hence &amp;quot;s ∨ (p ⟶ q)&amp;quot; ..&lt;br /&gt;
         with 1 show False ..&lt;br /&gt;
       qed&lt;br /&gt;
     next &lt;br /&gt;
     show &amp;quot;¬q ∧ ¬s&amp;quot;&lt;br /&gt;
       proof&lt;br /&gt;
        show &amp;quot;¬q&amp;quot;&lt;br /&gt;
         proof&lt;br /&gt;
          assume &amp;quot;q&amp;quot;&lt;br /&gt;
          have &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
             proof&lt;br /&gt;
               assume &amp;quot;p&amp;quot; show &amp;quot;q&amp;quot; using `q` by this&lt;br /&gt;
             qed &lt;br /&gt;
         hence &amp;quot;s ∨ (p ⟶ q)&amp;quot; ..&lt;br /&gt;
         with 1 show False ..&lt;br /&gt;
        qed&lt;br /&gt;
        next&lt;br /&gt;
        show &amp;quot;¬s&amp;quot;&lt;br /&gt;
         proof&lt;br /&gt;
           assume &amp;quot;s&amp;quot; &lt;br /&gt;
           hence &amp;quot;s ∨ (p ⟶ q)&amp;quot; ..&lt;br /&gt;
         with 1 show False ..&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
             &lt;br /&gt;
lemma ejercicio_70:&lt;br /&gt;
  assumes &amp;quot;p ∧ q ⟶ r ∨ s&amp;quot;&lt;br /&gt;
          &amp;quot;q ⟶ ¬s&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;p ⟶ ¬q ∨ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;¬q ∨ r&amp;quot;&lt;br /&gt;
   proof-&lt;br /&gt;
   have &amp;quot;¬q ∨ q&amp;quot; ..&lt;br /&gt;
   thus &amp;quot;¬q ∨ r&amp;quot;&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
     assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
      thus   &amp;quot;¬q ∨ r&amp;quot; ..&lt;br /&gt;
     next&lt;br /&gt;
     assume &amp;quot;q&amp;quot;&lt;br /&gt;
     with `p` have &amp;quot;p ∧ q&amp;quot; ..&lt;br /&gt;
     with assms(1) have &amp;quot;r ∨ s&amp;quot; ..&lt;br /&gt;
     thus &amp;quot;¬q ∨ r&amp;quot;&lt;br /&gt;
       proof (rule disjE)&lt;br /&gt;
         assume &amp;quot;r&amp;quot; thus &amp;quot;¬q ∨ r&amp;quot; ..&lt;br /&gt;
         next&lt;br /&gt;
         assume &amp;quot;s&amp;quot;&lt;br /&gt;
         hence &amp;quot;¬¬s&amp;quot; by (rule notnotI)&lt;br /&gt;
         with assms(2) have &amp;quot;¬q&amp;quot; by (rule mt)&lt;br /&gt;
         thus &amp;quot;¬q ∨ r&amp;quot; ..&lt;br /&gt;
       qed&lt;br /&gt;
    qed&lt;br /&gt;
&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_71:&lt;br /&gt;
  assumes &amp;quot;∀x. (P(x) ⟶ Q(x))&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. (¬S(x) ⟶ ¬Q(x))&amp;quot;&lt;br /&gt;
          &amp;quot;¬ (∀x. S(x))&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃x. ¬P(x)&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
   assume 3: &amp;quot;¬ (∃x. ¬ P x)&amp;quot;&lt;br /&gt;
   have &amp;quot;∀x. S(x)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix a&lt;br /&gt;
      show &amp;quot;S(a)&amp;quot;&lt;br /&gt;
       proof (rule ccontr)&lt;br /&gt;
         assume 1:&amp;quot;¬ S a&amp;quot;&lt;br /&gt;
         have  &amp;quot;¬S(a) ⟶ ¬Q(a)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
         hence 2:&amp;quot;¬Q(a)&amp;quot; using 1 ..&lt;br /&gt;
         have &amp;quot;P(a) ⟶ Q(a)&amp;quot; using assms(1) ..&lt;br /&gt;
         hence &amp;quot;¬P(a)&amp;quot; using 2 by (rule mt)&lt;br /&gt;
         hence &amp;quot;∃x. ¬P(x)&amp;quot; ..&lt;br /&gt;
         with 3 show False ..&lt;br /&gt;
       qed&lt;br /&gt;
    qed&lt;br /&gt;
  with assms(3) show False ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_4&amp;diff=559</id>
		<title>Sol 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Sol_4&amp;diff=559"/>
		<updated>2019-04-09T10:50:03Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R4: Deducción natural proposicional *}&lt;br /&gt;
&lt;br /&gt;
theory R4_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  El objetivo de esta relación es demostrar cada uno de los ejercicios&lt;br /&gt;
  usando sólo las reglas básicas de deducción natural de la lógica&lt;br /&gt;
  proposicional (sin usar el método auto).&lt;br /&gt;
&lt;br /&gt;
  Las reglas básicas de la deducción natural son las siguientes:&lt;br /&gt;
  · conjI:      ⟦P; Q⟧ ⟹ P ∧ Q&lt;br /&gt;
  · conjunct1:  P ∧ Q ⟹ P&lt;br /&gt;
  · conjunct2:  P ∧ Q ⟹ Q  &lt;br /&gt;
  · notnotD:    ¬¬ P ⟹ P&lt;br /&gt;
  · notnotI:    P ⟹ ¬¬ P&lt;br /&gt;
  · mp:         ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
  · mt:         ⟦F ⟶ G; ¬G⟧ ⟹ ¬F &lt;br /&gt;
  · impI:       (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
  · disjI1:     P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2:     Q ⟹ P ∨ Q&lt;br /&gt;
  · disjE:      ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R &lt;br /&gt;
  · FalseE:     False ⟹ P&lt;br /&gt;
  · notE:       ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  · notI:       (P ⟹ False) ⟹ ¬P&lt;br /&gt;
  · iffI:       ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P = Q&lt;br /&gt;
  · iffD1:      ⟦Q = P; Q⟧ ⟹ P &lt;br /&gt;
  · iffD2:      ⟦P = Q; Q⟧ ⟹ P&lt;br /&gt;
  · ccontr:     (¬P ⟹ False) ⟹ P&lt;br /&gt;
  · excluded_middle: ¬P ∨ P&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI y mt que demostramos a continuación. *}&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
section {* Implicaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       p ⟶ q, p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1a:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2: &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
   show &amp;quot;q&amp;quot; using 1 2 by (rule mp) &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1b:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1c:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1d:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms by auto&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2a:&lt;br /&gt;
  assumes 1:&amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2:&amp;quot;q ⟶ r&amp;quot; and&lt;br /&gt;
          3:&amp;quot;p&amp;quot; &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
  show 5: &amp;quot;r&amp;quot; using 2 4 by (rule mp) &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2b:&lt;br /&gt;
  assumes 1:&amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2:&amp;quot;q ⟶ r&amp;quot; and&lt;br /&gt;
          3:&amp;quot;p&amp;quot; &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 2 4 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2c:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          &amp;quot;q ⟶ r&amp;quot; and&lt;br /&gt;
          &amp;quot;p&amp;quot; &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;q&amp;quot; using assms(1,3) .. &lt;br /&gt;
  show &amp;quot;r&amp;quot; using assms(2) `q` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2d:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          &amp;quot;q ⟶ r&amp;quot; and&lt;br /&gt;
          &amp;quot;p&amp;quot; &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;r&amp;quot; using assms by auto&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r), p ⟶ q, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
lemma ejercicio_3a:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and&lt;br /&gt;
          2: &amp;quot;p ⟶ q&amp;quot;       and&lt;br /&gt;
          3: &amp;quot;p&amp;quot;           &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
   have 4: &amp;quot;q ⟶ r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
   have 5: &amp;quot;q&amp;quot; using 2 3 by (rule mp)&lt;br /&gt;
   show 6: &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3b:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and&lt;br /&gt;
          &amp;quot;p ⟶ q&amp;quot;       and&lt;br /&gt;
          &amp;quot;p&amp;quot;           &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
   have 4: &amp;quot;q ⟶ r&amp;quot; using assms(1,3) ..&lt;br /&gt;
   have &amp;quot;q&amp;quot; using assms(2,3) ..&lt;br /&gt;
   show &amp;quot;r&amp;quot; using 4 `q` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3c:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and&lt;br /&gt;
          &amp;quot;p ⟶ q&amp;quot;       and&lt;br /&gt;
          &amp;quot;p&amp;quot;           &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
   have &amp;quot;q&amp;quot; using assms(2,3) ..&lt;br /&gt;
   have &amp;quot;q ⟶ r&amp;quot; using assms(1,3) ..&lt;br /&gt;
   thus &amp;quot;r&amp;quot; using `q` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3d:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and&lt;br /&gt;
          &amp;quot;p ⟶ q&amp;quot;       and&lt;br /&gt;
          &amp;quot;p&amp;quot;           &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
   show &amp;quot;r&amp;quot; using assms by auto&lt;br /&gt;
qed&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r ⊢ p ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
lemma ejercicio_4a:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2: &amp;quot;q ⟶ r&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  {assume 3:&amp;quot;p&amp;quot; &lt;br /&gt;
    have 4: &amp;quot;q&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
    have 5: &amp;quot;r&amp;quot; using 2 4 by (rule mp)}&lt;br /&gt;
  thus &amp;quot;p⟶ r&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4b:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2: &amp;quot;q ⟶ r&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 3:&amp;quot;p&amp;quot; &lt;br /&gt;
    have &amp;quot;q&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 2 `q` by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4c:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          &amp;quot;q ⟶ r&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p&amp;quot; &lt;br /&gt;
    have &amp;quot;q&amp;quot; using assms(1) `p` ..&lt;br /&gt;
    show &amp;quot;r&amp;quot; using assms(2) `q` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4d:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          &amp;quot;q ⟶ r&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ q ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5a:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  {assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    {assume 4: &amp;quot;p&amp;quot;&lt;br /&gt;
      have  &amp;quot;q ⟶ r&amp;quot; using 1 4 ..&lt;br /&gt;
      hence 5: &amp;quot;r&amp;quot; using 3 ..}&lt;br /&gt;
    hence 6: &amp;quot;p ⟶ r&amp;quot; by (rule impI)}&lt;br /&gt;
  thus &amp;quot;q ⟶ (p ⟶ r)&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5b:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;q&amp;quot;&lt;br /&gt;
  show &amp;quot;p ⟶  r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    have &amp;quot;q ⟶ r&amp;quot; using assms(1) `p` ..&lt;br /&gt;
    thus &amp;quot;r&amp;quot; using `q` ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5c:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;q&amp;quot;&lt;br /&gt;
  show &amp;quot;p ⟶  r&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with assms(1) have &amp;quot;q ⟶ r&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;r&amp;quot; using `q` ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5d:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ (p ⟶ q) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6a:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 {assume 2: &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
   {assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
    have 4: &amp;quot;q ⟶ r&amp;quot; using 1 3 ..&lt;br /&gt;
    have 5: &amp;quot;q&amp;quot; using 2 3 ..&lt;br /&gt;
    have &amp;quot;r&amp;quot;  using 4 5 ..}&lt;br /&gt;
   hence &amp;quot;p ⟶ r&amp;quot; by (rule impI)}&lt;br /&gt;
 thus &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot; by (rule impI)&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6b:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
 assume &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
 show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
 proof (rule impI)&lt;br /&gt;
   assume &amp;quot;p&amp;quot;&lt;br /&gt;
   with `p ⟶ q` have &amp;quot;q&amp;quot; ..&lt;br /&gt;
   have &amp;quot;q ⟶ r&amp;quot; using assms(1) `p` ..&lt;br /&gt;
   thus &amp;quot;r&amp;quot; using `q` ..&lt;br /&gt;
 qed&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6c:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar&lt;br /&gt;
     p ⊢ q ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
 assume &amp;quot;q&amp;quot;&lt;br /&gt;
 show &amp;quot;p&amp;quot; using assms(1) by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar&lt;br /&gt;
     ⊢ p ⟶ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8a:&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      show &amp;quot;p&amp;quot; using `p` .&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8b:&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ (q ⟶ r) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9a:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  show &amp;quot;p ⟶  r&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;q&amp;quot; using assms(1) `p` ..&lt;br /&gt;
      show &amp;quot;r&amp;quot; using `q ⟶  r` `q` ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9b:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ (r ⟶ s)) ⊢ r ⟶ (q ⟶ (p ⟶ s))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10a:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ (r ⟶ s))&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;r&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ (p ⟶ s)&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      show &amp;quot;p ⟶ s&amp;quot;&lt;br /&gt;
        proof (rule impI)&lt;br /&gt;
          assume &amp;quot;p&amp;quot;&lt;br /&gt;
          with assms(1) have &amp;quot;q ⟶ (r ⟶ s)&amp;quot; ..&lt;br /&gt;
          hence &amp;quot;r ⟶ s&amp;quot; using `q` ..&lt;br /&gt;
          thus &amp;quot;s&amp;quot; using `r` ..&lt;br /&gt;
        qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10b:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ (r ⟶ s))&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_11a:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  show &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
      show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
        proof (rule impI)&lt;br /&gt;
          assume &amp;quot;p&amp;quot;&lt;br /&gt;
          have &amp;quot;q ⟶ r&amp;quot; using `p ⟶ (q ⟶ r)` `p`..&lt;br /&gt;
          have &amp;quot;q&amp;quot; using `p ⟶ q` `p` ..&lt;br /&gt;
          show &amp;quot;r&amp;quot; using `q ⟶ r` `q` ..&lt;br /&gt;
        qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_11b:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  {assume &amp;quot;p ⟶  q&amp;quot;&lt;br /&gt;
    {assume &amp;quot;p&amp;quot;&lt;br /&gt;
      with `p ⟶  q` have &amp;quot;q&amp;quot; ..&lt;br /&gt;
      have &amp;quot;q ⟶ r&amp;quot; using `p ⟶ (q ⟶ r)` `p` ..&lt;br /&gt;
      hence &amp;quot;r&amp;quot; using `q` ..}&lt;br /&gt;
    hence &amp;quot;p ⟶  r&amp;quot; ..}&lt;br /&gt;
  thus &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_11c:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_12a:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI) &lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶  r&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      show &amp;quot;r&amp;quot;&lt;br /&gt;
        proof -&lt;br /&gt;
          {assume &amp;quot;p&amp;quot;&lt;br /&gt;
          have &amp;quot;q&amp;quot; using `q` .}&lt;br /&gt;
        hence &amp;quot;p ⟶  q&amp;quot; ..&lt;br /&gt;
          show &amp;quot;r&amp;quot; using assms(1) `p ⟶ q` ..&lt;br /&gt;
        qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_12b:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  {assume &amp;quot;q&amp;quot;&lt;br /&gt;
    {assume &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;q&amp;quot; using `q` .}&lt;br /&gt;
  hence &amp;quot;p ⟶  q&amp;quot; ..&lt;br /&gt;
  with assms(1) have &amp;quot;r&amp;quot; ..}&lt;br /&gt;
  thus &amp;quot;q ⟶ r&amp;quot; .. &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_12c:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
section {* Conjunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar&lt;br /&gt;
     p, q ⊢  p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13a:&lt;br /&gt;
  assumes 1:&amp;quot;p&amp;quot; and&lt;br /&gt;
          2:&amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;p ∧ q&amp;quot; using 1 2 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13b:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot; and&lt;br /&gt;
          &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &amp;quot;p&amp;quot; using assms(1) .&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms(2) .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13c:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot; and&lt;br /&gt;
          &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
lemma ejercicio_14:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar&lt;br /&gt;
     p ∧ q ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
lemma ejercicio_15:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar&lt;br /&gt;
     p ∧ (q ∧ r) ⊢ (p ∧ q) ∧ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16a:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∧ q)∧ r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 1: &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have 2: &amp;quot;(q ∧ r)&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  have 3: &amp;quot;q&amp;quot; using 2 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;r&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;(p∧q)&amp;quot; using 1 3 by (rule conjI)&lt;br /&gt;
  show &amp;quot;(p∧q) ∧ r&amp;quot; using 5 4 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16b:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∧ q)∧ r&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  proof (rule conjI)&lt;br /&gt;
    show &amp;quot;p&amp;quot; using assms ..&lt;br /&gt;
    next&lt;br /&gt;
      have &amp;quot;q ∧ r&amp;quot; using assms ..&lt;br /&gt;
      thus &amp;quot;q&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  have &amp;quot;q ∧ r&amp;quot; using assms ..&lt;br /&gt;
  thus &amp;quot;r&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16c:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∧ q)∧ r&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar&lt;br /&gt;
     (p ∧ q) ∧ r ⊢ p ∧ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
lemma ejercicio_17a:&lt;br /&gt;
  assumes &amp;quot;(p∧ q) ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 1: &amp;quot;r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  have 2: &amp;quot;(p∧q)&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot; using 2 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;(q∧r)&amp;quot; using 4 1 by (rule conjI)&lt;br /&gt;
  show &amp;quot;p∧(q∧r)&amp;quot; using 3 5 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_17b:&lt;br /&gt;
  assumes &amp;quot;(p∧ q) ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q∧ r)&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  have &amp;quot;p ∧ q&amp;quot; using assms ..&lt;br /&gt;
  thus &amp;quot;p&amp;quot; ..&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;q ∧ r&amp;quot;&lt;br /&gt;
    proof (rule conjI)&lt;br /&gt;
      have &amp;quot;p ∧ q&amp;quot; using assms ..&lt;br /&gt;
      thus &amp;quot;q&amp;quot; ..&lt;br /&gt;
    next&lt;br /&gt;
      show &amp;quot;r&amp;quot; using assms ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_17c:&lt;br /&gt;
  assumes &amp;quot;(p∧ q) ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q∧ r)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18a:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 1: &amp;quot;q&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;p⟶ q&amp;quot; using 1 by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18b:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18c:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar&lt;br /&gt;
     (p ⟶ q) ∧ (p ⟶ r) ⊢ p ⟶ q ∧ r   &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_19a:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;q ∧ r&amp;quot; &lt;br /&gt;
      proof (rule conjI)&lt;br /&gt;
    have &amp;quot;p ⟶ q&amp;quot; using assms ..&lt;br /&gt;
    thus &amp;quot;q&amp;quot; using `p` ..&lt;br /&gt;
    have &amp;quot;p ⟶ r&amp;quot; using assms ..&lt;br /&gt;
    thus &amp;quot;r&amp;quot; using `p` ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_19c:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar&lt;br /&gt;
     p ⟶ q ∧ r ⊢ (p ⟶ q) ∧ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_20a:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with `p ⟶ q ∧ r` have &amp;quot;q ∧ r&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;q&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;p ⟶ r&amp;quot; &lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with `p ⟶ q ∧ r` have &amp;quot;q ∧ r&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;r&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_20c:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21a:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21b:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  hence &amp;quot;p&amp;quot; ..&lt;br /&gt;
  with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; ..&lt;br /&gt;
  have &amp;quot;q&amp;quot; using `p ∧ q` ..&lt;br /&gt;
  with `q ⟶ r` show &amp;quot;r&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21c:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  hence &amp;quot;p&amp;quot; ..&lt;br /&gt;
  have &amp;quot;q&amp;quot; using `p ∧ q`..&lt;br /&gt;
  have  &amp;quot;q ⟶ r&amp;quot; using assms(1) `p` ..&lt;br /&gt;
thus &amp;quot;r&amp;quot; using `q` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar&lt;br /&gt;
     p ∧ q ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_22a:&lt;br /&gt;
  assumes &amp;quot;p ∧ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      with `p` have &amp;quot;p ∧ q&amp;quot; ..&lt;br /&gt;
      with assms(1) show &amp;quot;r&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_22c:&lt;br /&gt;
  assumes &amp;quot;p ∧ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_23a:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  hence &amp;quot;q&amp;quot; ..&lt;br /&gt;
  have &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      show &amp;quot;q&amp;quot; using `q` .&lt;br /&gt;
    qed&lt;br /&gt;
    with assms(1) show &amp;quot;r&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_23c:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar&lt;br /&gt;
     p ∧ (q ⟶ r) ⊢ (p ⟶ q) ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_24b:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  have &amp;quot;p&amp;quot; using assms(1) ..&lt;br /&gt;
  with `p ⟶ q` have &amp;quot;q&amp;quot; ..&lt;br /&gt;
  have &amp;quot;q ⟶ r&amp;quot; using assms(1) ..&lt;br /&gt;
  thus &amp;quot;r&amp;quot; using `q` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_24c:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
section {* Disyunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar&lt;br /&gt;
     p ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
lemma ejercicio_25:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
show &amp;quot;p∨q&amp;quot; using assms by (rule disjI1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar&lt;br /&gt;
     q ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
lemma ejercicio_26:&lt;br /&gt;
  assumes &amp;quot;q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
show &amp;quot;p∨q&amp;quot; using assms by (rule disjI2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar&lt;br /&gt;
     p ∨ q ⊢ q ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
lemma ejercicio_27a:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
proof - &lt;br /&gt;
have &amp;quot;p ∨ q&amp;quot; using assms by this&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    have &amp;quot;q ∨ p&amp;quot; using 2 by (rule disjI2) }&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    have &amp;quot;q ∨ p&amp;quot; using 3 by (rule disjI1) }&lt;br /&gt;
  ultimately show &amp;quot;q ∨ p&amp;quot; by (rule disjE) &lt;br /&gt;
qed  &lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_27b:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
proof - &lt;br /&gt;
  note `p ∨ q`&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ∨ p&amp;quot; ..}&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume &amp;quot;q&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ∨ p&amp;quot; .. }&lt;br /&gt;
  ultimately show &amp;quot;q ∨ p&amp;quot; .. &lt;br /&gt;
qed  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_27c:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  thus &amp;quot;q ∨ p&amp;quot; ..&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;q&amp;quot;&lt;br /&gt;
  thus &amp;quot;q ∨ p&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_27d:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 28. Demostrar&lt;br /&gt;
     q ⟶ r ⊢ p ∨ q ⟶ p ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_28b:&lt;br /&gt;
  assumes &amp;quot;q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ p ∨ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  show &amp;quot;p ∨ r&amp;quot;&lt;br /&gt;
    using `p ∨ q`&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      thus &amp;quot;p ∨ r&amp;quot; ..&lt;br /&gt;
      next&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      with assms(1) have &amp;quot;r&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;p ∨ r&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_28c:&lt;br /&gt;
  assumes &amp;quot;q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ p ∨ r&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 29. Demostrar&lt;br /&gt;
     p ∨ p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_29b:&lt;br /&gt;
  assumes &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  thus &amp;quot;p&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  thus &amp;quot;p&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_29c:&lt;br /&gt;
  assumes &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 30. Demostrar&lt;br /&gt;
     p ⊢ p ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_30a:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
proof (rule disjI1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_30b:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 31. Demostrar&lt;br /&gt;
     p ∨ (q ∨ r) ⊢ (p ∨ q) ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_31a:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∨ r&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  hence &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
  thus &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;q ∨ r&amp;quot; &lt;br /&gt;
  thus &amp;quot;(p ∨ q) ∨ r&amp;quot;&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
      thus &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;r&amp;quot;&lt;br /&gt;
    thus &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_31b:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∨ r&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 32. Demostrar&lt;br /&gt;
     (p ∨ q) ∨ r ⊢ p ∨ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_32:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∨ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 33. Demostrar&lt;br /&gt;
     p ∧ (q ∨ r) ⊢ (p ∧ q) ∨ (p ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_33:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 34. Demostrar&lt;br /&gt;
     (p ∧ q) ∨ (p ∧ r) ⊢ p ∧ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_34a:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p∧q&amp;quot;&lt;br /&gt;
  show &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
    proof (rule conjI)&lt;br /&gt;
      show &amp;quot;p&amp;quot; using `p∧q` ..&lt;br /&gt;
    next&lt;br /&gt;
      have &amp;quot;q&amp;quot; using `p∧q` ..&lt;br /&gt;
      thus &amp;quot;q∨r&amp;quot; by (rule disjI1)&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
  assume &amp;quot;p∧r&amp;quot;&lt;br /&gt;
  show &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
    proof (rule conjI)&lt;br /&gt;
      show &amp;quot;p&amp;quot; using `p∧r` ..&lt;br /&gt;
    next&lt;br /&gt;
      have &amp;quot;r&amp;quot; using `p∧r` ..&lt;br /&gt;
      thus &amp;quot;q∨r&amp;quot; by (rule disjI2)&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_34b:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 35. Demostrar&lt;br /&gt;
     p ∨ (q ∧ r) ⊢ (p ∨ q) ∧ (p ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_35:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 36. Demostrar&lt;br /&gt;
     (p ∨ q) ∧ (p ∨ r) ⊢ p ∨ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_36a:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ q&amp;quot; using assms ..&lt;br /&gt;
  thus &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    thus &amp;quot;p ∨ (q ∧ r)&amp;quot; by (rule disjI1)&lt;br /&gt;
  next &lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
      have &amp;quot;p ∨ r&amp;quot; using assms ..&lt;br /&gt;
      thus &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;p&amp;quot;&lt;br /&gt;
        thus &amp;quot;p ∨ (q∧r)&amp;quot; by (rule disjI1)&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;r&amp;quot;&lt;br /&gt;
        with `q` have &amp;quot;q ∧ r&amp;quot; ..&lt;br /&gt;
        thus &amp;quot;p ∨ (q ∧ r)&amp;quot; by (rule disjI2)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_36b:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 37. Demostrar&lt;br /&gt;
     (p ⟶ r) ∧ (q ⟶ r) ⊢ p ∨ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_37:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  thus &amp;quot;r&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;p ⟶ r&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
      thus &amp;quot;r&amp;quot; using `p` ..&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      have &amp;quot;q ⟶ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
      thus &amp;quot;r&amp;quot; using `q` ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_37b:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 38. Demostrar&lt;br /&gt;
     p ∨ q ⟶ r ⊢ (p ⟶ r) ∧ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_38a:&lt;br /&gt;
  assumes &amp;quot;p ∨ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
  proof (rule conjI)&lt;br /&gt;
    show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
      proof (rule impI)&lt;br /&gt;
        assume &amp;quot;p&amp;quot;&lt;br /&gt;
        hence &amp;quot;p ∨ q&amp;quot; ..&lt;br /&gt;
        with assms show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
      qed&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
      proof (rule impI)&lt;br /&gt;
        assume &amp;quot;q&amp;quot;&lt;br /&gt;
        hence &amp;quot;p ∨ q&amp;quot; ..&lt;br /&gt;
        with assms show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_38b:&lt;br /&gt;
  assumes &amp;quot;p ∨ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
section {* Negaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 39. Demostrar&lt;br /&gt;
     p ⊢ ¬¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
lemma ejercicio_39:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
show &amp;quot;¬¬p&amp;quot; using assms by (rule notnotI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 40. Demostrar&lt;br /&gt;
     ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_40a:&lt;br /&gt;
  assumes &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  with assms show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_40b:&lt;br /&gt;
  assumes &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 41. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ ¬q ⟶ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_41:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
  with assms show &amp;quot;¬p&amp;quot; by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_41b:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 42. Demostrar&lt;br /&gt;
     p∨q, ¬q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_42a:&lt;br /&gt;
  assumes &amp;quot;p∨q&amp;quot;&lt;br /&gt;
          &amp;quot;¬q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms(1)&lt;br /&gt;
  proof &lt;br /&gt;
    assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;q&amp;quot; &lt;br /&gt;
    with assms(2) show &amp;quot;p&amp;quot; by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_42b:&lt;br /&gt;
  assumes &amp;quot;p∨q&amp;quot;&lt;br /&gt;
          &amp;quot;¬q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 42. Demostrar&lt;br /&gt;
     p ∨ q, ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_43a:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms(1)&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with assms(2) show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;q&amp;quot; thus q .&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_43b:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 40. Demostrar&lt;br /&gt;
     p ∨ q ⊢ ¬(¬p ∧ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_44a:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
  proof &lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
      proof (rule notI)&lt;br /&gt;
        assume &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
        hence &amp;quot;¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
        thus False using `p` by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
      proof (rule notI)&lt;br /&gt;
        assume &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
        hence &amp;quot;¬q&amp;quot; by (rule conjunct2)&lt;br /&gt;
        thus False using `q` by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_44b:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
    show False using assms &lt;br /&gt;
      proof (rule disjE)&lt;br /&gt;
        assume &amp;quot;p&amp;quot;&lt;br /&gt;
        have &amp;quot;¬p&amp;quot; using `¬p ∧ ¬q` by (rule conjunct1)&lt;br /&gt;
        thus False using `p` by (rule notE)&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;q&amp;quot;&lt;br /&gt;
        have &amp;quot;¬q&amp;quot; using `¬p ∧ ¬q` by (rule conjunct2)&lt;br /&gt;
        thus False using `q` by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_44c:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 45. Demostrar&lt;br /&gt;
     p ∧ q ⊢ ¬(¬p ∨ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_45a:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
    thus False&lt;br /&gt;
      proof (rule disjE)&lt;br /&gt;
        assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
        have &amp;quot;p&amp;quot; using assms ..&lt;br /&gt;
        with `¬ p` show False ..&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
        have &amp;quot;q&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
        with `¬ q` show False by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_45c:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 46. Demostrar&lt;br /&gt;
     ¬(p ∨ q) ⊢ ¬p ∧ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_46a:&lt;br /&gt;
  assumes &amp;quot;¬(p ∨ q)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    show &amp;quot;¬p&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      hence &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
      with assms show False by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;¬q&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      hence &amp;quot;p ∨ q&amp;quot; ..&lt;br /&gt;
      with assms show False ..&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_46c:&lt;br /&gt;
  assumes &amp;quot;¬(p ∨ q)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 47. Demostrar&lt;br /&gt;
     ¬p ∧ ¬q ⊢ ¬(p ∨ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_47a:&lt;br /&gt;
  assumes &amp;quot;¬p ∧ ¬q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(p ∨ q)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
    thus False&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;p&amp;quot;&lt;br /&gt;
        have &amp;quot;¬p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
        thus False using `p` by (rule notE)&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;q&amp;quot;&lt;br /&gt;
        have &amp;quot;¬q&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
        thus False using `q` by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_47c:&lt;br /&gt;
  assumes &amp;quot;¬p ∧ ¬q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(p ∨ q)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 48. Demostrar&lt;br /&gt;
     ¬p ∨ ¬q ⊢ ¬(p ∧ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_48a:&lt;br /&gt;
  assumes &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    show &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
        hence &amp;quot;p&amp;quot; by (rule conjunct1)&lt;br /&gt;
        with `¬p` show False by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
    show &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
        hence &amp;quot;q&amp;quot; ..&lt;br /&gt;
        with `¬q` show False ..&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_48b:&lt;br /&gt;
  assumes &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  show False&lt;br /&gt;
  using assms&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    have &amp;quot;p&amp;quot; using `p ∧ q` ..&lt;br /&gt;
    with `¬p` show False ..&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
    have &amp;quot;q&amp;quot; using `p ∧ q` ..&lt;br /&gt;
    with `¬q` show False ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_48c:&lt;br /&gt;
  assumes &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 49. Demostrar&lt;br /&gt;
     ⊢ ¬(p ∧ ¬p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_49a:&lt;br /&gt;
  &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ ¬p&amp;quot;&lt;br /&gt;
  hence &amp;quot;p&amp;quot; ..&lt;br /&gt;
  have &amp;quot;¬ p&amp;quot; using `p ∧ ¬p` ..&lt;br /&gt;
  thus False using `p` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_49b:&lt;br /&gt;
  &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 50. Demostrar&lt;br /&gt;
     p ∧ ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_50:&lt;br /&gt;
  assumes &amp;quot;p ∧ ¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 51. Demostrar&lt;br /&gt;
     ¬¬p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_51a:&lt;br /&gt;
  assumes &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms by (rule notnotD)&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_51b:&lt;br /&gt;
  assumes &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 52. Demostrar&lt;br /&gt;
     ⊢ p ∨ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_52a:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬¬p ∨ ¬p&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;p ∨ ¬p&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_52b:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;p ∨ ¬p&amp;quot; by (rule ejercicio_27a)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_52c:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 53. Demostrar&lt;br /&gt;
     ⊢ ((p ⟶ q) ⟶ p) ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_53b:&lt;br /&gt;
  &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;(p ⟶ q) ⟶ p&amp;quot;&lt;br /&gt;
  show &amp;quot;p&amp;quot;&lt;br /&gt;
    proof (rule ccontr)&lt;br /&gt;
      assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      have &amp;quot;¬ (p ⟶ q)&amp;quot; using `(p ⟶ q) ⟶ p` `¬p` by (rule mt)&lt;br /&gt;
      have &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
      proof (rule impI)&lt;br /&gt;
        assume &amp;quot;p&amp;quot;&lt;br /&gt;
        show &amp;quot;q&amp;quot; using `¬p` `p` by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
      show False using `¬ (p ⟶ q)` `p ⟶ q` ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_53a:&lt;br /&gt;
  &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;(p ⟶ q) ⟶ p&amp;quot;&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;p&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    {assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      have &amp;quot;¬(p⟶ q)&amp;quot; using `(p ⟶ q) ⟶ p` `¬p` by (rule mt)&lt;br /&gt;
      have &amp;quot;p⟶ q&amp;quot;&lt;br /&gt;
        proof (rule impI)&lt;br /&gt;
          assume &amp;quot;p&amp;quot;&lt;br /&gt;
          show &amp;quot;q&amp;quot; using `¬p``p` by (rule notE)&lt;br /&gt;
        qed&lt;br /&gt;
      show &amp;quot;p&amp;quot; using `¬(p⟶ q)` `p⟶ q` by (rule notE)&lt;br /&gt;
    }&lt;br /&gt;
  next&lt;br /&gt;
    {assume &amp;quot;p&amp;quot;&lt;br /&gt;
     thus &amp;quot;p&amp;quot; .&lt;br /&gt;
   }&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_53c:&lt;br /&gt;
  &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 54. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_54:&lt;br /&gt;
  assumes &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  hence &amp;quot;¬¬p&amp;quot; by (rule notnotI)&lt;br /&gt;
  with assms have &amp;quot;¬¬q&amp;quot; by (rule mt)&lt;br /&gt;
  thus &amp;quot;q&amp;quot; by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 55. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_55a:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;p∨q&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      have &amp;quot;¬q ∨ q&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;p∨q&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
        with `¬p` have &amp;quot;¬p ∧ ¬q&amp;quot; by (rule conjI)&lt;br /&gt;
        with assms show &amp;quot;p∨q&amp;quot; by (rule notE)&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;q&amp;quot;&lt;br /&gt;
        thus &amp;quot;p ∨ q&amp;quot; ..&lt;br /&gt;
      qed&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      thus &amp;quot;p ∨q&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_55c:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 56. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_56a:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    show &amp;quot;p&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
      have &amp;quot;¬p ∨ p&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;p&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
        hence &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)&lt;br /&gt;
        with `¬(¬p ∨ ¬q)` show &amp;quot;p&amp;quot; by (rule notE)&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;q&amp;quot;&lt;br /&gt;
   proof -&lt;br /&gt;
      have &amp;quot;¬q ∨ q&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;q&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
        hence &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)&lt;br /&gt;
        with `¬(¬p ∨ ¬q)` show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;q&amp;quot; thus &amp;quot;q&amp;quot; .&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_56c:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 57. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_57a:&lt;br /&gt;
  assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨p&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    thus &amp;quot;¬p ∨ ¬q&amp;quot; ..&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;¬q ∨ q&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
        thus &amp;quot;¬p ∨ ¬q&amp;quot; ..&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;q&amp;quot;&lt;br /&gt;
        with `p` have &amp;quot;p∧q&amp;quot; by (rule conjI)&lt;br /&gt;
        with assms show &amp;quot;¬p ∨ ¬q&amp;quot; by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_57c:&lt;br /&gt;
  assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  using assms by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 58. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_58a:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
      proof (rule disjI1)&lt;br /&gt;
        show &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          proof&lt;br /&gt;
            assume &amp;quot;p&amp;quot;&lt;br /&gt;
            with `¬ p` show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
          qed&lt;br /&gt;
      qed&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
      proof (rule disjI2)&lt;br /&gt;
        show &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
        proof (rule impI)&lt;br /&gt;
          assume &amp;quot;q&amp;quot;&lt;br /&gt;
          show &amp;quot;p&amp;quot; using `p` .&lt;br /&gt;
        qed&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_58b:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; .. (* by (rule excluded_middle) *)&lt;br /&gt;
  thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
      proof (rule disjI1)&lt;br /&gt;
        show &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          proof&lt;br /&gt;
            assume &amp;quot;p&amp;quot;&lt;br /&gt;
            with `¬ p` show &amp;quot;q&amp;quot; .. (* by (rule notE) *)&lt;br /&gt;
          qed&lt;br /&gt;
      qed&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
      proof (rule disjI2)&lt;br /&gt;
        show &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
        proof (* (rule impI) *)&lt;br /&gt;
          assume &amp;quot;q&amp;quot;&lt;br /&gt;
          show &amp;quot;p&amp;quot; using `p` .&lt;br /&gt;
        qed&lt;br /&gt;
      qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_58c:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma ej_59: assumes &amp;quot;p ∧ ¬(q ⟶ r)&amp;quot;&lt;br /&gt;
             shows &amp;quot;(p ∧ q) ∧ ¬r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
   proof&lt;br /&gt;
     show &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
     next&lt;br /&gt;
     show &amp;quot;q&amp;quot;&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
       assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
       have &amp;quot;¬(q ⟶ r)&amp;quot; using assms ..&lt;br /&gt;
       have &amp;quot;q ⟶ r&amp;quot; &lt;br /&gt;
         proof&lt;br /&gt;
           assume &amp;quot;q&amp;quot; &lt;br /&gt;
           with `¬q` show &amp;quot;r&amp;quot; by (rule notE)&lt;br /&gt;
         qed&lt;br /&gt;
      with `¬(q ⟶ r)` show False ..&lt;br /&gt;
      qed&lt;br /&gt;
   qed&lt;br /&gt;
  next&lt;br /&gt;
  show &amp;quot;¬r&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
     assume &amp;quot;r&amp;quot;&lt;br /&gt;
     have &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
       proof&lt;br /&gt;
        assume &amp;quot;q&amp;quot; show &amp;quot;r&amp;quot; using `r` .&lt;br /&gt;
       qed&lt;br /&gt;
     have &amp;quot;¬(q ⟶ r)&amp;quot; using assms ..&lt;br /&gt;
     thus False using `q ⟶ r` ..&lt;br /&gt;
    qed&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma ej_60: &amp;quot;¬(s ∨ (p ⟶ q)) ⟶ p ∧ ¬q ∧ ¬s&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1:&amp;quot;¬(s ∨ (p ⟶ q))&amp;quot;&lt;br /&gt;
  show &amp;quot;p ∧ ¬q ∧ ¬s&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
     show &amp;quot;p&amp;quot;&lt;br /&gt;
       proof (rule ccontr)&lt;br /&gt;
         assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
         have &amp;quot;p ⟶q&amp;quot; &lt;br /&gt;
           proof&lt;br /&gt;
             assume &amp;quot;p&amp;quot; with `¬p` show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
           qed&lt;br /&gt;
         hence &amp;quot;s ∨ (p ⟶ q)&amp;quot; ..&lt;br /&gt;
         with 1 show False ..&lt;br /&gt;
       qed&lt;br /&gt;
     next &lt;br /&gt;
     show &amp;quot;¬q ∧ ¬s&amp;quot;&lt;br /&gt;
       proof&lt;br /&gt;
        show &amp;quot;¬q&amp;quot;&lt;br /&gt;
         proof&lt;br /&gt;
          assume &amp;quot;q&amp;quot;&lt;br /&gt;
          have &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
             proof&lt;br /&gt;
               assume &amp;quot;p&amp;quot; show &amp;quot;q&amp;quot; using `q` by this&lt;br /&gt;
             qed &lt;br /&gt;
         hence &amp;quot;s ∨ (p ⟶ q)&amp;quot; ..&lt;br /&gt;
         with 1 show False ..&lt;br /&gt;
        qed&lt;br /&gt;
        next&lt;br /&gt;
        show &amp;quot;¬s&amp;quot;&lt;br /&gt;
         proof&lt;br /&gt;
           assume &amp;quot;s&amp;quot; &lt;br /&gt;
           hence &amp;quot;s ∨ (p ⟶ q)&amp;quot; ..&lt;br /&gt;
         with 1 show False ..&lt;br /&gt;
         qed&lt;br /&gt;
       qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
             &lt;br /&gt;
lemma ejercicio_70:&lt;br /&gt;
  assumes &amp;quot;p ∧ q ⟶ r ∨ s&amp;quot;&lt;br /&gt;
          &amp;quot;q ⟶ ¬s&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;p ⟶ ¬q ∨ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;¬q ∨ r&amp;quot;&lt;br /&gt;
   proof-&lt;br /&gt;
   have &amp;quot;¬q ∨ q&amp;quot; ..&lt;br /&gt;
   thus &amp;quot;¬q ∨ r&amp;quot;&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
     assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
      thus   &amp;quot;¬q ∨ r&amp;quot; ..&lt;br /&gt;
     next&lt;br /&gt;
     assume &amp;quot;q&amp;quot;&lt;br /&gt;
     with `p` have &amp;quot;p ∧ q&amp;quot; ..&lt;br /&gt;
     with assms(1) have &amp;quot;r ∨ s&amp;quot; ..&lt;br /&gt;
     thus &amp;quot;¬q ∨ r&amp;quot;&lt;br /&gt;
       proof (rule disjE)&lt;br /&gt;
         assume &amp;quot;r&amp;quot; thus &amp;quot;¬q ∨ r&amp;quot; ..&lt;br /&gt;
         next&lt;br /&gt;
         assume &amp;quot;s&amp;quot;&lt;br /&gt;
         hence &amp;quot;¬¬s&amp;quot; by (rule notnotI)&lt;br /&gt;
         with assms(2) have &amp;quot;¬q&amp;quot; by (rule mt)&lt;br /&gt;
         thus &amp;quot;¬q ∨ r&amp;quot; ..&lt;br /&gt;
       qed&lt;br /&gt;
    qed&lt;br /&gt;
&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_71:&lt;br /&gt;
  assumes &amp;quot;∀x. (P(x) ⟶ Q(x))&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. (¬S(x) ⟶ ¬Q(x))&amp;quot;&lt;br /&gt;
          &amp;quot;¬ (∀x. S(x))&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃x. ¬P(x)&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
   assume 3: &amp;quot;¬ (∃x. ¬ P x)&amp;quot;&lt;br /&gt;
   have &amp;quot;∀x. S(x)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix a&lt;br /&gt;
      show &amp;quot;S(a)&amp;quot;&lt;br /&gt;
       proof (rule ccontr)&lt;br /&gt;
         assume 1:&amp;quot;¬ S a&amp;quot;&lt;br /&gt;
         have  &amp;quot;¬S(a) ⟶ ¬Q(a)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
         hence 2:&amp;quot;¬Q(a)&amp;quot; using 1 ..&lt;br /&gt;
         have &amp;quot;P(a) ⟶ Q(a)&amp;quot; using assms(1) ..&lt;br /&gt;
         hence &amp;quot;¬P(a)&amp;quot; using 2 by (rule mt)&lt;br /&gt;
         hence &amp;quot;∃x. ¬P(x)&amp;quot; ..&lt;br /&gt;
         with 3 show False ..&lt;br /&gt;
       qed&lt;br /&gt;
    qed&lt;br /&gt;
  with assms(3) show False ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=558</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=558"/>
		<updated>2019-04-09T10:49:01Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-18/ejercicios/ejercicios-LMF-2018-19.pdf libro de ejercicios].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R8&amp;diff=533</id>
		<title>R8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R8&amp;diff=533"/>
		<updated>2019-04-03T18:04:46Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R8: Argumentación en lógica de primer orden *}&lt;br /&gt;
&lt;br /&gt;
theory R8&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  El objetivo de esta relación es formalizar en lógica de primer orden&lt;br /&gt;
  argumentos expresados en lenguaje natural.&lt;br /&gt;
&lt;br /&gt;
  Antes de escribir la soluciones, comprobar con APLI2 la corrección de la formalización.&lt;br /&gt;
&lt;br /&gt;
  Una vez formalizadas, probar que el razonamiento es correcto, o refutarlo mediante un contraejemplo. &lt;br /&gt;
  &lt;br /&gt;
  Las demostraciones pueden hacerse usando Isar o tácticas de prueba.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Formalizar el siguiente argumento&lt;br /&gt;
     Hay estudiantes inteligentes y hay estudiantes trabajadores. Por&lt;br /&gt;
     tanto, hay estudiantes inteligentes y trabajadores.&lt;br /&gt;
  Usar I(x) para x es inteligente&lt;br /&gt;
       T(x) para x es trabajador&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Formalizar el siguiente argumento&lt;br /&gt;
     Todos los participantes son vencedores. Hay como máximo un&lt;br /&gt;
     vencedor. Hay como máximo un participante. Por lo tanto, hay&lt;br /&gt;
     exactamente un participante. &lt;br /&gt;
  Usar P(x) para x es un participante&lt;br /&gt;
       V(x) para x es un vencedor&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Formalizar el siguiente argumento&lt;br /&gt;
     Ningún aristócrata debe ser condenado a galeras a menos que sus&lt;br /&gt;
     crímenes sean vergonzosos y lleve una vida licenciosa. En la ciudad&lt;br /&gt;
     hay aristócratas que han cometido crímenes vergonzosos aunque su&lt;br /&gt;
     forma de vida no sea licenciosa. Por tanto, hay algún aristócrata&lt;br /&gt;
     que no está condenado a galeras. &lt;br /&gt;
  Usar A(x)  para x es aristócrata&lt;br /&gt;
       G(x)  para x está condenado a galeras&lt;br /&gt;
       L(x)  para x lleva una vida licenciosa&lt;br /&gt;
       V(x)  para x ha cometido crímenes vergonzoso&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Formalizar el siguiente argumento&lt;br /&gt;
     Todos los robots obedecen a los amigos del programador jefe.&lt;br /&gt;
     Alvaro es amigo del programador jefe, pero Benito no le&lt;br /&gt;
     obedece. Por tanto, Benito no es un robot.&lt;br /&gt;
  Usar R(x)    para x es un robot&lt;br /&gt;
       Ob(x,y) para x obedece a y&lt;br /&gt;
       A(x)    para x es amigo del programador jefe&lt;br /&gt;
       b       para Benito&lt;br /&gt;
       a       para Alvaro&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Formalizar el siguiente argumento&lt;br /&gt;
     Ningún socio del club está en deuda con el tesorero del club. Si&lt;br /&gt;
     un socio del club no paga su cuota está en deuda con el tesorero&lt;br /&gt;
     del club. Por tanto, si el tesorero del club es socio del club,&lt;br /&gt;
     entonces paga su cuota. &lt;br /&gt;
  Usar P(x) para x es socio del club&lt;br /&gt;
       Q(x) para x paga su cuota&lt;br /&gt;
       R(x) para x está en deuda con el tesorero&lt;br /&gt;
       a    para el tesorero del club&lt;br /&gt;
   ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Formalizar el siguiente argumento&lt;br /&gt;
     Los aficionados al fútbol aplauden a cualquier futbolista&lt;br /&gt;
     extranjero. Juanito no aplaude a futbolistas extranjeros. Por&lt;br /&gt;
     tanto, si hay algún futbolista extranjero nacionalizado español,&lt;br /&gt;
     Juanito no es aficionado al fútbol.&lt;br /&gt;
  Usar Af(x)   para x es aficicionado al fútbol&lt;br /&gt;
       Ap(x,y) para x aplaude a y&lt;br /&gt;
       E(x)    para x es un futbolista extranjero&lt;br /&gt;
       N(x)    para x es un futbolista nacionalizado español&lt;br /&gt;
       j       para Juanito&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Formalizar el siguiente argumento&lt;br /&gt;
     Todo aquel que entre en el país y no sea un VIP será cacheado por&lt;br /&gt;
     un aduanero. Hay un contrabandista que entra en el país y que solo&lt;br /&gt;
     podrá ser cacheado por contrabandistas. Ningún contrabandista es un&lt;br /&gt;
     VIP. Por tanto, algún aduanero es contrabandista.&lt;br /&gt;
  Usar A(x)    para x es aduanero&lt;br /&gt;
       Ca(x,y) para x cachea a y&lt;br /&gt;
       Co(x)   para x es contrabandista&lt;br /&gt;
       E(x)    para x entra en el pais&lt;br /&gt;
       V(x)    para x es un VIP&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
section {* Ejercicios con igualdad *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Formalizar el siguiente argumento &lt;br /&gt;
     Rosa ama a Curro. Paco no simpatiza con Ana. Quien no simpatiza con&lt;br /&gt;
     Ana ama a Rosa. Si una persona ama a otra, la segunda ama a la&lt;br /&gt;
     primera. Hay como máximo una persona que ama a Rosa. Por tanto,&lt;br /&gt;
     Paco es Curro. &lt;br /&gt;
  Usar A(x,y) para x ama a y &lt;br /&gt;
       S(x,y) para x simpatiza con y &lt;br /&gt;
       a      para Ana&lt;br /&gt;
       c      para Curro&lt;br /&gt;
       p      para Paco &lt;br /&gt;
       r      para Rosa&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Formalizar el siguiente argumento &lt;br /&gt;
     Todos los filósofos se han preguntado qué es la filosofía. Los que&lt;br /&gt;
     se preguntan qué es la filosofía se vuelven locos. Nietzsche es&lt;br /&gt;
     filósofo. El maestro de Nietzsche no acabó loco. Por tanto,&lt;br /&gt;
     Nietzsche y su maestro son diferentes personas. &lt;br /&gt;
  Usar F(x) para x es filósofo&lt;br /&gt;
       L(x) para x se vuelve loco&lt;br /&gt;
       P(x) para x se ha preguntado qué es la filosofía.&lt;br /&gt;
       m    para el maestro de Nietzsche&lt;br /&gt;
       n    para Nietzsche&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Formalizar el siguiente argumento &lt;br /&gt;
     Eduardo pudo haber visto al asesino. Antonio fue el primer testigo&lt;br /&gt;
     de la defensa. O Eduardo estaba en clase o Antonio dio falso&lt;br /&gt;
     testimonio. Nadie en clase pudo haber visto al asesino. Luego, el&lt;br /&gt;
     primer testigo de la defensa dio falso testimonio. &lt;br /&gt;
  Usar C(x) para x estaba en clase&lt;br /&gt;
       F(x) para x dio falso testimonio&lt;br /&gt;
       V(x) para x pudo haber visto al asesino&lt;br /&gt;
       a    para Antonio&lt;br /&gt;
       e    para Eduardo&lt;br /&gt;
       p    para el primer testigo de la defensa&lt;br /&gt;
   ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R8&amp;diff=532</id>
		<title>R8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R8&amp;diff=532"/>
		<updated>2019-04-03T18:04:33Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R8: Argumentación en lógica de primer orden *}&lt;br /&gt;
&lt;br /&gt;
theory R8&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  El objetivo de esta relación es formalizar en lógica de primer orden&lt;br /&gt;
  argumentos expresados en lenguaje natural.&lt;br /&gt;
&lt;br /&gt;
  Antes de escribir la soluciones, comprobar con APLI2 la corrección de la formalización.&lt;br /&gt;
&lt;br /&gt;
  Una vez formalizadas, probar que el razonamiento es correcto, o refutarlo mediante un contraejemplo. &lt;br /&gt;
  &lt;br /&gt;
  Las demostraciones pueden hacerse usando Isar o tácticas de prueba.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Formalizar el siguiente argumento&lt;br /&gt;
     Hay estudiantes inteligentes y hay estudiantes trabajadores. Por&lt;br /&gt;
     tanto, hay estudiantes inteligentes y trabajadores.&lt;br /&gt;
  Usar I(x) para x es inteligente&lt;br /&gt;
       T(x) para x es trabajador&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Formalizar el siguiente argumento&lt;br /&gt;
     Todos los participantes son vencedores. Hay como máximo un&lt;br /&gt;
     vencedor. Hay como máximo un participante. Por lo tanto, hay&lt;br /&gt;
     exactamente un participante. &lt;br /&gt;
  Usar P(x) para x es un participante&lt;br /&gt;
       V(x) para x es un vencedor&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Formalizar el siguiente argumento&lt;br /&gt;
     Ningún aristócrata debe ser condenado a galeras a menos que sus&lt;br /&gt;
     crímenes sean vergonzosos y lleve una vida licenciosa. En la ciudad&lt;br /&gt;
     hay aristócratas que han cometido crímenes vergonzosos aunque su&lt;br /&gt;
     forma de vida no sea licenciosa. Por tanto, hay algún aristócrata&lt;br /&gt;
     que no está condenado a galeras. &lt;br /&gt;
  Usar A(x)  para x es aristócrata&lt;br /&gt;
       G(x)  para x está condenado a galeras&lt;br /&gt;
       L(x)  para x lleva una vida licenciosa&lt;br /&gt;
       V(x)  para x ha cometido crímenes vergonzoso&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Formalizar el siguiente argumento&lt;br /&gt;
     Todos los robots obedecen a los amigos del programador jefe.&lt;br /&gt;
     Alvaro es amigo del programador jefe, pero Benito no le&lt;br /&gt;
     obedece. Por tanto, Benito no es un robot.&lt;br /&gt;
  Usar R(x)    para x es un robot&lt;br /&gt;
       Ob(x,y) para x obedece a y&lt;br /&gt;
       A(x)    para x es amigo del programador jefe&lt;br /&gt;
       b       para Benito&lt;br /&gt;
       a       para Alvaro&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Formalizar el siguiente argumento&lt;br /&gt;
     Ningún socio del club está en deuda con el tesorero del club. Si&lt;br /&gt;
     un socio del club no paga su cuota está en deuda con el tesorero&lt;br /&gt;
     del club. Por tanto, si el tesorero del club es socio del club,&lt;br /&gt;
     entonces paga su cuota. &lt;br /&gt;
  Usar P(x) para x es socio del club&lt;br /&gt;
       Q(x) para x paga su cuota&lt;br /&gt;
       R(x) para x está en deuda con el tesorero&lt;br /&gt;
       a    para el tesorero del club&lt;br /&gt;
   ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Formalizar el siguiente argumento&lt;br /&gt;
     Los aficionados al fútbol aplauden a cualquier futbolista&lt;br /&gt;
     extranjero. Juanito no aplaude a futbolistas extranjeros. Por&lt;br /&gt;
     tanto, si hay algún futbolista extranjero nacionalizado español,&lt;br /&gt;
     Juanito no es aficionado al fútbol.&lt;br /&gt;
  Usar Af(x)   para x es aficicionado al fútbol&lt;br /&gt;
       Ap(x,y) para x aplaude a y&lt;br /&gt;
       E(x)    para x es un futbolista extranjero&lt;br /&gt;
       N(x)    para x es un futbolista nacionalizado español&lt;br /&gt;
       j       para Juanito&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Formalizar el siguiente argumento&lt;br /&gt;
     Todo aquel que entre en el país y no sea un VIP será cacheado por&lt;br /&gt;
     un aduanero. Hay un contrabandista que entra en el país y que solo&lt;br /&gt;
     podrá ser cacheado por contrabandistas. Ningún contrabandista es un&lt;br /&gt;
     VIP. Por tanto, algún aduanero es contrabandista.&lt;br /&gt;
  Usar A(x)    para x es aduanero&lt;br /&gt;
       Ca(x,y) para x cachea a y&lt;br /&gt;
       Co(x)   para x es contrabandista&lt;br /&gt;
       E(x)    para x entra en el pais&lt;br /&gt;
       V(x)    para x es un VIP&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
section {* Ejercicios con igualdad *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Formalizar el siguiente argumento &lt;br /&gt;
     Rosa ama a Curro. Paco no simpatiza con Ana. Quien no simpatiza con&lt;br /&gt;
     Ana ama a Rosa. Si una persona ama a otra, la segunda ama a la&lt;br /&gt;
     primera. Hay como máximo una persona que ama a Rosa. Por tanto,&lt;br /&gt;
     Paco es Curro. &lt;br /&gt;
  Usar A(x,y) para x ama a y &lt;br /&gt;
       S(x,y) para x simpatiza con y &lt;br /&gt;
       a      para Ana&lt;br /&gt;
       c      para Curro&lt;br /&gt;
       p      para Paco &lt;br /&gt;
       r      para Rosa&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Formalizar el siguiente argumento &lt;br /&gt;
     Todos los filósofos se han preguntado qué es la filosofía. Los que&lt;br /&gt;
     se preguntan qué es la filosofía se vuelven locos. Nietzsche es&lt;br /&gt;
     filósofo. El maestro de Nietzsche no acabó loco. Por tanto,&lt;br /&gt;
     Nietzsche y su maestro son diferentes personas. &lt;br /&gt;
  Usar F(x) para x es filósofo&lt;br /&gt;
       L(x) para x se vuelve loco&lt;br /&gt;
       P(x) para x se ha preguntado qué es la filosofía.&lt;br /&gt;
       m    para el maestro de Nietzsche&lt;br /&gt;
       n    para Nietzsche&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Formalizar el siguiente argumento &lt;br /&gt;
     Eduardo pudo haber visto al asesino. Antonio fue el primer testigo&lt;br /&gt;
     de la defensa. O Eduardo estaba en clase o Antonio dio falso&lt;br /&gt;
     testimonio. Nadie en clase pudo haber visto al asesino. Luego, el&lt;br /&gt;
     primer testigo de la defensa dio falso testimonio. &lt;br /&gt;
  Usar C(x) para x estaba en clase&lt;br /&gt;
       F(x) para x dio falso testimonio&lt;br /&gt;
       V(x) para x pudo haber visto al asesino&lt;br /&gt;
       a    para Antonio&lt;br /&gt;
       e    para Eduardo&lt;br /&gt;
       p    para el primer testigo de la defensa&lt;br /&gt;
   ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=531</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Ejercicios&amp;diff=531"/>
		<updated>2019-04-03T18:02:34Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-18/ejercicios/ejercicios-LMF-2018-19.pdf libro de ejercicios].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]] y [[Relación 4 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]] y [[Relación  |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]] y [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]] y [[Relación 8 |Solución colaborativa]]).&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R7&amp;diff=500</id>
		<title>R7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R7&amp;diff=500"/>
		<updated>2019-03-28T12:29:39Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
theory R7&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  El objetivo de esta relación es escribir demostraciones usando sólo&lt;br /&gt;
  las reglas básicas de deducción natural de la lógica proposicional y&lt;br /&gt;
  los métodos rule, erule, frule, drule y assumption.&lt;br /&gt;
&lt;br /&gt;
  Las reglas básicas de la deducción natural son las siguientes:&lt;br /&gt;
  · conjI:          ⟦P; Q⟧ ⟹ P ∧ Q&lt;br /&gt;
  · conjunct1:      P ∧ Q ⟹ P&lt;br /&gt;
  · conjunct2:      P ∧ Q ⟹ Q&lt;br /&gt;
  · conjE:          ⟦P ∧ Q; ⟦P; Q⟧ ⟹ R⟧ ⟹ R&lt;br /&gt;
  · notE:           ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  · notI:           (P ⟹ False) ⟹ ¬P&lt;br /&gt;
  · mp:             ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
  · mt:             ⟦F ⟶ G; ¬G⟧ ⟹ ¬F &lt;br /&gt;
  · impI:           (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
  · impE:           ⟦P ⟶ Q; P; Q ⟹ R⟧ ⟹ R&lt;br /&gt;
  · disjI1:         P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2:         Q ⟹ P ∨ Q&lt;br /&gt;
  · disjE:          ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R &lt;br /&gt;
  · FalseE:         False ⟹ P&lt;br /&gt;
  · iffI:           ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P = Q&lt;br /&gt;
  · iffD1:          ⟦Q = P; Q⟧ ⟹ P &lt;br /&gt;
  · iffD2:          ⟦P = Q; Q⟧ ⟹ P&lt;br /&gt;
  · iffE:           ⟦P = Q; ⟦P ⟶ Q; Q ⟶ P⟧ ⟹ R⟧ ⟹ R&lt;br /&gt;
  · notnotD:        ¬¬ P ⟹ P&lt;br /&gt;
  · not_not:        P = ¬¬P&lt;br /&gt;
  · ccontr:         (¬P ⟹ False) ⟹ P&lt;br /&gt;
  · excluded_midle: ¬P ∨ P&lt;br /&gt;
  · classical:      (¬ P ⟹ P) ⟹ P&lt;br /&gt;
  · contrapos_nn    ⟦¬Q; P ⟹ Q⟧ ⟹ ¬P&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Implicaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       p ⟶ q, p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej1: &amp;quot;⟦p ⟶ q; p⟧ ⟹ q&amp;quot; &lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej2: &amp;quot;⟦p ⟶ q; q ⟶ r; p⟧ ⟹ r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r), p ⟶ q, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej3a: &amp;quot;⟦p ⟶ (q ⟶ r); p ⟶ q; p⟧ ⟹ r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma ej3b: &amp;quot;⟦p ⟶ (q ⟶ r); p ⟶ q; p⟧ ⟹ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r ⊢ p ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ej4: &amp;quot;⟦p ⟶ q; q ⟶ r⟧ ⟹ p ⟶ r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ q ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej5: &amp;quot;p ⟶ (q ⟶ r) ⟹ q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ (p ⟶ q) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej6: &amp;quot;p ⟶ (q ⟶ r) ⟹ (p ⟶ q) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar&lt;br /&gt;
     p ⊢ q ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej7: &amp;quot;p ⟹ q ⟶ p&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar&lt;br /&gt;
     ⊢ p ⟶ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej8: &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ (q ⟶ r) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej9: &amp;quot;p ⟶ q ⟹ (q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ (r ⟶ s)) ⊢ r ⟶ (q ⟶ (p ⟶ s))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej10: &amp;quot;p ⟶ (q ⟶ (r ⟶ s)) ⟹ r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej11: &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej12: &amp;quot;(p ⟶ q) ⟶ r ⟹ p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
  &lt;br /&gt;
section {* Conjunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar&lt;br /&gt;
     p, q ⊢  p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej13: &amp;quot;⟦p; q⟧ ⟹ p ∧ q&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej14: &amp;quot;p ∧ q ⟹ p&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar&lt;br /&gt;
     p ∧ q ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej15: &amp;quot;p ∧ q ⟹ q&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar&lt;br /&gt;
     p ∧ (q ∧ r) ⊢ (p ∧ q) ∧ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej16: &amp;quot;p ∧ (q ∧ r) ⟹ (p ∧ q) ∧ r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar&lt;br /&gt;
     (p ∧ q) ∧ r ⊢ p ∧ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej17: &amp;quot;(p ∧ q) ∧ r ⟹ p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej18: &amp;quot;p ∧ q ⟹ p ⟶ q&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar&lt;br /&gt;
     (p ⟶ q) ∧ (p ⟶ r) ⊢ p ⟶ q ∧ r   &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej19: &amp;quot;(p ⟶ q) ∧ (p ⟶ r) ⟹ p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar&lt;br /&gt;
     p ⟶ q ∧ r ⊢ (p ⟶ q) ∧ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej20: &amp;quot;p ⟶ q ∧ r ⟹ (p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej21_1: &amp;quot;p ⟶ (q ⟶ r) ⟹ p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar&lt;br /&gt;
     p ∧ q ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej22: &amp;quot;p ∧ q ⟶ r ⟹ p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej23: &amp;quot;(p ⟶ q) ⟶ r ⟹ p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar&lt;br /&gt;
     p ∧ (q ⟶ r) ⊢ (p ⟶ q) ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej24: &amp;quot;p ∧ (q ⟶ r) ⟹ (p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
section {* Disyunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar&lt;br /&gt;
     p ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej25: &amp;quot;p ⟹ p ∨ q&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar&lt;br /&gt;
     q ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej26: &amp;quot;q ⟹ p ∨ q&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar&lt;br /&gt;
     p ∨ q ⊢ q ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej27: &amp;quot;p ∨ q ⟹ q ∨ p&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 28. Demostrar&lt;br /&gt;
     q ⟶ r ⊢ p ∨ q ⟶ p ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej28: &amp;quot;q ⟶ r ⟹ p ∨ q ⟶ p ∨ r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 29. Demostrar&lt;br /&gt;
     p ∨ p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej29: &amp;quot;p ∨ p ⟹ p&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 30. Demostrar&lt;br /&gt;
     p ⊢ p ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej30: &amp;quot;p ⟹ p ∨ p&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 31. Demostrar&lt;br /&gt;
     p ∨ (q ∨ r) ⊢ (p ∨ q) ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej31: &amp;quot;p ∨ (q ∨ r) ⟹ (p ∨ q) ∨ r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 32. Demostrar&lt;br /&gt;
     (p ∨ q) ∨ r ⊢ p ∨ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej32: &amp;quot;(p ∨ q) ∨ r ⟹ p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 33. Demostrar&lt;br /&gt;
     p ∧ (q ∨ r) ⊢ (p ∧ q) ∨ (p ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej33: &amp;quot;p ∧ (q ∨ r) ⟹ (p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 34. Demostrar&lt;br /&gt;
     (p ∧ q) ∨ (p ∧ r) ⊢ p ∧ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej34: &amp;quot;(p ∧ q) ∨ (p ∧ r) ⟹ p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 35. Demostrar&lt;br /&gt;
     p ∨ (q ∧ r) ⊢ (p ∨ q) ∧ (p ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej35: &amp;quot;p ∨ (q ∧ r) ⟹ (p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 36. Demostrar&lt;br /&gt;
     (p ∨ q) ∧ (p ∨ r) ⊢ p ∨ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej36: &amp;quot;(p ∨ q) ∧ (p ∨ r) ⟹ p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 37. Demostrar&lt;br /&gt;
     (p ⟶ r) ∧ (q ⟶ r) ⊢ p ∨ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej37: &amp;quot;(p ⟶ r) ∧ (q ⟶ r) ⟹ p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 38. Demostrar&lt;br /&gt;
     p ∨ q ⟶ r ⊢ (p ⟶ r) ∧ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej38: &amp;quot;p ∨ q ⟶ r ⟹ (p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
section {* Negación *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 39. Demostrar&lt;br /&gt;
     p ⊢ ¬¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej39: &amp;quot;p ⟹ ¬¬p&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 40. Demostrar&lt;br /&gt;
     ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej40: &amp;quot;¬p ⟹ p ⟶ q&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 41. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ ¬q ⟶ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej41: &amp;quot;p ⟶ q ⟹ ¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 42. Demostrar&lt;br /&gt;
     p ∨ q, ¬q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej42: &amp;quot;⟦p ∨ q; ¬q⟧ ⟹ p&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 43. Demostrar&lt;br /&gt;
     p ∨ q, ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej43: &amp;quot;⟦p ∨ q; ¬p⟧ ⟹ q&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 44. Demostrar&lt;br /&gt;
     p ∨ q ⊢ ¬(¬p ∧ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej44: &amp;quot;p ∨ q ⟹ ¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 45. Demostrar&lt;br /&gt;
     p ∧ q ⊢ ¬(¬p ∨ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej45: &amp;quot;p ∧ q ⟹ ¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 46. Demostrar&lt;br /&gt;
     ¬(p ∨ q) ⊢ ¬p ∧ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej46: &amp;quot;¬(p ∨ q) ⟹ ¬p ∧ ¬q&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 47. Demostrar&lt;br /&gt;
     ¬p ∧ ¬q ⊢ ¬(p ∨ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej47: &amp;quot;¬p ∧ ¬q ⟹ ¬(p ∨ q)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 48. Demostrar&lt;br /&gt;
     ¬p ∨ ¬q ⊢ ¬(p ∧ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej48: &amp;quot;¬p ∨ ¬q ⟹ ¬(p ∧ q)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 49. Demostrar&lt;br /&gt;
     ⊢ ¬(p ∧ ¬p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej49: &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 50. Demostrar&lt;br /&gt;
     p ∧ ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej50: &amp;quot;p ∧ ¬p ⟹ q&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 51. Demostrar&lt;br /&gt;
     ¬¬p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej51: &amp;quot;¬¬p ⟹ p&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 52. Demostrar&lt;br /&gt;
     ⊢ p ∨ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej52: &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 53. Demostrar&lt;br /&gt;
     ⊢ ((p ⟶ q) ⟶ p) ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej53: &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 54. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej54: &amp;quot;¬q ⟶ ¬p ⟹ p ⟶ q&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 55. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej55: &amp;quot;¬(¬p ∧ ¬q) ⟹ p ∨ q&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 56. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej56: &amp;quot;¬(¬p ∨ ¬q) ⟹ p ∧ q&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 57. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej57: &amp;quot;¬(p ∧ q) ⟹ ¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 58. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ej58: &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R7&amp;diff=498</id>
		<title>R7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R7&amp;diff=498"/>
		<updated>2019-03-28T11:07:02Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R4: Deducción natural proposicional con tácticas *}&lt;br /&gt;
&lt;br /&gt;
theory R7&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
   El objetivo de esta relación es escribir demostraciones usando sólo&lt;br /&gt;
  las reglas básicas de deducción natural de la lógica proposicional y&lt;br /&gt;
  los métodos rule, erule, frule, drule y assumption.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  Las reglas básicas de la deducción natural son las siguientes:&lt;br /&gt;
  · conjI:      ⟦P; Q⟧ ⟹ P ∧ Q&lt;br /&gt;
  · conjunct1:  P ∧ Q ⟹ P&lt;br /&gt;
  · conjunct2:  P ∧ Q ⟹ Q  &lt;br /&gt;
  · notnotD:    ¬¬ P ⟹ P&lt;br /&gt;
  · notnotI:    P ⟹ ¬¬ P&lt;br /&gt;
  · mp:         ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
  · mt:         ⟦F ⟶ G; ¬G⟧ ⟹ ¬F &lt;br /&gt;
  · impI:       (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
  · disjI1:     P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2:     Q ⟹ P ∨ Q&lt;br /&gt;
  · disjE:      ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R &lt;br /&gt;
  · FalseE:     False ⟹ P&lt;br /&gt;
  · notE:       ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  · notI:       (P ⟹ False) ⟹ ¬P&lt;br /&gt;
  · iffI:       ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P = Q&lt;br /&gt;
  · iffD1:      ⟦Q = P; Q⟧ ⟹ P &lt;br /&gt;
  · iffD2:      ⟦P = Q; Q⟧ ⟹ P&lt;br /&gt;
  · ccontr:     (¬P ⟹ False) ⟹ P&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI y mt que demostramos a continuación. *}&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
section {* Implicaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       p ⟶ q, p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot; &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r), p ⟶ q, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
          &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r ⊢ p ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;q ⟶ r&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ q ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ (p ⟶ q) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar&lt;br /&gt;
     p ⊢ q ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar&lt;br /&gt;
     ⊢ p ⟶ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8:&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ (q ⟶ r) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ (r ⟶ s)) ⊢ r ⟶ (q ⟶ (p ⟶ s))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ (r ⟶ s))&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_11:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_12:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
section {* Conjunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar&lt;br /&gt;
     p, q ⊢  p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
          &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_14:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar&lt;br /&gt;
     p ∧ q ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_15:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar&lt;br /&gt;
     p ∧ (q ∧ r) ⊢ (p ∧ q) ∧ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∧ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar&lt;br /&gt;
     (p ∧ q) ∧ r ⊢ p ∧ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_17:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar&lt;br /&gt;
     (p ⟶ q) ∧ (p ⟶ r) ⊢ p ⟶ q ∧ r   &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_19:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar&lt;br /&gt;
     p ⟶ q ∧ r ⊢ (p ⟶ q) ∧ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_20:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar&lt;br /&gt;
     p ∧ q ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_22:&lt;br /&gt;
  assumes &amp;quot;p ∧ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_23:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar&lt;br /&gt;
     p ∧ (q ⟶ r) ⊢ (p ⟶ q) ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_24:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
section {* Disyunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar&lt;br /&gt;
     p ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_25:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar&lt;br /&gt;
     q ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_26:&lt;br /&gt;
  assumes &amp;quot;q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar&lt;br /&gt;
     p ∨ q ⊢ q ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_27:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 28. Demostrar&lt;br /&gt;
     q ⟶ r ⊢ p ∨ q ⟶ p ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_28:&lt;br /&gt;
  assumes &amp;quot;q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ p ∨ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 29. Demostrar&lt;br /&gt;
     p ∨ p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_29:&lt;br /&gt;
  assumes &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 30. Demostrar&lt;br /&gt;
     p ⊢ p ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_30:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 31. Demostrar&lt;br /&gt;
     p ∨ (q ∨ r) ⊢ (p ∨ q) ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_31:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∨ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 32. Demostrar&lt;br /&gt;
     (p ∨ q) ∨ r ⊢ p ∨ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_32:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∨ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 33. Demostrar&lt;br /&gt;
     p ∧ (q ∨ r) ⊢ (p ∧ q) ∨ (p ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_33:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 34. Demostrar&lt;br /&gt;
     (p ∧ q) ∨ (p ∧ r) ⊢ p ∧ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_34:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 35. Demostrar&lt;br /&gt;
     p ∨ (q ∧ r) ⊢ (p ∨ q) ∧ (p ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_35:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 36. Demostrar&lt;br /&gt;
     (p ∨ q) ∧ (p ∨ r) ⊢ p ∨ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_36:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 37. Demostrar&lt;br /&gt;
     (p ⟶ r) ∧ (q ⟶ r) ⊢ p ∨ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_37:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 38. Demostrar&lt;br /&gt;
     p ∨ q ⟶ r ⊢ (p ⟶ r) ∧ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_38:&lt;br /&gt;
  assumes &amp;quot;p ∨ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
section {* Negaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 39. Demostrar&lt;br /&gt;
     p ⊢ ¬¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_39:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 40. Demostrar&lt;br /&gt;
     ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_40:&lt;br /&gt;
  assumes &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 41. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ ¬q ⟶ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_41:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 42. Demostrar&lt;br /&gt;
     p∨q, ¬q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_42:&lt;br /&gt;
  assumes &amp;quot;p∨q&amp;quot;&lt;br /&gt;
          &amp;quot;¬q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 42. Demostrar&lt;br /&gt;
     p ∨ q, ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_43:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 40. Demostrar&lt;br /&gt;
     p ∨ q ⊢ ¬(¬p ∧ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_44:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 45. Demostrar&lt;br /&gt;
     p ∧ q ⊢ ¬(¬p ∨ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_45:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 46. Demostrar&lt;br /&gt;
     ¬(p ∨ q) ⊢ ¬p ∧ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_46:&lt;br /&gt;
  assumes &amp;quot;¬(p ∨ q)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 47. Demostrar&lt;br /&gt;
     ¬p ∧ ¬q ⊢ ¬(p ∨ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_47:&lt;br /&gt;
  assumes &amp;quot;¬p ∧ ¬q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(p ∨ q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 48. Demostrar&lt;br /&gt;
     ¬p ∨ ¬q ⊢ ¬(p ∧ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_48:&lt;br /&gt;
  assumes &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 49. Demostrar&lt;br /&gt;
     ⊢ ¬(p ∧ ¬p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_49:&lt;br /&gt;
  &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 50. Demostrar&lt;br /&gt;
     p ∧ ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_50:&lt;br /&gt;
  assumes &amp;quot;p ∧ ¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 51. Demostrar&lt;br /&gt;
     ¬¬p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_51:&lt;br /&gt;
  assumes &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 52. Demostrar&lt;br /&gt;
     ⊢ p ∨ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_52:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 53. Demostrar&lt;br /&gt;
     ⊢ ((p ⟶ q) ⟶ p) ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_53:&lt;br /&gt;
  &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 54. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_54:&lt;br /&gt;
  assumes &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 55. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_55:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 56. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_56:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 57. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_57:&lt;br /&gt;
  assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 58. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_58:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R7&amp;diff=497</id>
		<title>R7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R7&amp;diff=497"/>
		<updated>2019-03-28T11:06:51Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R4: Deducción natural proposicional con tácticas *}&lt;br /&gt;
&lt;br /&gt;
theory R7&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
   El objetivo de esta relación es escribir demostraciones usando sólo&lt;br /&gt;
  las reglas básicas de deducción natural de la lógica proposicional y&lt;br /&gt;
  los métodos rule, erule, frule, drule y assumption.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  Las reglas básicas de la deducción natural son las siguientes:&lt;br /&gt;
  · conjI:      ⟦P; Q⟧ ⟹ P ∧ Q&lt;br /&gt;
  · conjunct1:  P ∧ Q ⟹ P&lt;br /&gt;
  · conjunct2:  P ∧ Q ⟹ Q  &lt;br /&gt;
  · notnotD:    ¬¬ P ⟹ P&lt;br /&gt;
  · notnotI:    P ⟹ ¬¬ P&lt;br /&gt;
  · mp:         ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
  · mt:         ⟦F ⟶ G; ¬G⟧ ⟹ ¬F &lt;br /&gt;
  · impI:       (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
  · disjI1:     P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2:     Q ⟹ P ∨ Q&lt;br /&gt;
  · disjE:      ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R &lt;br /&gt;
  · FalseE:     False ⟹ P&lt;br /&gt;
  · notE:       ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  · notI:       (P ⟹ False) ⟹ ¬P&lt;br /&gt;
  · iffI:       ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P = Q&lt;br /&gt;
  · iffD1:      ⟦Q = P; Q⟧ ⟹ P &lt;br /&gt;
  · iffD2:      ⟦P = Q; Q⟧ ⟹ P&lt;br /&gt;
  · ccontr:     (¬P ⟹ False) ⟹ P&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI y mt que demostramos a continuación. *}&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
section {* Implicaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       p ⟶ q, p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot; &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r), p ⟶ q, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
          &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r ⊢ p ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;q ⟶ r&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ q ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ (p ⟶ q) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar&lt;br /&gt;
     p ⊢ q ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar&lt;br /&gt;
     ⊢ p ⟶ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8:&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ (q ⟶ r) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ (r ⟶ s)) ⊢ r ⟶ (q ⟶ (p ⟶ s))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ (r ⟶ s))&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_11:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_12:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
section {* Conjunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar&lt;br /&gt;
     p, q ⊢  p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
          &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_14:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar&lt;br /&gt;
     p ∧ q ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_15:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar&lt;br /&gt;
     p ∧ (q ∧ r) ⊢ (p ∧ q) ∧ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∧ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar&lt;br /&gt;
     (p ∧ q) ∧ r ⊢ p ∧ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_17:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar&lt;br /&gt;
     (p ⟶ q) ∧ (p ⟶ r) ⊢ p ⟶ q ∧ r   &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_19:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar&lt;br /&gt;
     p ⟶ q ∧ r ⊢ (p ⟶ q) ∧ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_20:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar&lt;br /&gt;
     p ∧ q ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_22:&lt;br /&gt;
  assumes &amp;quot;p ∧ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_23:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar&lt;br /&gt;
     p ∧ (q ⟶ r) ⊢ (p ⟶ q) ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_24:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
section {* Disyunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar&lt;br /&gt;
     p ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_25:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar&lt;br /&gt;
     q ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_26:&lt;br /&gt;
  assumes &amp;quot;q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar&lt;br /&gt;
     p ∨ q ⊢ q ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_27:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 28. Demostrar&lt;br /&gt;
     q ⟶ r ⊢ p ∨ q ⟶ p ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_28:&lt;br /&gt;
  assumes &amp;quot;q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ p ∨ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 29. Demostrar&lt;br /&gt;
     p ∨ p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_29:&lt;br /&gt;
  assumes &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 30. Demostrar&lt;br /&gt;
     p ⊢ p ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_30:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 31. Demostrar&lt;br /&gt;
     p ∨ (q ∨ r) ⊢ (p ∨ q) ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_31:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∨ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 32. Demostrar&lt;br /&gt;
     (p ∨ q) ∨ r ⊢ p ∨ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_32:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∨ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 33. Demostrar&lt;br /&gt;
     p ∧ (q ∨ r) ⊢ (p ∧ q) ∨ (p ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_33:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 34. Demostrar&lt;br /&gt;
     (p ∧ q) ∨ (p ∧ r) ⊢ p ∧ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_34:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 35. Demostrar&lt;br /&gt;
     p ∨ (q ∧ r) ⊢ (p ∨ q) ∧ (p ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_35:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 36. Demostrar&lt;br /&gt;
     (p ∨ q) ∧ (p ∨ r) ⊢ p ∨ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_36:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 37. Demostrar&lt;br /&gt;
     (p ⟶ r) ∧ (q ⟶ r) ⊢ p ∨ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_37:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 38. Demostrar&lt;br /&gt;
     p ∨ q ⟶ r ⊢ (p ⟶ r) ∧ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_38:&lt;br /&gt;
  assumes &amp;quot;p ∨ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
section {* Negaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 39. Demostrar&lt;br /&gt;
     p ⊢ ¬¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_39:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 40. Demostrar&lt;br /&gt;
     ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_40:&lt;br /&gt;
  assumes &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 41. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ ¬q ⟶ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_41:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 42. Demostrar&lt;br /&gt;
     p∨q, ¬q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_42:&lt;br /&gt;
  assumes &amp;quot;p∨q&amp;quot;&lt;br /&gt;
          &amp;quot;¬q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 42. Demostrar&lt;br /&gt;
     p ∨ q, ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_43:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 40. Demostrar&lt;br /&gt;
     p ∨ q ⊢ ¬(¬p ∧ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_44:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 45. Demostrar&lt;br /&gt;
     p ∧ q ⊢ ¬(¬p ∨ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_45:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 46. Demostrar&lt;br /&gt;
     ¬(p ∨ q) ⊢ ¬p ∧ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_46:&lt;br /&gt;
  assumes &amp;quot;¬(p ∨ q)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 47. Demostrar&lt;br /&gt;
     ¬p ∧ ¬q ⊢ ¬(p ∨ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_47:&lt;br /&gt;
  assumes &amp;quot;¬p ∧ ¬q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬(p ∨ q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 48. Demostrar&lt;br /&gt;
     ¬p ∨ ¬q ⊢ ¬(p ∧ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_48:&lt;br /&gt;
  assumes &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 49. Demostrar&lt;br /&gt;
     ⊢ ¬(p ∧ ¬p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_49:&lt;br /&gt;
  &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 50. Demostrar&lt;br /&gt;
     p ∧ ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_50:&lt;br /&gt;
  assumes &amp;quot;p ∧ ¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 51. Demostrar&lt;br /&gt;
     ¬¬p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_51:&lt;br /&gt;
  assumes &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 52. Demostrar&lt;br /&gt;
     ⊢ p ∨ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_52:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 53. Demostrar&lt;br /&gt;
     ⊢ ((p ⟶ q) ⟶ p) ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_53:&lt;br /&gt;
  &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 54. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_54:&lt;br /&gt;
  assumes &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 55. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_55:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 56. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_56:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 57. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_57:&lt;br /&gt;
  assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 58. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_58:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
</feed>