Acciones

GLC T2R2a

De DAO (Demostración asistida por ordenador)

header {* T2R2a: Argumentación en lógica de primer orden *}

theory T2R2a
imports Main 
begin

text {*
  --------------------------------------------------------------------- 
  El objetivo de esta relación es formalizar y demostrar la corrección
  de los argumentos usando sólo las reglas básicas de deducción natural
  de la lógica de primer orden (sin usar el método auto). 

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

  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R
  · allE:       (⋀x. P x) ⟹ ∀x. P x
  · exI:        P x ⟹ ∃x. P x
  · exE:        ⟦∃x. P x; ⋀x. P x ⟹ Q⟧ ⟹ Q

  --------------------------------------------------------------------- 
*}

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

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

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

lemma no_ex: "¬(∃x. P(x)) ⟹ ∀x. ¬P(x)"
by auto

lemma no_para_todo: "¬(∀x. P(x)) ⟹ ∃x. ¬P(x)"
by auto

text {* --------------------------------------------------------------- 
  Ejercicio 1. Formalizar, y demostrar la corrección, del siguiente
  argumento 
     Sócrates es un hombre. 
     Los hombres son mortales. 
     Luego, Sócrates es mortal.
  Usar s    para Sócrates
       H(x) para x es un hombre          
       M(x) para x es mortal
  ------------------------------------------------------------------ *}

-- "La demostración automática es"
lemma ejercicio_1a:
  "⟦H(s); ∀x. H(x) ⟶ M(x)⟧ ⟹ M(s)"
by auto

-- "La demostración estructurada es"
lemma ejercicio_1b:
  assumes "H(s)" 
          "∀x. H(x) ⟶ M(x)"
  shows   "M(s)"
proof -
  have "H(s) ⟶ M(s)" using assms(2) ..
  thus "M(s)" using assms(1) ..  
qed

-- "La demostración detallada es"
lemma ejercicio_1c:
  assumes "H(s)" 
          "∀x. H(x) ⟶ M(x)"
  shows   "M(s)"
proof -
  have "H(s) ⟶ M(s)" using assms(2) by (rule allE)
  thus "M(s)" using assms(1) by (rule mp)
qed

text {* --------------------------------------------------------------- 
  Ejercicio 2. Formalizar, y decidir la corrección, del siguiente
  argumento 
     Hay estudiantes inteligentes y hay estudiantes trabajadores. Por
     tanto, hay estudiantes inteligentes y trabajadores.
  Usar I(x) para x es inteligente
       T(x) para x es trabajador
  ------------------------------------------------------------------ *}

-- "La refutación automática es"
lemma ejercicio_2a:
  "(∃x. I(x)) ∧ (∃x. T(x)) ⟹ ∃x. I(x) ∧ T(x)"
quickcheck
oops

text {*
El argumento es incorrecto como muestra el siguiente contraejemplo:
   I = {a1}
   T = {a2}
*}

text {* --------------------------------------------------------------- 
  Ejercicio 3. Formalizar, y decidir la corrección, del siguiente
  argumento 
     Todos los participantes son vencedores. Hay como máximo un
     vencedor. Hay como máximo un participante. Por lo tanto, hay
     exactamente un participante. 
  Usar P(x) para x es un participante
       V(x) para x es un vencedor
  ------------------------------------------------------------------ *}

-- "La refutación automática es"
lemma ejercicio_3a: 
  "⟦∀x. P(x) ⟶ V(x); 
    ∀x y. V(x) ∧ V(y) ⟶ x=y; 
    ∀x y. P(x) ∧ P(y) ⟶ x=y⟧
   ⟹ ∃x. P(x) ∧ (∀y. P(y) ⟶ x=y)"
quickcheck  
oops

text {*
El argumento es incorrecto como muestra el siguiente contraejemplo:
   V = {}
   P = {}
*}

text {* --------------------------------------------------------------- 
  Ejercicio 4. Formalizar, y decidir la corrección, del siguiente
  argumento 
     Todo aquel que entre en el país y no sea un VIP será cacheado por
     un aduanero. Hay un contrabandista que entra en el país y que solo
     podrá ser cacheado por contrabandistas. Ningún contrabandista es un
     VIP. Por tanto, algún aduanero es contrabandista.
  Usar A(x)    para x es aduanero
       Ca(x,y) para x cachea a y
       Co(x)   para x es contrabandista
       E(x)    para x entra en el pais
       V(x)    para x es un VIP
  ------------------------------------------------------------------ *}

-- "La demostración automática es"
lemma ejercicio_4a:
  "⟦∀x. E(x) ∧ ¬V(x) ⟶ (∃y. A(y) ∧ Ca(y,x));
    ∃x. Co(x) ∧ E(x) ∧ (∀y. Ca(y,x) ⟶ Co(y));
    ¬(∃x. Co(x) ∧ V(x))⟧
   ⟹ ∃x. A(x) ∧ Co(x)"
by metis

-- "La demostración estructurada es"
lemma ejercicio_4b:
  assumes "∀x. E(x) ∧ ¬V(x) ⟶ (∃y. A(y) ∧ Ca(y,x))"
           "∃x. Co(x) ∧ E(x) ∧ (∀y. Ca(y,x) ⟶ Co(y))"
           "¬(∃x. Co(x) ∧ V(x))"
  shows    "∃x. A(x) ∧ Co(x)"
