<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?action=history&amp;feed=atom&amp;title=T2_sol</id>
	<title>T2 sol - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?action=history&amp;feed=atom&amp;title=T2_sol"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T2_sol&amp;action=history"/>
	<updated>2026-07-18T02:25:05Z</updated>
	<subtitle>Historial de revisiones para esta página en el wiki</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T2_sol&amp;diff=1184&amp;oldid=prev</id>
		<title>Mjoseh: Protegió «T2 sol» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T2_sol&amp;diff=1184&amp;oldid=prev"/>
		<updated>2020-05-18T16:07:32Z</updated>

		<summary type="html">&lt;p&gt;Protegió «&lt;a href=&quot;/~jalonso/LMF2020/index.php/T2_sol&quot; title=&quot;T2 sol&quot;&gt;T2 sol&lt;/a&gt;» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;es&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revisión del 16:07 18 may 2020&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;es&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(Sin diferencias)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T2_sol&amp;diff=1183&amp;oldid=prev</id>
		<title>Mjoseh: Página creada con «&lt;source lang =&quot;isabelle&quot;&gt; text ‹Ejercicio 2 de Lógica Matemática y Fundamentos (12-mayo-2020)›  theory Ejercicio_2_sol imports Main  begin  lemma notnotI: &quot;P ⟹ ¬¬…»</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T2_sol&amp;diff=1183&amp;oldid=prev"/>
		<updated>2020-05-18T16:07:18Z</updated>

		<summary type="html">&lt;p&gt;Página creada con «&amp;lt;source lang =&amp;quot;isabelle&amp;quot;&amp;gt; text ‹Ejercicio 2 de Lógica Matemática y Fundamentos (12-mayo-2020)›  theory Ejercicio_2_sol imports Main  begin  lemma notnotI: &amp;quot;P ⟹ ¬¬…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang =&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
text ‹Ejercicio 2 de Lógica Matemática y Fundamentos (12-mayo-2020)›&lt;br /&gt;
&lt;br /&gt;
theory Ejercicio_2_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&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;
  Se define 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;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Se define la función&lt;br /&gt;
     filtra :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (filtra p xs) es la lista de los elementos de xs que cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     filtra (λx. x&amp;gt;(1::nat)) [2,6,4] = [2, 6, 4]&lt;br /&gt;
     filtra (λx. x&amp;gt;(4::nat)) [2,6,4] = [6]&lt;br /&gt;
  ----------------------------------------------------------------- ›&lt;br /&gt;
