text ‹Ejercicio 3 de Lógica Matemática y Fundamentos (19-mayo-2020)›
theory uvus_3
imports Main 
begin
text ‹
  Apellidos:
  Nombre: 
› 
text ‹Sustituye la palabra uvus por tu usuario de la Universidad de
  Sevilla y graba el fichero con dicho usuario.thy› 
text ‹Nota 1: El tiempo de realización del ejercicio es de 15:30 a 17:00.
  A continuación, se dispone de 30 minutos para su entrega en la PEV.› 
text ‹Nota 2: Además de las reglas básicas de deducción natural de la 
  lógica proposicional y de primer orden, también se pueden usar las 
  reglas notnotI y mt que demostramos a  continuación.›
text ‹Nota 3: En el proceso de corrección del ejercicio, y antes de la
  publicación de las calificaciones del mismo, se podrá requerir
  aclaraciones sobre su respuesta. Estas aclaraciones se harán por 
  alguno de los procedimientos virtuales previstos en la PEV. ›
lemma notnotI: "P ⟹ ¬¬ P"
  by auto
lemma mt: "⟦F ⟶ G; ¬G⟧ ⟹ ¬F"
  by auto
text ‹------------------------------------------------------------------
  Se define la función
     elimina :: nat ⇒ 'a list ⇒ 'a list
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros
  elementos de xs. Por ejemplo, 
     elimina 2 [a,c,d,b,e] = [d,b,e]
  ---------------------------------------------------------------------›
fun elimina :: "nat ⇒ 'a list ⇒ 'a list" where
  "elimina n []             = []"
| "elimina 0 xs             = xs"
| "elimina (Suc n) (x # xs) = elimina n xs"
text ‹------------------------------------------------------------------ 
  Se define la función
     estaEn :: 'a ⇒ 'a list ⇒ bool
  tal que (estaEn x xs) se verifica si el elemento x está en la lista
  xs. Por ejemplo, 
     estaEn (2::nat) [3,2,4] = True
     estaEn (1::nat) [3,2,4] = False
  ---------------------------------------------------------------------›
fun estaEn :: "'a ⇒ 'a list ⇒ bool" where
  "estaEn x []       = False"
| "estaEn x (a # xs) = (a = x ∨ estaEn x xs)"
text ‹------------------------------------------------------------------
  Ejercicio: Demostrar que
     estaEn x (elimina n xs) ⟶ estaEn x xs
  + En lenguaje natural
  + En Isabelle/HOL, de forma detallada. Es opcional hacerlo de forma
    declarativa o aplicativa.
  Nota: Es recomendable pasar de la demostración en lenguaje natural a la 
  demostración estructurada. Y, a continuación, detallar los pasos de 
  simplificación hasta llegar a usar sólo el método (simp only:..).
 ----------------------------------------------------------------------›
― ‹Demostración en lenguaje natural
›
― ‹Demostración detallada›
lemma 
  "estaEn x (elimina n xs) ⟶ estaEn x xs"
  oops
text ‹------------------------------------------------------------------ 
  Ejercicio 2. Demostrar que si la relación binaria R verifica la 
  siguiente condición
     ∃y z. (∀x. ¬R(x, y)) ∨ (∀x. ¬R(x, z)))
  entonces no se verifica que
    ∀y z. ∃x. (R(x,y) ∧ R(x,z)))
  Nota: Hacer la demostración de forma detallada. Es opcional hacerla 
  de forma declarativa o aplicativa.
  --------------------------------------------------------------------›
― ‹Demostración detallada›
lemma 
  "(∃y z. ((∀x. ¬R(x, y)) ∨ (∀x. ¬R(x, z))))
  ⟶ ¬ (∀y z. ∃x. (R(x,y) ∧ R(x,z)))"
  oops
end