proof -
  obtain a where a: "Co(a) ∧ E(a) ∧ (∀y. Ca(y,a) ⟶ Co(y))" 
    using assms(2) ..
  have "∃y. A(y) ∧ Ca(y,a)"
  proof -
    have "E(a) ∧ ¬V(a) ⟶ (∃y. A(y) ∧ Ca(y,a))" using assms(1) ..
    moreover
    have "E(a) ∧ ¬V(a)"
    proof
      have "E(a) ∧ (∀y. Ca(y,a) ⟶ Co(y))" using a ..
      thus "E(a)" ..
    next
      have "∀x. ¬(Co(x) ∧ V(x))" using assms(3) by (rule no_ex)
      hence "¬(Co(a) ∧ V(a))" ..
      have "Co(a)" using a ..
      show "¬V(a)" 
      proof
        assume "V(a)"
        with `Co(a)` have "Co(a) ∧ V(a)" ..
        with `¬(Co(a) ∧ V(a))` show False ..
      qed
    qed
    ultimately show "∃y. A(y) ∧ Ca(y,a)" ..
  qed
  then obtain b where "A(b) ∧ Ca(b,a)" ..
  hence "A(b)" ..
  moreover
  have "Co(b)"
    proof -
      have "E(a) ∧ (∀y. Ca(y,a) ⟶ Co(y))" using a ..
      hence "∀y. Ca(y,a) ⟶ Co(y)" ..
      hence "Ca(b,a) ⟶ Co(b)" ..
      have "Ca(b,a)" using `A(b) ∧ Ca(b,a)` ..
      with `Ca(b,a) ⟶ Co(b)` show "Co(b)" ..
    qed
  ultimately have "A(b) ∧ Co(b)" ..
  thus "∃x. A(x) ∧ Co(x)" ..
qed

-- "La demostración detallada es"
lemma ejercicio_4c:
  assumes "∀x. E(x) ∧ ¬V(x) ⟶ (∃y. A(y) ∧ Ca(y,x))"
           "∃x. Co(x) ∧ E(x) ∧ (∀y. Ca(y,x) ⟶ Co(y))"
           "¬(∃x. Co(x) ∧ V(x))"
  shows    "∃x. A(x) ∧ Co(x)"
proof -
  obtain a where a: "Co(a) ∧ E(a) ∧ (∀y. Ca(y,a) ⟶ Co(y))" 
    using assms(2) by (rule exE)
  have "∃y. A(y) ∧ Ca(y,a)"
  proof -
    have "E(a) ∧ ¬V(a) ⟶ (∃y. A(y) ∧ Ca(y,a))" using assms(1) by (rule allE)
    moreover
    have "E(a) ∧ ¬V(a)"
    proof
      have "E(a) ∧ (∀y. Ca(y,a) ⟶ Co(y))" using a by (rule conjunct2)
      thus "E(a)" by (rule conjunct1)
    next
      have "∀x. ¬(Co(x) ∧ V(x))" using assms(3) by (rule no_ex)
      hence "¬(Co(a) ∧ V(a))" by (rule allE)
      have "Co(a)" using a by (rule conjunct1)
      show "¬V(a)" 
      proof (rule notI)
        assume "V(a)"
        with `Co(a)` have "Co(a) ∧ V(a)" by (rule conjI)
        with `¬(Co(a) ∧ V(a))` show False by (rule notE)
      qed
    qed
    ultimately show "∃y. A(y) ∧ Ca(y,a)" by (rule mp)
  qed
  then obtain b where "A(b) ∧ Ca(b,a)" by (rule exE)
  hence "A(b)" by (rule conjunct1)
  moreover
  have "Co(b)"
    proof -
      have "E(a) ∧ (∀y. Ca(y,a) ⟶ Co(y))" using a by (rule conjunct2)
      hence "∀y. Ca(y,a) ⟶ Co(y)" by (rule conjunct2)
      hence "Ca(b,a) ⟶ Co(b)" by (rule allE)
      have "Ca(b,a)" using `A(b) ∧ Ca(b,a)` by (rule conjunct2)
      with `Ca(b,a) ⟶ Co(b)` show "Co(b)" by (rule mp)
    qed
  ultimately have "A(b) ∧ Co(b)" by (rule conjI)
  thus "∃x. A(x) ∧ Co(x)" by (rule exI)
qed

text {* --------------------------------------------------------------- 
  Ejercicio 5. Formalizar, y decidir la corrección, del siguiente
  argumento 
     Juan teme a María. Pedro es temido por Juan. Luego, alguien teme a
     María y a Pedro.
  Usar j      para Juan  
       m      para María
       p      para Pedro
       T(x,y) para x teme a y
  ------------------------------------------------------------------ *}

-- "La demostración automática es"
lemma ejercicio_5a:
  "⟦T(j,m); T(j,p)⟧ ⟹ ∃x. T(x,m) ∧ T(x,p)"
by auto

-- "La demostración estructurada es"
lemma ejercicio_5b:
  assumes "T(j,m)" 
          "T(j,p)"
  shows   "∃x. T(x,m) ∧ T(x,p)"
proof
  show "T(j,m) ∧ T(j,p)" using assms ..
qed

-- "La demostración detallada es"
lemma ejercicio_5c:
  assumes "T(j,m)" 
          "T(j,p)"
  shows   "∃x. T(x,m) ∧ T(x,p)"
proof (rule exI)
  show "T(j,m) ∧ T(j,p)" using assms by (rule conjI)
qed

text {* --------------------------------------------------------------- 
  Ejercicio 6. Formalizar, y decidir la corrección, del siguiente
  argumento 
     Los hermanos tienen el mismo padre. Juan es hermano de Luis. Carlos
     es padre de Luis. Por tanto, Carlos es padre de Juan.
  Usar H(x,y) para x es hermano de y
       P(x,y) para x es padre de y
       j      para Juan
       l      para Luis
       c      para Carlos
  ------------------------------------------------------------------ *}

-- "La demostración automática es"
lemma ejercicio_6a:
  assumes "∀x y. H(x,y) ⟶ H(y,x)"
          "∀x y z. H(x,y) ∧ P(z,x) ⟶ P(z,y)"
          "H(j,l)"
          "P(c,l)"
  shows   "P(c,j)"