&lt;br /&gt;
fun filtra :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;filtra p []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;filtra p (x#xs) = (if p x &lt;br /&gt;
                      then x # filtra p xs &lt;br /&gt;
                      else filtra p xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹Ejercicio: Demostrar que todos los elementos de la lista &lt;br /&gt;
  (filtra p xs) verifican el predicado p, de las formas siguientes:&lt;br /&gt;
  + En lenguaje natural&lt;br /&gt;
  + En Isabelle/HOL, de forma detallada. Es opcional hacerlo de forma&lt;br /&gt;
    declarativa o aplicativa.&lt;br /&gt;
&lt;br /&gt;
  Nota: Es recomendable pasar de la demostración en lenguaje natural a la &lt;br /&gt;
  demostración estructurada. Y, a continuación, detallar los pasos de &lt;br /&gt;
  simplificación hasta llegar a usar sólo el método (simp only:..).&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración automática›&lt;br /&gt;
lemma &amp;quot;todos p (filtra p 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;
― ‹Demostración en lenguaje natural&lt;br /&gt;
Por inducción en xs.&lt;br /&gt;
&lt;br /&gt;
+ Caso base: xs = []&lt;br /&gt;
      todos (filtra p [])&lt;br /&gt;
    = todos []               (por def. de filtra)&lt;br /&gt;
    = True                   (por def. de todos)&lt;br /&gt;
&lt;br /&gt;
+ Paso inductivo: Sean x un elemento y xs una lista de elementos.&lt;br /&gt;
    La hipótesis de inducción (HI) es &amp;quot;todos p (filtra p xs)&amp;quot; &lt;br /&gt;
    Hay que probar que &amp;quot;todos p (filtra p (x#xs))&amp;quot;&lt;br /&gt;
    Consideramos los dos casos siguientes:&lt;br /&gt;
&lt;br /&gt;
    + Caso 1: Supongamos que se verifica &amp;quot;p x&amp;quot;. Entonces,&lt;br /&gt;
        todos p (filtra p (x#xs))&lt;br /&gt;
      = todos p (x # filtra p xs)     (por def. de filtra)&lt;br /&gt;
      = p x /\ todos p (filtra p xs)  (por def. de todos)&lt;br /&gt;
      = True                          (por HI y caso 1)     &lt;br /&gt;
&lt;br /&gt;
    + Caso 2: Supongamos que no se verifica &amp;quot;p x&amp;quot;. Entonces,&lt;br /&gt;
         todos p (filtra p (x#xs))&lt;br /&gt;
       = todos p (filtra p xs)          (por def. de filtra)&lt;br /&gt;
       = True                           (por HI)&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración aplicativa detallada›&lt;br /&gt;
lemma &amp;quot;todos p (filtra p xs)&amp;quot;&lt;br /&gt;
  apply (induct xs)&lt;br /&gt;
   apply (simp only: filtra.simps(1)&lt;br /&gt;
      todos.simps(1))&lt;br /&gt;
  apply (simp only: filtra.simps(2))&lt;br /&gt;
  apply (split if_split)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (simp only: todos.simps(2))&lt;br /&gt;
   apply (rule impI)&lt;br /&gt;
   apply (rule conjI, assumption)&lt;br /&gt;
   apply (simp only: implies_True_equals)&lt;br /&gt;
  apply (rule impI, assumption)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración estructurada›&lt;br /&gt;
lemma &amp;quot;todos p (filtra p xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos p (filtra p [])&amp;quot; &lt;br /&gt;
    by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;todos p (filtra p xs)&amp;quot;&lt;br /&gt;
  show &amp;quot;todos p (filtra p (x#xs))&amp;quot;&lt;br /&gt;
  proof cases&lt;br /&gt;
    assume &amp;quot;p x&amp;quot;&lt;br /&gt;
    then have 1: &amp;quot;filtra p (x#xs) = x # filtra p xs&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
    have &amp;quot;(p x ∧ todos p (filtra p xs))&amp;quot; &lt;br /&gt;
      using ‹p x› HI by (rule conjI)&lt;br /&gt;
    then show &amp;quot;todos p (filtra p (x#xs))&amp;quot; &lt;br /&gt;
      using 1 by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬ p x&amp;quot;&lt;br /&gt;
    then have 2: &amp;quot;filtra p (x#xs) = filtra p xs&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
    then show &amp;quot;todos p (filtra p (x#xs))&amp;quot; &lt;br /&gt;
      using 2 HI by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración declarativa detallada›&lt;br /&gt;
lemma &amp;quot;todos p (filtra p xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos p (filtra p [])&amp;quot; &lt;br /&gt;
    by (simp only: filtra.simps(1) todos.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;todos p (filtra p xs)&amp;quot;&lt;br /&gt;
  show &amp;quot;todos p (filtra p (x#xs))&amp;quot;&lt;br /&gt;
  proof cases&lt;br /&gt;
    assume &amp;quot;p x&amp;quot;&lt;br /&gt;
    then have 1: &amp;quot;filtra p (x#xs) = x # filtra p xs&amp;quot; &lt;br /&gt;
      by (simp only: filtra.simps(2) if_True)&lt;br /&gt;
    have &amp;quot;(p x ∧ todos p (filtra p xs))&amp;quot; &lt;br /&gt;
      using ‹p x› HI by (rule conjI)&lt;br /&gt;
    then have &amp;quot;todos p (x#(filtra p xs))&amp;quot; &lt;br /&gt;
      by (simp only: todos.simps(2))&lt;br /&gt;
    then show &amp;quot;todos p (filtra p (x#xs))&amp;quot; &lt;br /&gt;
      using 1 by (simp only: if_True)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬ p x&amp;quot;&lt;br /&gt;
    then have &amp;quot;filtra p (x#xs) = filtra p xs&amp;quot; &lt;br /&gt;
      by (simp only: filtra.simps(2) if_False)&lt;br /&gt;
    then show &amp;quot;todos p (filtra p (x#xs))&amp;quot; &lt;br /&gt;
      using HI by (simp only: if_True)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹2ª Demostración declarativa detallada›&lt;br /&gt;
lemma &amp;quot;todos p (filtra p xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos p (filtra p [])&amp;quot; &lt;br /&gt;
    by (simp only: filtra.simps(1) todos.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;todos p (filtra p xs)&amp;quot;&lt;br /&gt;
  show &amp;quot;todos p (filtra p (x#xs))&amp;quot;&lt;br /&gt;
  proof cases&lt;br /&gt;
    assume &amp;quot;p x&amp;quot;&lt;br /&gt;
    then have &amp;quot;todos p (filtra p (x#xs)) = todos p (x # filtra p xs)&amp;quot;&lt;br /&gt;
      by (simp only: filtra.simps(2) if_True)&lt;br /&gt;
    also have &amp;quot;… = (p x ∧ todos p (filtra p xs))&amp;quot; &lt;br /&gt;
      by (simp only: todos.simps(2))&lt;br /&gt;
    also have &amp;quot;… = (True ∧ True)&amp;quot; &lt;br /&gt;
      by (simp only: ‹p x› HI) &lt;br /&gt;
    also have &amp;quot;… = True&amp;quot;&lt;br /&gt;
      by (simp only: conj_absorb)&lt;br /&gt;
    finally show &amp;quot;todos p (filtra p (x#xs))&amp;quot;&lt;br /&gt;
      by (simp only: eq_True)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬ p x&amp;quot;&lt;br /&gt;
    then have &amp;quot;todos p (filtra p (x#xs)) = todos p (filtra p xs)&amp;quot;&lt;br /&gt;
      by (simp only: filtra.simps(2) if_False)&lt;br /&gt;
    also have &amp;quot;… = True&amp;quot;&lt;br /&gt;
      by (simp only: HI)&lt;br /&gt;
    finally show &amp;quot;todos p (filtra p (x#xs))&amp;quot;&lt;br /&gt;
      by (simp only: eq_True)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración declarativa detallada con lemas auxiliares›&lt;br /&gt;
lemma filtraTrue: &lt;br /&gt;
  assumes &amp;quot;p x&amp;quot;&lt;br /&gt;
  shows &amp;quot;filtra p (x#xs) = x# filtra p xs&amp;quot;&lt;br /&gt;
  using assms &lt;br /&gt;
  by (simp only: filtra.simps(2) if_True)&lt;br /&gt;
&lt;br /&gt;
lemma filtraFalse: &lt;br /&gt;
  assumes &amp;quot;¬ p x&amp;quot;&lt;br /&gt;
  shows &amp;quot;filtra p (x#xs) = filtra p xs&amp;quot;&lt;br /&gt;
  using assms &lt;br /&gt;
  by (simp only: filtra.simps(2) if_False)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;todos p (filtra p xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos p (filtra p [])&amp;quot; &lt;br /&gt;
    by (simp only: filtra.simps(1) todos.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;todos p (filtra p xs)&amp;quot;&lt;br /&gt;
  show &amp;quot;todos p (filtra p (x#xs))&amp;quot;&lt;br /&gt;
  proof cases&lt;br /&gt;
    assume &amp;quot;p x&amp;quot;&lt;br /&gt;
    then have 1: &amp;quot;filtra p (x#xs) = x # filtra p xs&amp;quot; &lt;br /&gt;
      by (rule filtraTrue)&lt;br /&gt;
    have &amp;quot;(p x ∧ todos p (filtra p xs))&amp;quot; &lt;br /&gt;
      using ‹p x› HI by (rule conjI)&lt;br /&gt;
    then have &amp;quot;todos p (x#(filtra p xs))&amp;quot; &lt;br /&gt;
      by (simp only: todos.simps(2))&lt;br /&gt;
    then show &amp;quot;todos p (filtra p (x#xs))&amp;quot; &lt;br /&gt;
      using 1 by (simp only: if_True)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬ p x&amp;quot;&lt;br /&gt;
    then have &amp;quot;filtra p (x#xs) = filtra p xs&amp;quot; &lt;br /&gt;
      by (rule filtraFalse)&lt;br /&gt;
    then show &amp;quot;todos p (filtra p (x#xs))&amp;quot; &lt;br /&gt;
      using HI by (simp only: if_True)&lt;br /&gt;
  qed&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>
</feed>