using assms
by metis

-- "La demostración estructurada es"
lemma ejercicio_6b:
  fixes H P :: "'a × 'a ⇒ bool" 
  assumes "∀x y. H(x,y) ⟶ H(y,x)"
          "∀x y z. H(x,y) ∧ P(z,x) ⟶ P(z,y)"
          "H(j,l)"
          "P(c,l)"
  shows   "P(c,j)"
proof -
  have "H(l,j) ∧ P(c,l) ⟶ P(c,j)" 
  proof -
    have "∀y z. H(l,y) ∧ P(z,l) ⟶ P(z,y)" using assms(2) ..
    hence "∀z. H(l,j) ∧ P(z,l) ⟶ P(z,j)" ..
    thus "H(l,j) ∧ P(c,l) ⟶ P(c,j)" ..
  qed
  moreover
  have "H(l,j) ∧ P(c,l)"
  proof
    have "∀y. H(j,y) ⟶ H(y,j)" using assms(1) ..
    hence "H(j,l) ⟶ H(l,j)" .. 
    thus "H(l,j)" using assms(3) ..
  next
    show "P(c,l)" using assms(4) .
  qed
  ultimately show "P(c,j)" .. 
qed

-- "La demostración detallada es"
lemma ejercicio_6c:
  fixes H P :: "'a × 'a ⇒ bool" 
  assumes "∀x y. H(x,y) ⟶ H(y,x)"
          "∀x y z. H(x,y) ∧ P(z,x) ⟶ P(z,y)"
          "H(j,l)"
          "P(c,l)"
  shows   "P(c,j)"
proof -
  have "H(l,j) ∧ P(c,l) ⟶ P(c,j)" 
  proof -
    have "∀y z. H(l,y) ∧ P(z,l) ⟶ P(z,y)" using assms(2) by (rule allE)
    hence "∀z. H(l,j) ∧ P(z,l) ⟶ P(z,j)" by (rule allE)
    thus "H(l,j) ∧ P(c,l) ⟶ P(c,j)" by (rule allE)
  qed
  moreover
  have "H(l,j) ∧ P(c,l)"
  proof (rule conjI)
    have "∀y. H(j,y) ⟶ H(y,j)" using assms(1) by (rule allE)
    hence "H(j,l) ⟶ H(l,j)" by (rule allE)
    thus "H(l,j)" using assms(3) by (rule mp)
  next
    show "P(c,l)" using assms(4) by this
  qed
  ultimately show "P(c,j)" by (rule mp)
qed

text {* --------------------------------------------------------------- 
  Ejercicio 7. Formalizar, y decidir la corrección, del siguiente
  argumento 
     La existencia de algún canal de TV pública, supone un acicate para
     cualquier canal de TV privada; el que un canal de TV tenga un
     acicate, supone una gran satisfacción para cualquiera de sus
     directivos; en Madrid hay varios canales públicos de TV; TV5 es un
     canal de TV privada; por tanto, todos los directivos de TV5 están
     satisfechos. 
  Usar Pu(x)  para x es un canal de TV pública
       Pr(x)  para x es un canal de TV privada
       A(x)   para x posee un acicate
       D(x,y) para x es un directivo del canal y
       S(x)   para x está satisfecho 
       t      para TV5
  ------------------------------------------------------------------ *}

-- "La demostración automática es"
lemma ejercicio_7a:
  assumes "(∃x. Pu(x)) ⟶ (∀x. Pr(x) ⟶ A(x))"
          "∀x. A(x) ⟶ (∀y. D(y,x) ⟶ S(y))"
          "∃x. Pu(x)"
          "Pr(t)"
  shows   "∀x. D(x,t) ⟶ S(x)"
using assms
by auto

-- "La demostración estructurada es"
lemma ejercicio_7b:
  assumes "(∃x. Pu(x)) ⟶ (∀x. Pr(x) ⟶ A(x))"
          "∀x. A(x) ⟶ (∀y. D(y,x) ⟶ S(y))"
          "∃x. Pu(x)"
          "Pr(t)"
  shows   "∀x. D(x,t) ⟶ S(x)"
proof
  fix a 
  show "D(a,t) ⟶ S(a)"
  proof
    assume "D(a,t)"
    have "∀x. Pr(x) ⟶ A(x)" using assms(1) assms(3) ..
    hence "Pr(t) ⟶ A(t)" ..
    hence "A(t)" using assms(4) ..
    have "A(t) ⟶ (∀y. D(y,t) ⟶ S(y))" using assms(2) ..
    hence "∀y. D(y,t) ⟶ S(y)" using `A(t)` ..
    hence "D(a,t) ⟶ S(a)" ..
    thus "S(a)" using `D(a,t)` ..
  qed
qed

-- "La demostración detallada es"
lemma ejercicio_7c:
  assumes "(∃x. Pu(x)) ⟶ (∀x. Pr(x) ⟶ A(x))"
          "∀x. A(x) ⟶ (∀y. D(y,x) ⟶ S(y))"
          "∃x. Pu(x)"
          "Pr(t)"
  shows   "∀x. D(x,t) ⟶ S(x)"
proof (rule allI)
  fix a 
  show "D(a,t) ⟶ S(a)"
  proof (rule impI)
    assume "D(a,t)"
    have "∀x. Pr(x) ⟶ A(x)" using assms(1) assms(3) by (rule mp)
    hence "Pr(t) ⟶ A(t)" by (rule allE)
    hence "A(t)" using assms(4) by (rule mp)
    have "A(t) ⟶ (∀y. D(y,t) ⟶ S(y))" using assms(2) by (rule allE)
    hence "∀y. D(y,t) ⟶ S(y)" using `A(t)` by (rule mp)
    hence "D(a,t) ⟶ S(a)" by (rule allE)
    thus "S(a)" using `D(a,t)` by (rule mp)
  qed
qed

text {* --------------------------------------------------------------- 
  Ejercicio 8. Formalizar, y decidir la corrección, del siguiente
  argumento 
     Quien intente entrar en un país y no tenga pasaporte, encontrará
     algún aduanero que le impida el paso. A algunas personas
     motorizadas que intentan entrar en un país le impiden el paso
     únicamente personas motorizadas. Ninguna persona motorizada tiene
     pasaporte. Por tanto, ciertos aduaneros están motorizados.
  Usar E(x)   para x entra en un país
       P(x)   para x tiene pasaporte
       A(x)   para x es aduanero
       I(x,y) para x impide el paso a y
       M(x)   para x está motorizada
  ------------------------------------------------------------------ *}

-- "La demostración automática es"
lemma ejercicio_8a:
  assumes "∀x. E(x) ∧ ¬P(x) ⟶ (∃y. A(y) ∧ I(y,x))"
          "∃x. M(x) ∧ E(x) ∧ (∀y. I(y,x) ⟶ M(y))"
          "∀x. M(x) ⟶ ¬P(x)"
  shows "∃x. A(x) ∧ M(x)"
using assms
by blast

-- "La demostración estructurada es"
lemma ejercicio_8b:
  assumes "∀x. E(x) ∧ ¬P(x) ⟶ (∃y. A(y) ∧ I(y,x))"
          "∃x. M(x) ∧ E(x) ∧ (∀y. I(y,x) ⟶ M(y))"
          "∀x. M(x) ⟶ ¬P(x)"
  shows "∃x. A(x) ∧ M(x)"
proof - 
  obtain a where a: "M(a) ∧ E(a) ∧ (∀y. I(y,a) ⟶ M(y))" using assms(2) ..
  hence "M(a)" ..
  have "M(a) ⟶ ¬P(a)" using assms(3) ..
  hence "¬P(a)" using `M(a)` ..
  have a1: "E(a) ∧ (∀y. I(y,a) ⟶ M(y))" using a ..
  hence "E(a)" ..
  hence "E(a) ∧ ¬P(a)" using `¬P(a)` ..
  have "E(a) ∧ ¬P(a) ⟶ (∃y. A(y) ∧ I(y,a))" using assms(1) ..
  hence "∃y. A(y) ∧ I(y,a)" using `E(a) ∧ ¬P(a)`..
  then obtain b where b: "A(b) ∧ I(b,a)" ..
  have "A(b) ∧ M(b)"
  proof
    show "A(b)" using b ..
  next
    have "I(b,a)" using b ..
    have "∀y. I(y,a) ⟶ M(y)" using a1 ..
    hence "I(b,a) ⟶ M(b)" ..
    thus "M(b)" using `I(b,a)` ..
  qed
  thus "∃x. A(x) ∧ M(x)" ..
qed

-- "La demostración detallada es"
lemma ejercicio_8c:
  assumes "∀x. E(x) ∧ ¬P(x) ⟶ (∃y. A(y) ∧ I(y,x))"
          "∃x. M(x) ∧ E(x) ∧ (∀y. I(y,x) ⟶ M(y))"
          "∀x. M(x) ⟶ ¬P(x)"
  shows "∃x. A(x) ∧ M(x)"
proof - 
  obtain a where a: "M(a) ∧ E(a) ∧ (∀y. I(y,a) ⟶ M(y))" 
    using assms(2) by (rule exE)
  hence "M(a)" by (rule conjunct1)
  have "M(a) ⟶ ¬P(a)" using assms(3) by (rule allE)
  hence "¬P(a)" using `M(a)` by (rule mp)
  have a1: "E(a) ∧ (∀y. I(y,a) ⟶ M(y))" using a by (rule conjunct2)
  hence "E(a)" by (rule conjunct1)
  hence "E(a) ∧ ¬P(a)" using `¬P(a)` by (rule conjI)
  have "E(a) ∧ ¬P(a) ⟶ (∃y. A(y) ∧ I(y,a))" 
    using assms(1) by (rule allE)
  hence "∃y. A(y) ∧ I(y,a)" using `E(a) ∧ ¬P(a)`by (rule mp)
  then obtain b where b: "A(b) ∧ I(b,a)" by (rule exE)
  have "A(b) ∧ M(b)"
  proof (rule conjI)
    show "A(b)" using b by (rule conjunct1)
  next
    have "I(b,a)" using b by (rule conjunct2)
    have "∀y. I(y,a) ⟶ M(y)" using a1 by (rule conjunct2)
    hence "I(b,a) ⟶ M(b)" by (rule allE)
    thus "M(b)" using `I(b,a)`by (rule mp)
  qed
  thus "∃x. A(x) ∧ M(x)" by (rule exI)
qed

text {* --------------------------------------------------------------- 
  Ejercicio 9. Formalizar, y decidir la corrección, del siguiente
  argumento 
     Los aficionados al fútbol aplauden a cualquier futbolista
     extranjero. Juanito no aplaude a futbolistas extranjeros. Por
     tanto, si hay algún futbolista extranjero nacionalizado español,
     Juanito no es aficionado al fútbol.
  Usar Af(x)   para x es aficicionado al fútbol
       Ap(x,y) para x aplaude a y
       E(x)    para x es un futbolista extranjero
       N(x)    para x es un futbolista nacionalizado español
       j       para Juanito
  ------------------------------------------------------------------ *}

-- "La demostración automática es"
lemma ejercicio_9a:
  assumes "∀x. Af(x) ⟶ (∀y. E(y) ⟶ Ap(x,y))"
          "∀x. E(x) ⟶ ¬Ap(j,x)"
  shows   "(∃x. E(x) ∧ N(x)) ⟶ ¬Af(j)"
using assms
by blast

-- "La demostración estructurada es"
lemma ejercicio_9b:
  assumes "∀x. Af(x) ⟶ (∀y. E(y) ⟶ Ap(x,y))"
          "∀x. E(x) ⟶ ¬Ap(j,x)"
  shows   "(∃x. E(x) ∧ N(x)) ⟶ ¬Af(j)"
proof
  assume "∃x. E(x) ∧ N(x)"
  then obtain a where a: "E(a) ∧ N(a)" ..
  show "¬Af(j)"
  proof
    assume "Af(j)"
    have "Af(j) ⟶ (∀y. E(y) ⟶ Ap(j,y))" using assms(1) ..
    hence "∀y. E(y) ⟶ Ap(j,y)" using `Af(j)` ..
    hence "E(a) ⟶ Ap(j,a)" ..
    have "E(a)" using a ..
    with `E(a) ⟶ Ap(j,a)` have "Ap(j,a)" ..
    have "E(a) ⟶ ¬Ap(j,a)" using assms(2) ..
    hence "¬Ap(j,a)" using `E(a)` ..
    thus False using `Ap(j,a)` ..
  qed
qed

-- "La demostración detallada es"
lemma ejercicio_9c:
  assumes "∀x. Af(x) ⟶ (∀y. E(y) ⟶ Ap(x,y))"
          "∀x. E(x) ⟶ ¬Ap(j,x)"
  shows   "(∃x. E(x) ∧ N(x)) ⟶ ¬Af(j)"
proof (rule impI)
  assume "∃x. E(x) ∧ N(x)"
  then obtain a where a: "E(a) ∧ N(a)" by (rule exE)
  show "¬Af(j)"
  proof (rule notI)
    assume "Af(j)"
    have "Af(j) ⟶ (∀y. E(y) ⟶ Ap(j,y))" using assms(1) by (rule allE)
    hence "∀y. E(y) ⟶ Ap(j,y)" using `Af(j)` by (rule mp)
    hence "E(a) ⟶ Ap(j,a)" by (rule allE)
    have "E(a)" using a by (rule conjunct1)
    with `E(a) ⟶ Ap(j,a)` have "Ap(j,a)" by (rule mp)
    have "E(a) ⟶ ¬Ap(j,a)" using assms(2) by (rule allE)
    hence "¬Ap(j,a)" using `E(a)` by (rule mp)
    thus False using `Ap(j,a)` by (rule notE)
  qed
qed

text {* --------------------------------------------------------------- 
  Ejercicio 10. Formalizar, y decidir la corrección, del siguiente
  argumento 
     Ningún aristócrata debe ser condenado a galeras a menos que sus
     crímenes sean vergonzosos y lleve una vida licenciosa. En la ciudad
     hay aristócratas que han cometido crímenes vergonzosos aunque su
     forma de vida no sea licenciosa. Por tanto, hay algún aristócrata
     que no está condenado a galeras. 
  Usar A(x)  para x es aristócrata
       G(x)  para x está condenado a galeras
       L(x)  para x lleva una vida licenciosa
       V(x)  para x ha cometido crímenes vergonzoso
  ------------------------------------------------------------------ *}

-- "La demostración automática es"
lemma ejercicio_10a:
  assumes "∀x. A(x) ∧ G(x) ⟶ L(x) ∧ V(x)"
          "∃x. A(x) ∧ V(x) ∧ ¬L(x)"
  shows   "∃x. A(x) ∧ ¬G(x)"
using assms
by blast

-- "La demostración estructurada es"
lemma ejercicio_10b:
  assumes "∀x. A(x) ∧ G(x) ⟶ L(x) ∧ V(x)"
          "∃x. A(x) ∧ V(x) ∧ ¬L(x)"
  shows   "∃x. A(x) ∧ ¬G(x)"
proof -
  obtain b where b: "A(b) ∧ V(b) ∧ ¬L(b)" using assms(2) ..
  have "A(b) ∧ ¬G(b)"
  proof
    show "A(b)" using b ..
  next
    show "¬G(b)"
    proof
      assume "G(b)"
      have "¬L(b)"
      proof -
        have "V(b) ∧ ¬L(b)" using b ..
        thus "¬L(b)" ..
      qed
      moreover have "L(b)"
      proof -
        have "A(b) ∧ G(b) ⟶ L(b) ∧ V(b)" using assms(1) ..
        have "A(b)" using b ..
        hence "A(b) ∧ G(b)" using `G(b)` ..
        with `A(b) ∧ G(b) ⟶ L(b) ∧ V(b)` have "L(b) ∧ V(b)" ..
        thus "L(b)" ..
      qed
      ultimately show False ..
    qed
  qed
  thus "∃x. A(x) ∧ ¬G(x)" ..
qed

-- "La demostración detallada es"
lemma ejercicio_10c:
  assumes "∀x. A(x) ∧ G(x) ⟶ L(x) ∧ V(x)"
          "∃x. A(x) ∧ V(x) ∧ ¬L(x)"
  shows   "∃x. A(x) ∧ ¬G(x)"
proof -
  obtain b where b: "A(b) ∧ V(b) ∧ ¬L(b)" using assms(2) by (rule exE)
  have "A(b) ∧ ¬G(b)"
  proof (rule conjI)
    show "A(b)" using b by (rule conjunct1)
  next
    show "¬G(b)"
    proof (rule notI)
      assume "G(b)"
      have "¬L(b)"
      proof -
        have "V(b) ∧ ¬L(b)" using b by (rule conjunct2)
        thus "¬L(b)" by (rule conjunct2)
      qed
      moreover have "L(b)"
      proof -
        have "A(b) ∧ G(b) ⟶ L(b) ∧ V(b)" using assms(1) by (rule allE)
        have "A(b)" using b by (rule conjunct1)
        hence "A(b) ∧ G(b)" using `G(b)` by (rule conjI)
        with `A(b) ∧ G(b) ⟶ L(b) ∧ V(b)` have "L(b) ∧ V(b)" by (rule mp)
        thus "L(b)" by (rule conjunct1)
      qed
      ultimately show False by (rule notE)
    qed
  qed
  thus "∃x. A(x) ∧ ¬G(x)" by (rule exI)
qed

text {* --------------------------------------------------------------- 
  Ejercicio 11. Formalizar, y decidir la corrección, del siguiente
  argumento 
     Todo individuo que esté conforme con el contenido de cualquier
     acuerdo internacional lo apoya o se inhibe en absoluto de asuntos
     políticos. Cualquiera que se inhiba de los asuntos políticos, no
     participará en el próximo referéndum. Todo español, está conforme
     con el acuerdo internacional de Maastricht, al que sin embargo no
     apoya. Por tanto, cualquier individuo o no es español, o en otro
     caso, está conforme con el contenido del acuerdo internacional de
     Maastricht y no participará en el próximo referéndum. 
  Usar C(x,y) para la persona x conforme con el contenido del acuerdo y
       A(x,y) para la persona x apoya el acuerdo y
       I(x)   para la persona x se inibe de asuntos políticos
       R(x)   para la persona x participará en el próximo referéndum
       E(x)   para la persona x es española
       m      para el acuerdo de Maastricht
  ------------------------------------------------------------------ *}

-- "La demostración automática es"
lemma ejercicio_11a:
  assumes "∀x y. C(x,y) ⟶ A(x,y) ∨ I(x)"
          "∀x. I(x) ⟶ ¬R(x)"
          "∀x. E(x) ⟶ C(x,m) ∧ ¬A(x,m)"
  shows   "∀x. ¬E(x) ∨ (C(x,m) ∧ ¬R(x))"
using assms
by blast

-- "La demostración estructurada es"
lemma ejercicio_11b:
  assumes "∀x y. C(x,y) ⟶ A(x,y) ∨ I(x)"
          "∀x. I(x) ⟶ ¬R(x)"
          "∀x. E(x) ⟶ C(x,m) ∧ ¬A(x,m)"
  shows   "∀x. ¬E(x) ∨ (C(x,m) ∧ ¬R(x))"
proof
  fix a
  have "¬E(a) ∨ E(a)" ..
  thus "¬E(a) ∨ (C(a,m) ∧ ¬R(a))"
  proof
    assume "¬E(a)"
    thus "¬E(a) ∨ (C(a,m) ∧ ¬R(a))" ..
  next
    assume "E(a)"
    have "E(a) ⟶ C(a,m) ∧ ¬A(a,m)" using assms(3) ..
    hence "C(a,m) ∧ ¬A(a,m)" using `E(a)` ..
    hence "C(a,m)" .. 
    have "∀y. C(a,y) ⟶ A(a,y) ∨ I(a)" using assms(1) ..
    hence "C(a,m) ⟶ A(a,m) ∨ I(a)" ..
    hence "A(a,m) ∨ I(a)" using `C(a,m)` ..
    hence "¬R(a)"
    proof 
      assume "A(a,m)"
      have "¬A(a,m)" using `C(a,m) ∧ ¬A(a,m)`..
      thus "¬R(a)" using `A(a,m)` ..
    next
      assume "I(a)"
      have "I(a) ⟶ ¬R(a)" using assms(2) ..
      thus "¬R(a)" using `I(a)` ..
    qed
    with `C(a,m)` have "C(a,m) ∧ ¬R(a)" ..
    thus "¬E(a) ∨ (C(a,m) ∧ ¬R(a))" ..
  qed
qed

-- "La demostración detallada es"
lemma ejercicio_11c:
  assumes "∀x y. C(x,y) ⟶ A(x,y) ∨ I(x)"
          "∀x. I(x) ⟶ ¬R(x)"
          "∀x. E(x) ⟶ C(x,m) ∧ ¬A(x,m)"
  shows   "∀x. ¬E(x) ∨ (C(x,m) ∧ ¬R(x))"
proof (rule allI)
  fix a
  have "¬E(a) ∨ E(a)" by (rule excluded_middle)
  thus "¬E(a) ∨ (C(a,m) ∧ ¬R(a))" 
  proof (rule disjE)
    assume "¬E(a)"
    thus "¬E(a) ∨ (C(a,m) ∧ ¬R(a))" by (rule disjI1)
  next
    assume "E(a)"
    have "E(a) ⟶ C(a,m) ∧ ¬A(a,m)" using assms(3) by (rule allE)
    hence "C(a,m) ∧ ¬A(a,m)" using `E(a)` by (rule mp)
    hence "C(a,m)" by (rule conjunct1)
    have "∀y. C(a,y) ⟶ A(a,y) ∨ I(a)" using assms(1) by (rule allE)
    hence "C(a,m) ⟶ A(a,m) ∨ I(a)" by (rule allE)
    hence "A(a,m) ∨ I(a)" using `C(a,m)` by (rule mp)
    hence "¬R(a)"
    proof (rule disjE)
      assume "A(a,m)"
      have "¬A(a,m)" using `C(a,m) ∧ ¬A(a,m)`by (rule conjunct2)
      thus "¬R(a)" using `A(a,m)` by (rule notE)
    next
      assume "I(a)"
      have "I(a) ⟶ ¬R(a)" using assms(2) by (rule allE)
      thus "¬R(a)" using `I(a)` by (rule mp)
    qed
    with `C(a,m)` have "C(a,m) ∧ ¬R(a)" by (rule conjI)
    thus "¬E(a) ∨ (C(a,m) ∧ ¬R(a))" by (rule disjI2)
  qed
qed

text {* --------------------------------------------------------------- 
  Ejercicio 12. Formalizar, y decidir la corrección, del siguiente
  argumento 
     Toda persona pobre tiene un padre rico. Por tanto, existe una
     persona rica que tiene un abuelo rico.
  Usar R(x) para x es rico
       p(x) para el padre de x
  ------------------------------------------------------------------ *}

-- "La demostración automática es"
lemma ejercicio_12a:
  assumes "∀x. ¬R(x) ⟶ R(p(x))"
  shows   "∃x. R(x) ∧ R(p(p(x)))"
using assms
by blast

-- "La demostración estructurada es"
lemma ejercicio_12b:
  assumes "∀x. ¬R(x) ⟶ R(p(x))"
  shows   "∃x. R(x) ∧ R(p(p(x)))"
proof -
  have "∃x. R(x)"
  proof (rule ccontr)
    assume "¬(∃x. R(x))"
    hence "∀x. ¬R(x)" by (rule no_ex)
    hence "¬R(a)" ..
    have "¬R(a) ⟶ R(p(a))" using assms ..
    hence "R(p(a))" using `¬R(a)` ..
    hence "∃x. R(x)" ..
    with `¬(∃x. R(x))` show False ..
  qed
  then obtain a where "R(a)" ..
  have "¬R(p(p(a))) ∨ R(p(p(a)))" by (rule excluded_middle)
  thus "∃x. R(x) ∧ R(p(p(x)))"
  proof
    assume "¬R(p(p(a)))"
    have "R(p(a)) ∧ R(p(p(p(a))))"
    proof
      show "R(p(a))"
      proof (rule ccontr)
        assume "¬R(p(a))"
        have "¬R(p(a)) ⟶ R(p(p(a)))" using assms ..
        hence "R(p(p(a)))" using `¬R(p(a))` ..
        with `¬R(p(p(a)))` show False ..
      qed
    next
      show "R(p(p(p(a))))"
      proof -
        have "¬R(p(p(a))) ⟶ R(p(p(p(a))))" using assms ..
        thus "R(p(p(p(a))))" using `¬R(p(p(a)))` .. 
      qed
    qed
    thus "∃x. R(x) ∧ R(p(p(x)))" ..
  next
    assume "R(p(p(a)))"
    with `R(a)` have "R(a) ∧ R(p(p(a)))" ..
    thus "∃x. R(x) ∧ R(p(p(x)))" ..
  qed
qed

-- "La demostración detallada es"
lemma ejercicio_12c:
  assumes "∀x. ¬R(x) ⟶ R(p(x))"
  shows   "∃x. R(x) ∧ R(p(p(x)))"
proof -
  have "∃x. R(x)"
  proof (rule ccontr)
    assume "¬(∃x. R(x))"
    hence "∀x. ¬R(x)" by (rule no_ex)
    hence "¬R(a)" by (rule allE)
    have "¬R(a) ⟶ R(p(a))" using assms by (rule allE)
    hence "R(p(a))" using `¬R(a)` by (rule mp)
    hence "∃x. R(x)" by (rule exI)
    with `¬(∃x. R(x))` show False by (rule notE)
  qed
  then obtain a where "R(a)" by (rule exE)
  have "¬R(p(p(a))) ∨ R(p(p(a)))" by (rule excluded_middle)
  thus "∃x. R(x) ∧ R(p(p(x)))"
  proof (rule disjE)
    assume "¬R(p(p(a)))"
    have "R(p(a)) ∧ R(p(p(p(a))))"
    proof (rule conjI)
      show "R(p(a))"
      proof (rule ccontr)
        assume "¬R(p(a))"
        have "¬R(p(a)) ⟶ R(p(p(a)))" using assms by (rule allE)
        hence "R(p(p(a)))" using `¬R(p(a))` by (rule mp)
        with `¬R(p(p(a)))` show False by (rule notE)
      qed
    next
      show "R(p(p(p(a))))"
      proof -
        have "¬R(p(p(a))) ⟶ R(p(p(p(a))))" using assms by (rule allE)
        thus "R(p(p(p(a))))" using `¬R(p(p(a)))` by (rule mp)
      qed
    qed
    thus "∃x. R(x) ∧ R(p(p(x)))" by (rule exI)
  next
    assume "R(p(p(a)))"
    with `R(a)` have "R(a) ∧ R(p(p(a)))" by (rule conjI)
    thus "∃x. R(x) ∧ R(p(p(x)))" by (rule exI)
  qed
qed

text {* --------------------------------------------------------------- 
  Ejercicio 13. Formalizar, y decidir la corrección, del siguiente
  argumento 
     Todo deprimido que estima a un submarinista es listo. Cualquiera
     que se estime a sí mismo es listo. Ningún deprimido se estima a sí
     mismo. Por tanto, ningún deprimido estima a un submarinista.
  Usar D(x)   para x está deprimido
       E(x,y) para x estima a y
       L(x)   para x es listo
       S(x)   para x es submarinista
  ------------------------------------------------------------------ *}

-- "La demostración automática es"
lemma ejercicio_13a:
  assumes "∀x. D(x) ∧ (∃y. S(y) ∧ E(x,y)) ⟶ L(x)"
          "∀x. E(x,x) ⟶ L(x)"
          "¬(∃x. D(x) ∧ E(x,x))"
  shows   "¬(∃x. D(x) ∧ (∃y. S(y) ∧ E(x,y)))"
quickcheck
oops

text {*
  El argumento es incorrecto como muestra el siguiente contraejemplo:
     Quickcheck found a counterexample:
     D = {a2}
     S = {a1}
     E = {(a2, a1)}
     L = {a2}
*}

text {* --------------------------------------------------------------- 
  Ejercicio 14. Formalizar, y decidir la corrección, del siguiente
  argumento 
     Todos los robots obedecen a los amigos del programador jefe.
     Alvaro es amigo del programador jefe, pero Benito no le
     obedece. Por tanto, Benito no es un robot.
  Usar R(x)    para x es un robot
       Ob(x,y) para x obedece a y
       A(x)    para x es amigo del programador jefe
       b       para Benito
       a       para Alvaro
  ------------------------------------------------------------------ *}

-- "La demostración automática es"
lemma ejercicio_14a:
  assumes "∀x y. R(x) ∧ A(y) ⟶ Ob(x,y)"
          "A(a)"
          "¬Ob(b,a)"
  shows   "¬R(b)"
using assms
by blast

-- "La demostración estructurada es"
lemma ejercicio_14b:
  fixes R A :: "'a ⇒ bool" and
        Ob :: "'a × 'a ⇒ bool"
  assumes "∀x y. R(x) ∧ A(y) ⟶ Ob(x,y)"
          "A(a)"
          "¬Ob(b,a)"
  shows   "¬R(b)"
proof
  assume "R(b)"
  have "∀y. R(b) ∧ A(y) ⟶ Ob(b,y)" using assms(1) ..
  hence "R(b) ∧ A(a) ⟶ Ob(b,a)" ..
  have "R(b) ∧ A(a)" using `R(b)` assms(2) ..
  with `R(b) ∧ A(a) ⟶ Ob(b,a)` have "Ob(b,a)" ..
  with assms(3) show False ..
qed

-- "La demostración detallada es"
lemma ejercicio_14c:
  fixes R A :: "'a ⇒ bool" and
        Ob :: "'a × 'a ⇒ bool"
  assumes "∀x y. R(x) ∧ A(y) ⟶ Ob(x,y)"
          "A(a)"
          "¬Ob(b,a)"
  shows   "¬R(b)"
proof (rule notI)
  assume "R(b)"
  have "∀y. R(b) ∧ A(y) ⟶ Ob(b,y)" using assms(1) by (rule allE)
  hence "R(b) ∧ A(a) ⟶ Ob(b,a)" by (rule allE)
  have "R(b) ∧ A(a)" using `R(b)` assms(2) by (rule conjI)
  with `R(b) ∧ A(a) ⟶ Ob(b,a)` have "Ob(b,a)" by (rule mp)
  with assms(3) show False by (rule notE)
qed

text {* --------------------------------------------------------------- 
  Ejercicio 15. Formalizar, y decidir la corrección, del siguiente
  argumento 
     En una pecera nadan una serie de peces. Se observa que:
     * Hay algún pez x que para cualquier pez y, si el pez x no se come
       al pez y entonces existe un pez z tal que z es un tiburón o bien
       z protege al pez y. 
     * No hay ningún pez que se coma a todos los demás.
     * Ningún pez protege a ningún otro.
     Por tanto, existe algún tiburón en la pecera.
  Usar C(x,y) para x se come a y 
       P(x,y) para x protege a y
       T(x)   para x es un tiburón
   ------------------------------------------------------------------ *}

-- "La demostración automática es"
lemma ejercicio_15a:
  assumes "∃x. ∀y. ¬C(x,y) ⟶ (∃z. T(z) ∨ P(z,y))"
          "∀x. ∃y. ¬C(x,y)"
          "∀x y. ¬P(x,y)"
  shows   "∃x. T(x)"
using assms
by auto

-- "La demostración estructurada es"
lemma ejercicio_15b:
  assumes "∃x. ∀y. ¬C(x,y) ⟶ (∃z. T(z) ∨ P(z,y))"
          "∀x. ∃y. ¬C(x,y)"
          "∀x y. ¬P(x,y)"
  shows   "∃x. T(x)"
proof - 
  obtain a where  a: "∀y. ¬C(a,y) ⟶ (∃z. T(z) ∨ P(z,y))" 
    using assms(1) ..
  have "∃y. ¬C(a,y)" using assms(2) ..
  then obtain b where "¬C(a,b)" ..
  have "¬C(a,b) ⟶ (∃z. T(z) ∨ P(z,b))" using a ..
  hence "∃z. T(z) ∨ P(z,b)" using `¬C(a,b)` ..
  then obtain c where "T(c) ∨ P(c,b)" ..
  thus "∃x. T(x)"
  proof 
    assume "T(c)"
    thus "∃x. T(x)" ..
  next
    assume "P(c,b)"
    have "∀y. ¬P(c,y)" using assms(3) ..
    hence "¬P(c,b)" ..
    thus "∃x. T(x)" using `P(c,b)` ..
  qed
qed

-- "La demostración detallada es"
lemma ejercicio_15c:
  assumes "∃x. ∀y. ¬C(x,y) ⟶ (∃z. T(z) ∨ P(z,y))"
          "∀x. ∃y. ¬C(x,y)"
          "∀x y. ¬P(x,y)"
  shows   "∃x. T(x)"
proof - 
  obtain a where  a: "∀y. ¬C(a,y) ⟶ (∃z. T(z) ∨ P(z,y))" 
    using assms(1) by (rule exE)
  have "∃y. ¬C(a,y)" using assms(2) by (rule allE)
  then obtain b where "¬C(a,b)" by (rule exE)
  have "¬C(a,b) ⟶ (∃z. T(z) ∨ P(z,b))" using a by (rule allE)
  hence "∃z. T(z) ∨ P(z,b)" using `¬C(a,b)` by (rule mp)
  then obtain c where "T(c) ∨ P(c,b)" by (rule exE)
  thus "∃x. T(x)"
  proof (rule disjE)
    assume "T(c)"
    thus "∃x. T(x)" by (rule exI)
  next
    assume "P(c,b)"
    have "∀y. ¬P(c,y)" using assms(3) by (rule allE)
    hence "¬P(c,b)" by (rule allE)
    thus "∃x. T(x)" using `P(c,b)` by (rule notE)
  qed
qed

end