<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/DAO2011/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jalonso</id>
	<title>Demostración asistida por ordenador (2011-12) - Contribuciones del usuario [es]</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/DAO2011/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jalonso"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php/Especial:Contribuciones/Jalonso"/>
	<updated>2026-07-18T02:31:24Z</updated>
	<subtitle>Contribuciones del usuario</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=DAO2011_(Demostraci%C3%B3n_asistida_por_ordenador)&amp;diff=80</id>
		<title>DAO2011 (Demostración asistida por ordenador)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=DAO2011_(Demostraci%C3%B3n_asistida_por_ordenador)&amp;diff=80"/>
		<updated>2018-07-15T18:19:58Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Este curso es una introducción a la demostración asistida por ordenador usando el sistema [http://www.cl.cam.ac.uk/research/hvg/Isabelle Isabelle/HOL/Isar]). Los objetivos del curso son:&lt;br /&gt;
* desarrollar la capacidad de razonamiento lógico,&lt;br /&gt;
* conocer formalismos de representación del conocimiento matemático,&lt;br /&gt;
* saber usar sistemas de razonamiento y&lt;br /&gt;
* desarrollar teorías matemáticas en sistemas de demostración automática. &lt;br /&gt;
&lt;br /&gt;
Administrativamente, es un [http://www.cfp.us.es/web/ficha_avanzada.asp?id_titulo=846&amp;amp;tipo=FE&amp;amp;basica=1&amp;amp;curso=2010 curso de formación especializada] del [http://www.cfp.us.es/ Centro de Formación Permanente de la Universidad de Sevilla].&lt;br /&gt;
&lt;br /&gt;
== Material para el curso ==&lt;br /&gt;
* [[Temas]]: Teorías de los temas.&lt;br /&gt;
* [[Ejercicios]]: Relaciones de ejercicios.&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao/doc.html Documentación]: Enlaces con documentación.&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao/sistemas.html Sistemas]: Sistemas utilizados.&lt;br /&gt;
* [http://www.glc.us.es/~jalonso/vestigium/tag/dao2011/ Diario]: Descripción diaria de las clases.&lt;br /&gt;
&lt;br /&gt;
== Razonamiento automático (2011-12) ==&lt;br /&gt;
* [[Tema 6: Isabelle como un lenguaje funcional]].&lt;br /&gt;
* [[Tema 7: El lenguaje de demostración Isar]].&lt;br /&gt;
* [[Tema 8: Distinción de casos e inducción]].&lt;br /&gt;
* [[Tema 9: Patrones de demostración]].&lt;br /&gt;
* [[Tema 10: Heurísticas para la inducción y recursión general]].&lt;br /&gt;
* [[Tema 11: Caso de estudio: Compilación de expresiones]].&lt;br /&gt;
* [[Tema 12: Conjuntos, funciones y relaciones]].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_4_ej&amp;diff=79</id>
		<title>Tema 4 ej</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_4_ej&amp;diff=79"/>
		<updated>2018-07-15T18:18:38Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
theory Relacion_10&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
section {* Deducción natural de primer orden *}&lt;br /&gt;
&lt;br /&gt;
text {* Los ejercicios de esta relación deben de resolverse usando sólo&lt;br /&gt;
  las reglas básicas de la deducción natural proposicional y de primer &lt;br /&gt;
  orden:&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;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀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;
&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;
lemma ejercicio_1:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_8:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_9:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_11:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_12:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_14:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_15:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_17:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_19:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_20:&lt;br /&gt;
  assumes &amp;quot;∀x.∀y.∀z. R x y ∧ R y z ⟶ R x z&amp;quot; and&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21:&lt;br /&gt;
  assumes &amp;quot;∀x. P x ∨ Q x&amp;quot; and&lt;br /&gt;
          &amp;quot;∃x. ¬Q x&amp;quot; and&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_22:&lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x ∨ R x&amp;quot; and&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_23:&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;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_3_ej&amp;diff=78</id>
		<title>Tema 3 ej</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_3_ej&amp;diff=78"/>
		<updated>2018-07-15T18:18:20Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
header {* Deducción natural proposicional *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_3_ej&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {* Los ejercicios de esta relación deben de resolverse usando sólo&lt;br /&gt;
  las reglas básicas de la deducción natural proposicional: &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;
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;
lemma ejercicio_1:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5:&lt;br /&gt;
  &amp;quot;p⟶(q⟶r) ⟹ q⟶(p⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6:&lt;br /&gt;
  &amp;quot;p⟶(q⟶r) ⟹ (p⟶q)⟶(p⟶r)&amp;quot;&lt;br /&gt;
oops &lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7:&lt;br /&gt;
  &amp;quot;p ⟹ q⟶p&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_9:&lt;br /&gt;
  &amp;quot;p⟶q ⟹ (q⟶r)⟶(p⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10:&lt;br /&gt;
  &amp;quot;p⟶(q⟶(r⟶s)) ⟹ r⟶(q⟶(p⟶s))&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_12:&lt;br /&gt;
  &amp;quot;(p⟶q)⟶r ⟹ p⟶(q⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13:&lt;br /&gt;
  &amp;quot;⟦p; q⟧ ⟹ p∧q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_14:&lt;br /&gt;
  &amp;quot;p∧q ⟹ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_15:&lt;br /&gt;
  &amp;quot;p∧q ⟹ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16:&lt;br /&gt;
  &amp;quot;p∧(q∧r) ⟹ (p∧q)∧r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_17:&lt;br /&gt;
  &amp;quot;(p∧q)∧r ⟹ p∧(q∧r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18:&lt;br /&gt;
  &amp;quot;p∧q ⟹ p⟶q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_19:&lt;br /&gt;
  &amp;quot;(p⟶q)∧(p⟶r) ⟹ p⟶q∧r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_20:&lt;br /&gt;
  &amp;quot;p⟶q∧r ⟹ (p⟶q)∧(p⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21:&lt;br /&gt;
  &amp;quot;p⟶(q⟶r) ⟹ p∧q⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_22:&lt;br /&gt;
  &amp;quot;p∧q⟶r ⟹ p⟶(q⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_23:&lt;br /&gt;
  &amp;quot;(p⟶q)⟶r ⟹ p∧q⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_24:&lt;br /&gt;
  &amp;quot;p∧(q⟶r) ⟹ (p⟶q)⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_25:&lt;br /&gt;
  &amp;quot;p ⟹ p∨q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_26:&lt;br /&gt;
  &amp;quot;q ⟹ p∨q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_27:&lt;br /&gt;
  &amp;quot;p∨q ⟹ q∨p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_28:&lt;br /&gt;
  &amp;quot;q⟶r ⟹ p∨q⟶p∨r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_29:&lt;br /&gt;
  &amp;quot;p∨p ⟹ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_30:&lt;br /&gt;
  &amp;quot;p ⟹ p∨p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_31:&lt;br /&gt;
  &amp;quot;p∨(q∨r) ⟹ (p∨q)∨r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_32:&lt;br /&gt;
  &amp;quot;(p∨q)∨r ⟹ p∨(q∨r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_33:&lt;br /&gt;
  &amp;quot;p∧(q∨r) ⟹ (p∧q)∨(p∧r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_34:&lt;br /&gt;
  &amp;quot;(p∧q)∨(p∧r) ⟹ p∧(q∨r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_35:&lt;br /&gt;
  &amp;quot;p∨(q∧r) ⟹ (p∨q)∧(p∨r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_36:&lt;br /&gt;
  &amp;quot;(p∨q)∧(p∨r) ⟹ p∨(q∧r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_37:&lt;br /&gt;
  &amp;quot;(p⟶r)∧(q⟶r) ⟹ p∨q⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_38:&lt;br /&gt;
  &amp;quot;p∨q⟶r ⟹ (p⟶r)∧(q⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_39:&lt;br /&gt;
  &amp;quot;p ⟹ ¬¬p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_40:&lt;br /&gt;
  &amp;quot;¬p ⟹ p⟶q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_41:&lt;br /&gt;
  &amp;quot;p⟶q ⟹ ¬q⟶¬p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_42:&lt;br /&gt;
  &amp;quot;⟦p∨q; ¬q⟧ ⟹ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_43:&lt;br /&gt;
  &amp;quot;⟦p∨q; ¬p⟧ ⟹ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_44:&lt;br /&gt;
  &amp;quot;p∨q ⟹ ¬(¬p∧¬q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_45:&lt;br /&gt;
  &amp;quot;p∧q ⟹ ¬(¬p∨¬q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_46:&lt;br /&gt;
  &amp;quot;¬(p∨q) ⟹ ¬p∧¬q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_47:&lt;br /&gt;
  &amp;quot;¬p∧¬q ⟹ ¬(p∨q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_48:&lt;br /&gt;
  &amp;quot;¬p∨¬q ⟹ ¬(p∧q)&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_50:&lt;br /&gt;
  &amp;quot;p∧¬p ⟹ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_51:&lt;br /&gt;
  &amp;quot;¬¬p ⟹ p&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_53:&lt;br /&gt;
  &amp;quot;((p⟶q)⟶p)⟶p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_54:&lt;br /&gt;
  &amp;quot;¬q⟶¬p ⟹ p⟶q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_55:&lt;br /&gt;
  &amp;quot;¬(¬p∧¬q) ⟹ p∨q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_56:&lt;br /&gt;
  &amp;quot;¬(¬p∨¬q) ⟹ p∧q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_57:&lt;br /&gt;
  &amp;quot;¬(p∧q) ⟹ ¬p∨¬q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_58:&amp;quot;(p⟶q)∨(q⟶p)&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>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Rel_1&amp;diff=77</id>
		<title>Rel 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Rel_1&amp;diff=77"/>
		<updated>2018-07-15T18:17:56Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
header {* Razonamiento en Isabelle sobre programas *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_1&lt;br /&gt;
imports Main Efficient_Nat&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     sumaImpares :: &amp;quot;nat ⇒ nat&amp;quot;&lt;br /&gt;
  tal que (sumaImpares n) es la suma de los n primeros números&lt;br /&gt;
  impares. Por ejemplo,&lt;br /&gt;
     sumaImpares 5  =  25&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que &lt;br /&gt;
     sumaImpares n = n*n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot;&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;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar que &lt;br /&gt;
     sumaPotenciasDeDosMasUno n = 2^(n+1)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     copia :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&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 2 = [2,2,2]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot;&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;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. 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;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la función&lt;br /&gt;
    factR :: &amp;quot;nat ⇒ nat&amp;quot;&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;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Se considera la siguiente definición iterativa de la&lt;br /&gt;
  función factorial &lt;br /&gt;
     factI :: Integer -&amp;gt; Integer&lt;br /&gt;
     factI n = factI&amp;#039; n 1&lt;br /&gt;
     &lt;br /&gt;
     factI&amp;#039; :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
     factI&amp;#039; 0     x = x                  -- factI&amp;#039;.1&lt;br /&gt;
     factI&amp;#039; (n+1) x = factI&amp;#039; n (n+1)*x   -- factI&amp;#039;.2&lt;br /&gt;
  Comprobar con QuickCheck que factI y factR son equivalentes sobre los&lt;br /&gt;
  números naturales.&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que, para todo n y todo x, se tiene &lt;br /&gt;
     factI&amp;#039; n x = x * factR n&lt;br /&gt;
  y, como corolario, que&lt;br /&gt;
     factI n = factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Definir, recursivamente y sin usar (@). la función&lt;br /&gt;
     amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&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 [2,5] 3 = [2,5,3]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar que &lt;br /&gt;
     amplia xs y = xs @ [y]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Ejercicios&amp;diff=76</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Ejercicios&amp;diff=76"/>
		<updated>2018-07-15T18:17:42Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Ejercicios de Demostración asistida por ordenador */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ejercicios de &amp;#039;&amp;#039;Demostración asistida por ordenador&amp;#039;&amp;#039; ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 2:&amp;#039;&amp;#039;&amp;#039; Razonamiento sobre programas ([[Rel_1|Enunciado]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 3:&amp;#039;&amp;#039;&amp;#039; Deducción natural proposicional con Isabelle ([[Tema_3_ej|Enunciado]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 4:&amp;#039;&amp;#039;&amp;#039; Deducción natural en lógica de primer orden con Isabelle ([[Tema_4_ej|Enunciado]]).&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_4:_Deducci%C3%B3n_natural_en_l%C3%B3gica_de_primer_orden_con_Isabelle&amp;diff=75</id>
		<title>Tema 4: Deducción natural en lógica de primer orden con Isabelle</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_4:_Deducci%C3%B3n_natural_en_l%C3%B3gica_de_primer_orden_con_Isabelle&amp;diff=75"/>
		<updated>2018-07-15T18:16:51Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
header {* Deducción natural en la lógica de primer orden *}&lt;br /&gt;
&lt;br /&gt;
theory LogicaDePrimerOrdenEj&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En esta teoría se presentan los ejemplos del tema de deducción natural&lt;br /&gt;
  en lógica de primer orden siguiendo la presentación de Huth y Ryan en su&lt;br /&gt;
  libro  &amp;quot;Logic in Computer Science&amp;quot;&lt;br /&gt;
  http://www.cs.bham.ac.uk/research/projects/lics/ y, más concretamente, &lt;br /&gt;
  a la forma como se explica en la asignatura de &amp;quot;Lógica informática&amp;quot; y&lt;br /&gt;
  que puede verse en http://www.cs.us.es/~jalonso/cursos/li/temas/tema-7.pdf &lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas del modus tollen y de la introducción de la&lt;br /&gt;
  doble negación.&lt;br /&gt;
*}&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;
lemma notnotI:&lt;br /&gt;
  &amp;quot;P ⟹ ¬¬P&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;P(c)&amp;quot; and&lt;br /&gt;
          &amp;quot;∀x. (P(x) ⟶ ¬Q(x))&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬Q(c)&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 1: &amp;quot;Q(c)&amp;quot;&lt;br /&gt;
  have 2: &amp;quot;P(c) ⟶ ¬Q(c)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
  have 3: &amp;quot;¬¬Q(c)&amp;quot; using 1 by (rule notnotI)&lt;br /&gt;
  have 4: &amp;quot;¬P(c)&amp;quot; using 2 3 by (rule mt)&lt;br /&gt;
  thus &amp;quot;False&amp;quot; using assms(1) by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;∀x. (P x ⟶ ¬(Q x))&amp;quot; and&lt;br /&gt;
          &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  shows &amp;quot;∀x. ¬(Q x)&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
  fix x&lt;br /&gt;
  have 1: &amp;quot;P x ⟶ ¬(Q x)&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
  have 2: &amp;quot;P x&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
  show &amp;quot;¬(Q x)&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &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;
  fix a&lt;br /&gt;
  have &amp;quot;P a&amp;quot; using assms by (rule allE)&lt;br /&gt;
  thus &amp;quot;∃x. P x&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  assumes &amp;quot;∀x. (P x ⟶ Q x)&amp;quot; and&lt;br /&gt;
          &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃x. Q x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain a where 1: &amp;quot;P a&amp;quot; using assms(2) by (rule exE)&lt;br /&gt;
  have 2: &amp;quot;P a ⟶ Q a&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
  have &amp;quot;Q a&amp;quot; using 2 1 by (rule mp)&lt;br /&gt;
  thus &amp;quot;∃x. Q x&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;∀x. (Q x ⟶ R x)&amp;quot; and&lt;br /&gt;
          &amp;quot;∃x . (P x ∧ Q x)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃x . (P x ∧ R x)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain a where 1: &amp;quot;P a ∧ Q a&amp;quot; using assms(2) by (rule exE)&lt;br /&gt;
  have 2: &amp;quot;Q a ⟶ R a&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
  have 3: &amp;quot;Q a&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  have 4: &amp;quot;R a&amp;quot; using 2 3 by (rule mp)&lt;br /&gt;
  have 5: &amp;quot;P a&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  hence &amp;quot;P a ∧ R a&amp;quot; using 4 by (rule conjI)&lt;br /&gt;
  thus &amp;quot;∃x . (P x ∧ R x)&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;∃x. P x&amp;quot; and&lt;br /&gt;
          &amp;quot;∀x.∀y. (P x ⟶ Q y)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∀y. Q y&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
  fix b&lt;br /&gt;
  obtain a where 1: &amp;quot;P a&amp;quot; using assms(1) by (rule exE)&lt;br /&gt;
  have &amp;quot;∀y. (P a ⟶ Q y)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
  hence &amp;quot;P a ⟶ Q b&amp;quot; by (rule allE)&lt;br /&gt;
  thus &amp;quot;Q b&amp;quot; using 1 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &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 notI) &lt;br /&gt;
  assume 1: &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  obtain a where 2: &amp;quot;¬P a&amp;quot; using assms(1) by (rule exE)&lt;br /&gt;
  have 3: &amp;quot;P a&amp;quot; using 1 by (rule allE)&lt;br /&gt;
  show False using 2 3 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &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 (rule disjE)&lt;br /&gt;
  { assume 1: &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
    show &amp;quot;∀x. P x ∨ Q x&amp;quot;&lt;br /&gt;
    proof (rule allI)&lt;br /&gt;
      fix x&lt;br /&gt;
      have &amp;quot;P x&amp;quot; using 1 by (rule allE)&lt;br /&gt;
      thus &amp;quot;P x ∨ Q x&amp;quot; by (rule disjI1)&lt;br /&gt;
    qed }&lt;br /&gt;
next&lt;br /&gt;
  { assume 2: &amp;quot;∀x. Q x&amp;quot;&lt;br /&gt;
    show &amp;quot;∀x. P x ∨ Q x&amp;quot;&lt;br /&gt;
    proof (rule allI)&lt;br /&gt;
      fix x&lt;br /&gt;
      have &amp;quot;Q x&amp;quot; using 2 by (rule allE)&lt;br /&gt;
      thus &amp;quot;P x ∨ Q x&amp;quot; by (rule disjI2)&lt;br /&gt;
    qed }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &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 (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  show &amp;quot;∀x. Q x&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
    fix x &lt;br /&gt;
    have 2: &amp;quot;P x ⟶ Q x&amp;quot; using assms by (rule allE)&lt;br /&gt;
    have 3: &amp;quot;P x&amp;quot; using 1 by (rule allE)&lt;br /&gt;
    show &amp;quot;Q x&amp;quot; using 2 3 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &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 (rule allI)&lt;br /&gt;
  fix a&lt;br /&gt;
  show &amp;quot;P a&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &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 (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;∀x. ¬Q x&amp;quot;&lt;br /&gt;
  show &amp;quot;∀x. ¬P x&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
    fix x&lt;br /&gt;
    have 2: &amp;quot;P x ⟶ Q x&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
    have 3: &amp;quot;¬Q x&amp;quot; using 1 by (rule allE)&lt;br /&gt;
    show &amp;quot;¬P x&amp;quot; using 2 3 by (rule mt)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &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 (rule notI)&lt;br /&gt;
  assume &amp;quot;∃x. P x ∧ Q x&amp;quot;&lt;br /&gt;
  then obtain a where 1: &amp;quot;P a ∧ Q a&amp;quot; by (rule exE)&lt;br /&gt;
  have 2: &amp;quot;P a ⟶ ¬Q a&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
  have 3: &amp;quot;P a&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;¬Q a&amp;quot; using 2 3 by (rule mp)&lt;br /&gt;
  have 5: &amp;quot;Q a&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show False using 4 5 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &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 u&lt;br /&gt;
  show &amp;quot;∀v. P u v&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
    fix v&lt;br /&gt;
    have &amp;quot;∀y. P u y&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
    thus &amp;quot;P u v&amp;quot; by (rule allE)&lt;br /&gt;
  qed &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &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(1) by (rule exE)&lt;br /&gt;
  then obtain b where &amp;quot;P a b&amp;quot; by (rule exE)&lt;br /&gt;
  hence &amp;quot;∃v. P a v&amp;quot; by (rule exI)&lt;br /&gt;
  thus &amp;quot;∃u. ∃v. P u v&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &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 (rule allI)&lt;br /&gt;
  fix y&lt;br /&gt;
  obtain a where &amp;quot;∀y. P a y&amp;quot; using assms(1) by (rule exE)&lt;br /&gt;
  hence &amp;quot;P a y&amp;quot; by (rule allE)&lt;br /&gt;
  thus &amp;quot;∃x. P x y&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &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 (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;P a&amp;quot;&lt;br /&gt;
  obtain b where &amp;quot;P a ⟶ Q b&amp;quot; using assms(1) by (rule exE)&lt;br /&gt;
  hence &amp;quot;Q b&amp;quot; using 1 by (rule mp)&lt;br /&gt;
  thus &amp;quot;∃x. Q x&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &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; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume &amp;quot;¬P a&amp;quot;&lt;br /&gt;
      hence &amp;quot;P a ⟶ Q b&amp;quot; by simp&lt;br /&gt;
      thus &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume &amp;quot;P a&amp;quot;&lt;br /&gt;
      hence &amp;quot;∃x. Q x&amp;quot; using assms(1) by simp&lt;br /&gt;
      then obtain c where &amp;quot;Q c&amp;quot; by (rule exE)&lt;br /&gt;
      hence &amp;quot;P a ⟶ Q c&amp;quot; by simp&lt;br /&gt;
      thus &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI) }&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &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 (rule allI)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;P x ⟶ Q a&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;P x&amp;quot;&lt;br /&gt;
    hence 1: &amp;quot;∃x. P x&amp;quot; by (rule exI)&lt;br /&gt;
    show &amp;quot;Q a&amp;quot; using assms(1) 1 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &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 (rule exI)&lt;br /&gt;
  show &amp;quot;P b ⟶ Q a&amp;quot; using assms(1) ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &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 1: &amp;quot;P a ∧ Q a&amp;quot; using assms(1) by (rule exE)&lt;br /&gt;
  hence &amp;quot;P a&amp;quot; by (rule conjunct1)&lt;br /&gt;
  hence 2: &amp;quot;∃x. P x&amp;quot; by (rule exI)&lt;br /&gt;
  have &amp;quot;Q a&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  hence 3: &amp;quot;∃x. Q x&amp;quot; by (rule exI)&lt;br /&gt;
  show &amp;quot;(∃x. P x) ∧ (∃x. Q x)&amp;quot; using 2 3 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &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 (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;∃y. P y&amp;quot;&lt;br /&gt;
  show &amp;quot;∀x. Q x&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
    fix x&lt;br /&gt;
    have 2: &amp;quot;∀y. P y ⟶ Q x&amp;quot; using assms by (rule allE)&lt;br /&gt;
    obtain b where 3: &amp;quot;P b&amp;quot; using 1 by (rule exE)&lt;br /&gt;
    have &amp;quot;P b ⟶ Q x&amp;quot; using 2 by (rule allE)&lt;br /&gt;
    thus &amp;quot;Q x&amp;quot; using 3 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &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 1: &amp;quot;¬(∃x. P x)&amp;quot;&lt;br /&gt;
  have 2: &amp;quot;∀x. ¬P x&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix x&lt;br /&gt;
    show &amp;quot;¬P x&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;P x&amp;quot;&lt;br /&gt;
      hence 3: &amp;quot;∃x. P x&amp;quot; by (rule exI)&lt;br /&gt;
      show False using 1 3 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  show False using assms(1) 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &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 notI)&lt;br /&gt;
  assume &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
  then obtain a where 1: &amp;quot;P a&amp;quot; by (rule exE)&lt;br /&gt;
  have &amp;quot;¬P a&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
  thus False using 1 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &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 notI)&lt;br /&gt;
  assume 1: &amp;quot;∀x. ¬P x&amp;quot;&lt;br /&gt;
  obtain a where 2: &amp;quot;P a&amp;quot; using assms(1) by (rule exE)&lt;br /&gt;
  have &amp;quot;¬P a&amp;quot; using 1 by (rule allE)&lt;br /&gt;
  thus False using 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &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 (rule allI)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;P a ⟶ Q x&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume 1: &amp;quot;P a&amp;quot;&lt;br /&gt;
    have &amp;quot;∀x. Q x&amp;quot; using assms(1) 1 by (rule mp)&lt;br /&gt;
    thus &amp;quot;Q x&amp;quot; by (rule allE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;∀x.∀y.∀z. R x y ∧ R y z ⟶ R x z&amp;quot; and&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 x&lt;br /&gt;
  show &amp;quot;∀y. R x y ⟶ ¬R y x&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
    fix y&lt;br /&gt;
    show &amp;quot;R x y ⟶ ¬R y x&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume 1: &amp;quot;R x y&amp;quot;&lt;br /&gt;
      show &amp;quot;¬R y x&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        assume 2: &amp;quot;R y x&amp;quot;&lt;br /&gt;
        have &amp;quot;∀y.∀z. R x y ∧ R y z ⟶ R x z&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
        hence &amp;quot;∀z. R x y ∧ R y z ⟶ R x z&amp;quot; by (rule allE)&lt;br /&gt;
        hence 3: &amp;quot;R x y ∧ R y x ⟶ R x x&amp;quot; by (rule allE)&lt;br /&gt;
        have 4: &amp;quot;R x y ∧ R y x&amp;quot; using 1 2 by (rule conjI)&lt;br /&gt;
        have 5: &amp;quot;R x x&amp;quot; using 3 4  by (rule mp)&lt;br /&gt;
        have &amp;quot;¬R x x&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
        thus False using 5 by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;∀x. P x ∨ Q x&amp;quot; and&lt;br /&gt;
          &amp;quot;∃x. ¬Q x&amp;quot; and&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 1: &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;
  thus &amp;quot;∃x. ¬R x&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume &amp;quot;P a&amp;quot;&lt;br /&gt;
      hence 2: &amp;quot;¬¬P a&amp;quot; by (rule notnotI)&lt;br /&gt;
      have &amp;quot;R a ⟶ ¬P a&amp;quot; using assms(3) by (rule allE)&lt;br /&gt;
      hence &amp;quot;¬R a&amp;quot; using 2 by (rule mt)&lt;br /&gt;
      thus &amp;quot;∃x. ¬R x&amp;quot; by (rule exI) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume 3: &amp;quot;Q a&amp;quot;&lt;br /&gt;
      show &amp;quot;∃x. ¬R x&amp;quot; using 1 3 by (rule notE) }&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;∀x. P x ⟶ Q x ∨ R x&amp;quot; and&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 x&lt;br /&gt;
  show &amp;quot;P x ⟶ Q x&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume 1: &amp;quot;P x&amp;quot;&lt;br /&gt;
    have &amp;quot;P x ⟶ Q x ∨ R x&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
    hence &amp;quot;Q x ∨ R x&amp;quot; using 1 by (rule mp)&lt;br /&gt;
    thus &amp;quot;Q x&amp;quot;&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
      { assume &amp;quot;Q x&amp;quot;&lt;br /&gt;
        thus &amp;quot;Q x&amp;quot; by this }&lt;br /&gt;
    next&lt;br /&gt;
      { assume 2: &amp;quot;R x&amp;quot;&lt;br /&gt;
        have &amp;quot;P x ∧ R x&amp;quot; using 1 2 by (rule conjI)&lt;br /&gt;
        hence 3: &amp;quot;∃x. P x ∧ R x&amp;quot; by (rule exI)&lt;br /&gt;
        show &amp;quot;Q x&amp;quot; using assms(2) 3 by (rule notE) }&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &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(1) by (rule exE)&lt;br /&gt;
  then obtain b where &amp;quot;R a b ∨ R b a&amp;quot; by (rule exE)&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; by (rule exI)&lt;br /&gt;
      thus &amp;quot;∃x.∃y. R x y&amp;quot; by (rule exI) }&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; by (rule exI)&lt;br /&gt;
      thus &amp;quot;∃x.∃y. R x y&amp;quot; by (rule exI) }&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_3:_Deducci%C3%B3n_l%C3%B3gica_proposicional_con_Isabelle&amp;diff=74</id>
		<title>Tema 3: Deducción lógica proposicional con Isabelle</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_3:_Deducci%C3%B3n_l%C3%B3gica_proposicional_con_Isabelle&amp;diff=74"/>
		<updated>2018-07-15T18:16:35Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
header {* Deducción natural proposicional *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En esta teoría se presentan los ejemplos del tema de deducción natural&lt;br /&gt;
  proposicional siguiendo la presentación de Huth y Ryan en su libro&lt;br /&gt;
  &amp;quot;Logic in Computer Science&amp;quot;&lt;br /&gt;
  http://www.cs.bham.ac.uk/research/projects/lics/ y, más concretamente,&lt;br /&gt;
  a la forma como se explica en la asignatura de &amp;quot;Lógica informática&amp;quot; y&lt;br /&gt;
  que puede verse en  &lt;br /&gt;
  http://www.cs.us.es/~jalonso/cursos/li/temas/tema-2.pdf&lt;br /&gt;
 &lt;br /&gt;
  La página al lado de cada teorema indica la página de las anteriores&lt;br /&gt;
  transparencias donde se encuentra la demostración.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Reglas de la conjunción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de introducción de la conjunción es&lt;br /&gt;
  · conjI:      ⟦P; Q⟧ ⟹ P ∧ Q&lt;br /&gt;
  Las reglas de eliminación de la conjunción son&lt;br /&gt;
  · conjunct1:  P ∧ Q ⟹ P&lt;br /&gt;
  · conjunct2:  P ∧ Q ⟹ Q  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 4&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;p ∧ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;r&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∧ r&amp;quot;     &lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;q ∧ r&amp;quot; using 3 2 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;(p ∧ q) ∧ r&amp;quot; and &lt;br /&gt;
          2: &amp;quot;s ∧ t&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∧ s&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;p ∧ q&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot; using 3 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;s&amp;quot; using 2 by (rule conjunct1)&lt;br /&gt;
  show &amp;quot;q ∧ s&amp;quot; using 4 5 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Reglas de la doble negación *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de eliminación de la doble negación es&lt;br /&gt;
  · notnotD: ¬¬ P ⟹ P&lt;br /&gt;
  Para ajustarnos al tema de LI vamos a introducir la siguiente regla de&lt;br /&gt;
  introducción de la doble negación&lt;br /&gt;
  . notnotI: P ⟹ ¬¬ P&lt;br /&gt;
  que, de momento, no detallamos su demostració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 -- &amp;quot;p. 5&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;p&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;
  have 3: &amp;quot;¬¬p&amp;quot; using 1 by (rule notnotI)&lt;br /&gt;
  have 4: &amp;quot;q ∧ r&amp;quot; using 2 by (rule notnotD)&lt;br /&gt;
  have 5: &amp;quot;r&amp;quot; using 4 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;¬¬p ∧ r&amp;quot; using 3 5 by (rule conjI)&lt;br /&gt;
qed        &lt;br /&gt;
&lt;br /&gt;
section {* Regla de eliminación del condicional *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de eliminación del condicional es la regla del modus ponens&lt;br /&gt;
  · mp: ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 6&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;¬p ∧ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;¬p ∧ q ⟶ r ∨ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;r ∨ ¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;r ∨ ¬p&amp;quot; using 2 1 by (rule mp)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 6&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p ⟶ q&amp;quot; and &lt;br /&gt;
          3: &amp;quot;p ⟶ (q ⟶ r)&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 2 1 by (rule mp)&lt;br /&gt;
  have 5: &amp;quot;q ⟶ r&amp;quot; using 3 1 by (rule mp)&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 5 4 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Regla derivada del modus tollens *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Para ajustarnos al tema de LI vamos a introducir la regla del modus&lt;br /&gt;
  tollens&lt;br /&gt;
  · mt: ⟦F ⟶ G; ¬G⟧ ⟹ ¬F &lt;br /&gt;
  sin, de momento, detallar su demostración.&lt;br /&gt;
*}&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;
lemma -- &amp;quot;p. 7&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p&amp;quot; and &lt;br /&gt;
          3: &amp;quot;¬r&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
  show &amp;quot;¬q&amp;quot; using 4 3 by (rule mt)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 7&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;¬p ⟶ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;¬q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;¬¬p&amp;quot; using 1 2 by (rule mt)&lt;br /&gt;
  show &amp;quot;p&amp;quot; using 3 by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ ¬q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;¬¬q&amp;quot; using 2 by (rule notnotI)&lt;br /&gt;
  show &amp;quot;¬p&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Regla de introducción del condicional *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de introducción del condicional es&lt;br /&gt;
  · impI: (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 8&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 3: &amp;quot;¬q&amp;quot;&lt;br /&gt;
    have &amp;quot;¬p&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
  } thus &amp;quot;¬q ⟶ ¬p&amp;quot; by (rule impI)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 8&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 3: &amp;quot;¬q&amp;quot;&lt;br /&gt;
  show &amp;quot;¬p&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 8&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 3: &amp;quot;¬q&amp;quot;&lt;br /&gt;
  show &amp;quot;¬p&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 9&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;¬q ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ ¬¬q&amp;quot;   &lt;br /&gt;
proof -&lt;br /&gt;
  { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;¬¬p&amp;quot; using 2 by (rule notnotI)&lt;br /&gt;
    have &amp;quot;¬¬q&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
  } thus &amp;quot;p ⟶ ¬¬q&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 9&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;¬q ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ ¬¬q&amp;quot;   &lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;¬¬p&amp;quot; using 2 by (rule notnotI)&lt;br /&gt;
  show &amp;quot;¬¬q&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 9&amp;quot;&lt;br /&gt;
  &amp;quot;p ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 10&amp;quot;&lt;br /&gt;
  &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 1: &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
    { assume 2: &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
      { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
        have 4: &amp;quot;¬¬p&amp;quot; using 3 by (rule notnotI)&lt;br /&gt;
        have 5: &amp;quot;¬¬q&amp;quot; using 2 4 by (rule mt)&lt;br /&gt;
        have 6: &amp;quot;q&amp;quot; using 5 by (rule notnotD)&lt;br /&gt;
        have &amp;quot;r&amp;quot; using 1 6 by (rule mp) &lt;br /&gt;
      } hence &amp;quot;p ⟶ r&amp;quot; by (rule impI)&lt;br /&gt;
    } hence &amp;quot;(¬q ⟶ ¬p) ⟶ p ⟶ r&amp;quot; by (rule impI)&lt;br /&gt;
  } thus &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ p ⟶ r)&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 10&amp;quot;&lt;br /&gt;
  &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  show &amp;quot;(¬q ⟶ ¬p) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume 2: &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
      show &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 4: &amp;quot;¬¬p&amp;quot; using 3 by (rule notnotI)&lt;br /&gt;
          have 5: &amp;quot;¬¬q&amp;quot; using 2 4 by (rule mt)&lt;br /&gt;
          have 6: &amp;quot;q&amp;quot; using 5 by (rule notnotD)&lt;br /&gt;
          show &amp;quot;r&amp;quot; using 1 6 by (rule mp)&lt;br /&gt;
        qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &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 2: &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 3: &amp;quot;q&amp;quot;&lt;br /&gt;
      have 4: &amp;quot;p ∧ q&amp;quot; using 2 3 by (rule conjI)&lt;br /&gt;
      show &amp;quot;r&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &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 2: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot; using 2 by (rule conjunct1)&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 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ r ⟶ q ∧ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ r&amp;quot;&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 1 3 by (rule mp)&lt;br /&gt;
  have 5: &amp;quot;r&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;q ∧ r&amp;quot; using 4 5 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Reglas de la disyunción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Las reglas de la introducción de la disyunción son&lt;br /&gt;
  · disjI1: P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2: Q ⟹ P ∨ Q&lt;br /&gt;
  La regla de elimación de la disyunción es&lt;br /&gt;
  · disjE:  ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 11&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
using 1&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;q ∨ p&amp;quot; using 2 by (rule disjI2) }&lt;br /&gt;
next&lt;br /&gt;
  { assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;q ∨ p&amp;quot; using 3 by (rule disjI1) }&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 12&amp;quot;&lt;br /&gt;
  assumes 1: &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 2: &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  thus &amp;quot;p ∨ r&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
      show &amp;quot;p ∨ r&amp;quot; using 3 by (rule disjI1) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume 4: &amp;quot;q&amp;quot;&lt;br /&gt;
      have 5: &amp;quot;r&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
      show &amp;quot;p ∨ r&amp;quot; using 5 by (rule disjI2) }&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;(p ∨ q) ∨ r&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
using 1&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  { assume 2: &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
    thus &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
      { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
        show &amp;quot;p ∨ (q ∨ r)&amp;quot; using 3 by (rule disjI1) }&lt;br /&gt;
    next&lt;br /&gt;
      { assume 4: &amp;quot;q&amp;quot;&lt;br /&gt;
        have 5: &amp;quot;q ∨ r&amp;quot; using 4 by (rule disjI1)&lt;br /&gt;
        show &amp;quot;p ∨ (q ∨ r)&amp;quot; using 5 by (rule disjI2) }&lt;br /&gt;
    qed }&lt;br /&gt;
next&lt;br /&gt;
  { assume 6: &amp;quot;r&amp;quot;&lt;br /&gt;
    have 7: &amp;quot;q ∨ r&amp;quot; using 6 by (rule disjI2)&lt;br /&gt;
    show &amp;quot;p ∨ (q ∨ r)&amp;quot; using 7 by (rule disjI2) }&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma &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;
  have 2: &amp;quot;p&amp;quot; using 1 ..&lt;br /&gt;
  have &amp;quot;q ∨ r&amp;quot; using 1 ..&lt;br /&gt;
  thus &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
      have &amp;quot;p ∧ q&amp;quot; using 2 3 by (rule conjI)&lt;br /&gt;
      thus &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; by (rule disjI1) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume 4: &amp;quot;r&amp;quot;&lt;br /&gt;
      have &amp;quot;p ∧ r&amp;quot; using 2 4 by (rule conjI)&lt;br /&gt;
      thus &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; by (rule disjI2) }&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
section {* Regla de copia *}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 13&amp;quot;&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ p&amp;quot; &lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;p&amp;quot; using 1 by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 13&amp;quot;&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  thus &amp;quot;q ⟶ p&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Reglas de la negación *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de eliminación de lo falso es&lt;br /&gt;
  · FalseE: False ⟹ P&lt;br /&gt;
  La regla de eliminación de la negación es&lt;br /&gt;
  · notE: ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  La regla de introducción de la negación es&lt;br /&gt;
  · notI: (P ⟹ False) ⟹ ¬P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 15&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;¬p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  note 1&lt;br /&gt;
  thus &amp;quot;q&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume 3: &amp;quot;¬p&amp;quot;&lt;br /&gt;
      show &amp;quot;q&amp;quot; using 3 2 by (rule notE) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume &amp;quot;q&amp;quot;&lt;br /&gt;
      thus &amp;quot;q&amp;quot; by this}&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 16&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p ⟶ ¬q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p&amp;quot;    &lt;br /&gt;
proof (rule notI)&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;¬q&amp;quot; using 2 3 by (rule mp)&lt;br /&gt;
  show False using 5 4 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma  &lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;¬p&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
  show False using 3 2 by (rule notE)&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;p ∧ ¬q ⟶ r&amp;quot; and &lt;br /&gt;
          2: &amp;quot;¬r&amp;quot; and &lt;br /&gt;
          3: &amp;quot;p&amp;quot; &lt;br /&gt;
  shows &amp;quot;q&amp;quot;    &lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬¬q&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume 4: &amp;quot;¬q&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;p ∧ ¬q&amp;quot; using 3 4 by (rule conjI)&lt;br /&gt;
    have 6: &amp;quot;r&amp;quot; using 1 5 by (rule mp)&lt;br /&gt;
    show False using 2 6 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  thus &amp;quot;q&amp;quot; by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p&amp;quot; and &lt;br /&gt;
          3: &amp;quot;¬r&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 4: &amp;quot;q&amp;quot;&lt;br /&gt;
  have 5: &amp;quot;q ⟶ r&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
  have 6: &amp;quot;r&amp;quot; using 5 4 by (rule mp)&lt;br /&gt;
  show False using 3 6 by (rule notE)&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
section {* Reglas del bicondicional *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de introducción del bicondicional es&lt;br /&gt;
  · iffI: ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P = Q&lt;br /&gt;
  Las reglas de eliminación del bicondicional son&lt;br /&gt;
  · iffD1: ⟦Q = P; Q⟧ ⟹ P &lt;br /&gt;
  · iffD2: ⟦P = Q; Q⟧ ⟹ P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 17&amp;quot;&lt;br /&gt;
  &amp;quot;(p ∧ q) = (q ∧ p)&amp;quot;&lt;br /&gt;
proof (rule iffI)&lt;br /&gt;
  { assume 1: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
    have 2: &amp;quot;p&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
    have 3: &amp;quot;q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
    show &amp;quot;q ∧ p&amp;quot; using 3 2 by (rule conjI) }&lt;br /&gt;
next&lt;br /&gt;
  { assume 4: &amp;quot;q ∧ p&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;q&amp;quot; using 4 by (rule conjunct1)&lt;br /&gt;
    have 6: &amp;quot;p&amp;quot; using 4 by (rule conjunct2)&lt;br /&gt;
    show &amp;quot;p ∧ q&amp;quot; using 6 5 by (rule conjI) }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 18&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p = q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p ∨ q&amp;quot;  &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
using 2&lt;br /&gt;
proof (rule disjE)&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 iffD1)&lt;br /&gt;
    show &amp;quot;p ∧ q&amp;quot; using 3 4 by (rule conjI) }&lt;br /&gt;
next&lt;br /&gt;
  { assume 5: &amp;quot;q&amp;quot;&lt;br /&gt;
    have 6: &amp;quot;p&amp;quot; using 1 5 by (rule iffD2)&lt;br /&gt;
    show &amp;quot;p ∧ q&amp;quot; using 6 5 by (rule conjI) }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Reglas derivadas *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Regla del modus tollens *}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 20&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;F ⟶ G&amp;quot; and &lt;br /&gt;
          2: &amp;quot;¬G&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬F&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 3: &amp;quot;F&amp;quot;&lt;br /&gt;
  have 4: &amp;quot;G&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
  show False using 2 4 by (rule notE)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
subsection {* Regla de la introducción de la doble negación *}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 21&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;F&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬¬F&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 2: &amp;quot;¬F&amp;quot;&lt;br /&gt;
  show False using 2 1 by (rule notE)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
subsection {* Regla de reducción al absurdo *}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 22&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;¬F ⟶ False&amp;quot; &lt;br /&gt;
  shows &amp;quot;F&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 2: &amp;quot;¬¬F&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume 3: &amp;quot;¬F&amp;quot;&lt;br /&gt;
    show False using 1 3 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;F&amp;quot; using 2 by (rule notnotD)&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de reducción al absurdo en Isabelle se correponde con la&lt;br /&gt;
  regla de contradicción &lt;br /&gt;
  · ccontr: (¬P ⟹ False) ⟹ P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Ley del tercio excluso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La ley del tercio excluso es &lt;br /&gt;
  · excluded_middle: ¬P ∨ P&lt;br /&gt;
  Puede demostrarse como se muestra a continuación.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 23&amp;quot;&lt;br /&gt;
  &amp;quot;F ∨ ¬F&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume 1: &amp;quot;¬(F ∨ ¬F)&amp;quot;&lt;br /&gt;
  thus False&lt;br /&gt;
  proof (rule notE)&lt;br /&gt;
    show &amp;quot;F ∨ ¬F&amp;quot;&lt;br /&gt;
    proof (rule disjI2)&lt;br /&gt;
      show &amp;quot;¬F&amp;quot;&lt;br /&gt;
      proof (rule notI)&lt;br /&gt;
        assume 2: &amp;quot;F&amp;quot;&lt;br /&gt;
        hence 3: &amp;quot;F ∨ ¬F&amp;quot; by (rule disjI1)&lt;br /&gt;
        show False using 1 3 by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
    &lt;br /&gt;
lemma -- &amp;quot;p. 24&amp;quot;&lt;br /&gt;
  assumes 1: &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; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;¬p ∨ q&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      thus &amp;quot;¬p ∨ q&amp;quot; by (rule disjI1) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;q&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
      thus &amp;quot;¬p ∨ q&amp;quot; by (rule disjI2) }&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_2:_Razonamiento_sobre_programas&amp;diff=73</id>
		<title>Tema 2: Razonamiento sobre programas</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_2:_Razonamiento_sobre_programas&amp;diff=73"/>
		<updated>2018-07-15T18:16:18Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
header {* Razonamiento sobre programas en Isabelle *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_2&lt;br /&gt;
imports Main Efficient_Nat&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En este tema se demuestra con Isabelle las propiedades de los&lt;br /&gt;
  programas funcionales como se expone en el tema 8 del curso&lt;br /&gt;
  &amp;quot;Informática&amp;quot; que puede leerse en&lt;br /&gt;
  http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-8t.pdf&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Definir, por recursión, la función&lt;br /&gt;
     longitud :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&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 [4,2,5]&amp;quot; -- &amp;quot;= 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que &lt;br /&gt;
     longitud [4,2,5] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud [4,2,5] = 3&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     fun intercambia :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot;&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;
     &amp;quot;intercambia (2,3) = (3,2)&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 (2,3)&amp;quot; -- &amp;quot;= (3,2)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar que &lt;br /&gt;
     intercambia (intercambia (x,y)) = (x,y)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;intercambia (intercambia (x,y)) = (x,y)&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir, por recursión, la función&lt;br /&gt;
     inversa :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&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 [3,2,5] = [5,2,3]&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 [3,2,5]&amp;quot; -- &amp;quot;= [5,2,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que &lt;br /&gt;
     inversa [x] = [x]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;inversa [x] = [x]&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     repite :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  tal que . Por ejemplo,&lt;br /&gt;
     repite 3 5 = [5,5,5]&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 5&amp;quot; -- &amp;quot;= [5,5,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que &lt;br /&gt;
     longitud (repite n x) = n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función&lt;br /&gt;
     fun conc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que . Por ejemplo,&lt;br /&gt;
     conc [2,3] [4,3,5] = [2,3,4,3,5]&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 [2,3] [4,3,5]&amp;quot; -- &amp;quot;= [2,3,4,3,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que &lt;br /&gt;
     conc xs (conc ys zs) = (conc xs ys) zs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc xs (conc ys zs) = conc (conc xs ys) zs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Refutar que &lt;br /&gt;
     conc xs ys = conc ys xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc xs ys = conc ys xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* Encuentra el contraejemplo, &lt;br /&gt;
  xs = [a\&amp;lt;^isub&amp;gt;2]&lt;br /&gt;
  ys = [a\&amp;lt;^isub&amp;gt;1] *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar que &lt;br /&gt;
     conc xs [] = xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc xs [] = xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar que &lt;br /&gt;
     longitud (conc xs ys) = longitud xs + longitud ys&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (conc xs ys) = longitud xs + longitud ys&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Definir la función&lt;br /&gt;
     coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&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 [3,7,5,4] = [3,7]&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 [3,7,5,4]&amp;quot; -- &amp;quot;= [3,7]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función&lt;br /&gt;
     elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&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;
     elimina 2 [3,7,5,4] = [5,4]&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 [3,7,5,4]&amp;quot; -- &amp;quot;= [5,4]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar que &lt;br /&gt;
     conc (coge n xs) (elimina n xs) = xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
by (induct rule: coge.induct) auto&lt;br /&gt;
&lt;br /&gt;
text {* coge.induct es el esquema de inducción asociado a la definición&lt;br /&gt;
  de la función coge. Puede verse como sigue: *}&lt;br /&gt;
&lt;br /&gt;
thm coge.induct&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función&lt;br /&gt;
     esVacia :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot;&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;
value &amp;quot;esVacia []&amp;quot;  -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;esVacia [1]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar que &lt;br /&gt;
     esVacia xs = esVacia (conc xs xs)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Definir la función&lt;br /&gt;
     inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (inversaAc xs) es a inversa de xs calculada usando&lt;br /&gt;
  acumuladores. Por ejemplo, &lt;br /&gt;
     inversaAc [3,2,5] = [5,2,3]&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 [3,2,5]&amp;quot; -- &amp;quot;= [5,2,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar que &lt;br /&gt;
     inversaAcAux xs ys = (inversa xs)@ys&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma inversaAcAux_es_inversa:&lt;br /&gt;
  &amp;quot;inversaAcAux xs ys = (inversa xs)@ys&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: ys) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar que &lt;br /&gt;
     inversaAc xs = inversa xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
corollary &amp;quot;inversaAc xs = inversa xs&amp;quot;&lt;br /&gt;
by (simp add: inversaAcAux_es_inversa)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Definir la función&lt;br /&gt;
     sum :: &amp;quot;int list ⇒ int&amp;quot; &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;int list ⇒ int&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;
value &amp;quot;sum [3,2,5]&amp;quot; -- &amp;quot;= 10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. 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;
value &amp;quot;map (λx. 2*x) [3::int,2,5]&amp;quot; -- &amp;quot;= [6,4,10]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar que &lt;br /&gt;
     sum (map (λx. 2*x) xs) = 2 * (sum xs)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;sum (map (λx. 2*x) xs) = 2 * (sum xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar que &lt;br /&gt;
     longitud (map f xs) = longitud xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (map f xs) = longitud xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_1:_Isabelle_como_un_lenguaje_funcional&amp;diff=72</id>
		<title>Tema 1: Isabelle como un lenguaje funcional</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_1:_Isabelle_como_un_lenguaje_funcional&amp;diff=72"/>
		<updated>2018-07-15T18:16:00Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
header {* Isabelle como un lenguaje funcional *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_1 &lt;br /&gt;
imports Main Efficient_Nat&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Introducción *}&lt;br /&gt;
&lt;br /&gt;
text {* Esta notas son una introducción a la demostración asistida&lt;br /&gt;
  utilizando el sistema Isabelle/HOL/Isar. La versión de Isabelle&lt;br /&gt;
  utilizada es la 2011.&lt;br /&gt;
&lt;br /&gt;
  En este capítulos se presenta el lenguaje funcional que está&lt;br /&gt;
  incluido en Isabelle. El lenguaje funcional es muy parecido a&lt;br /&gt;
  Haskell. *}&lt;br /&gt;
&lt;br /&gt;
section {* Números naturales, enteros y booleanos *}&lt;br /&gt;
&lt;br /&gt;
text {* En Isabelle están definidos los número naturales con la sintaxis&lt;br /&gt;
  de Peano usando dos constructores: 0 (cero) y Suc (el sucesor).&lt;br /&gt;
&lt;br /&gt;
  Los números como el 1  son abreviaturas de los correspondientes en la&lt;br /&gt;
  notación de Peano, en este caso &amp;quot;Suc 0&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
  El tipo de los números naturales es nat. &lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, el siguiente del 0 es el 1. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;Suc 0&amp;quot; -- &amp;quot;= 1&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {* En Isabelle está definida la suma de los números naturales:&lt;br /&gt;
  (x + y) es la suma de x e y.&lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, la suma de los números naturales 1 y 2 es el número&lt;br /&gt;
  natural 3. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;(1::nat) + 2&amp;quot; -- &amp;quot;= 3&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {* La notación del par de dos puntos se usa para asignar un tipo a&lt;br /&gt;
  un término (por ejemplo, (1::nat) significa que se considera que 1 es&lt;br /&gt;
  un número natural).   &lt;br /&gt;
&lt;br /&gt;
  En Isabelle está definida el producto de los números naturales:&lt;br /&gt;
  (x * y) es el producto de x e y.&lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, el producto de los números naturales 2 y 3 es el número&lt;br /&gt;
  natural 6. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;(2::nat) * 3&amp;quot; -- &amp;quot;= 6&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {* En Isabelle está definida la división de números naturales: &lt;br /&gt;
  (n div m) es el cociente entero de x entre y.&lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, la división natural de 7 entre 3 es 2.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;(7::nat) div 3&amp;quot; -- &amp;quot;= 2&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {* En Isabelle está definida el resto de división de números&lt;br /&gt;
  naturales: (n mod m) es el resto de dividir n entre m.&lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, el resto de dividir 7 entre 3 es 1. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;(7::nat) mod 3&amp;quot; -- &amp;quot;= 1&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {* En Isabelle también están definidos los números enteros. El tipo&lt;br /&gt;
  de los enteros se representa por int.&lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, la suma de 1 y -2 es el número entero -1. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;(1::int) + -2&amp;quot; -- &amp;quot;= -1&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {* Los numerales están sobrecargados. Por ejemplo, el 1 puede ser&lt;br /&gt;
  un natural o un entero, dependiendo del contexto. Isabelle resuelve&lt;br /&gt;
  ambigüedades mediante inferencia de tipos. A veces, es necesario usar&lt;br /&gt;
  declaraciones de tipo para resolver la ambigüedad.&lt;br /&gt;
&lt;br /&gt;
  En Isabelle están definidos los valores booleanos (True y False), las&lt;br /&gt;
  conectivas (¬, ∧, ∨, ⟶ y ↔) y los cuantificadores (∀ y ∃). &lt;br /&gt;
&lt;br /&gt;
  El tipo de los booleanos es bool. *}&lt;br /&gt;
&lt;br /&gt;
text {* La conjunción de dos fórmulas verdaderas es verdadera. *}&lt;br /&gt;
value &amp;quot;True ∧ True&amp;quot; -- &amp;quot;= True&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {* La conjunción de un fórmula verdadera y una falsa es falsa. *} &lt;br /&gt;
value &amp;quot;True ∧ False&amp;quot; -- &amp;quot;= False&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {* La disyunción de una fórmula verdadera y una falsa es&lt;br /&gt;
  verdadera. *} &lt;br /&gt;
value &amp;quot;True ∨ False&amp;quot; -- &amp;quot;= True&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {* La disyunción de dos fórmulas falsas es falsa. *}&lt;br /&gt;
value &amp;quot;False ∨ False&amp;quot; -- &amp;quot;= False&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {* La negación de una fórmula verdadera es falsa. *}&lt;br /&gt;
value &amp;quot;¬ True&amp;quot; -- &amp;quot;= False&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {* Una fórmula falsa implica una fórmula verdadera. *}&lt;br /&gt;
value &amp;quot;False ⟶ True&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* Un lema introduce una proposición seguida de una demostración. &lt;br /&gt;
  Isabelle dispone de varios procedimientos automáticos para generar&lt;br /&gt;
  demostraciones, uno de los cuales es el de simplificación (llamado&lt;br /&gt;
  simp). El procedimiento simp aplica un conjunto de reglas de&lt;br /&gt;
  reescritura que inicialmente contiene un gran número de reglas&lt;br /&gt;
  relativas a los objetos definidos. *}&lt;br /&gt;
&lt;br /&gt;
text {* Todo elemento es igual a sí mismo. *}&lt;br /&gt;
lemma &amp;quot;∀x. x = x&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* Existe un elemento igual a 1. *}&lt;br /&gt;
lemma &amp;quot;∃ x. x = 1&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Definiciones no recursivas *}&lt;br /&gt;
&lt;br /&gt;
text {* La disyunción exclusiva de A y B se verifica si una es verdadera&lt;br /&gt;
  y la otra no lo es. *}&lt;br /&gt;
&lt;br /&gt;
definition xor :: &amp;quot;bool ⇒ bool ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;xor A B ≡ (A ∧ ¬B) ∨ (¬A ∧ B)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* Prop.: La disyunción exclusiva de dos fórmulas verdaderas es&lt;br /&gt;
  falsa. &lt;br /&gt;
&lt;br /&gt;
  Dem.: Por simplificación, usando la definición de la disyunción&lt;br /&gt;
  exclusiva. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;xor True True = False&amp;quot;&lt;br /&gt;
by (simp add: xor_def)&lt;br /&gt;
&lt;br /&gt;
text {* Se añade la definición de la disyunción exlusiva al conjunto de&lt;br /&gt;
  reglas de simplificación automáticas. *}&lt;br /&gt;
&lt;br /&gt;
declare xor_def[simp]&lt;br /&gt;
&lt;br /&gt;
section {* Definiciones locales *}&lt;br /&gt;
&lt;br /&gt;
text {* Se puede asignar valores a variables locales mediante &amp;#039;let&amp;#039; y&lt;br /&gt;
  usarlo en las expresiones dentro de &amp;#039;in&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, si x es el número natural 3, entonces &amp;quot;x*x=9&amp;quot;. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;let x = 3::nat in x * x&amp;quot; -- &amp;quot;= 9&amp;quot; &lt;br /&gt;
&lt;br /&gt;
section {* Pares *}&lt;br /&gt;
&lt;br /&gt;
text {* Un par se representa escribiendo los elementos entre paréntesis&lt;br /&gt;
  y separados por coma.&lt;br /&gt;
  &lt;br /&gt;
  El tipo de los pares es el producto de los tipos.&lt;br /&gt;
  &lt;br /&gt;
  La función fst devuelve el primer elemento de un par y la snd el&lt;br /&gt;
  segundo. &lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, si p es el par de números naturales (2,3), entonces la&lt;br /&gt;
  suma del primer elemento de p y 1 es igual al segundo elemento de&lt;br /&gt;
  p. *} &lt;br /&gt;
&lt;br /&gt;
value &amp;quot;let p = (2,3)::nat × nat in fst p + 1 = snd p&amp;quot; &lt;br /&gt;
&lt;br /&gt;
section {* Listas *}&lt;br /&gt;
&lt;br /&gt;
text {* Una lista se representa escribiendo los elementos entre&lt;br /&gt;
  corchetes y separados por coma.&lt;br /&gt;
  &lt;br /&gt;
  La lista vacía se representa por [].&lt;br /&gt;
  &lt;br /&gt;
  Todos los elementos de una lista tienen que ser del mismo tipo.&lt;br /&gt;
  &lt;br /&gt;
  El tipo de las listas de elementos del tipo a es (a list).&lt;br /&gt;
  &lt;br /&gt;
  El término (x#xs) representa la lista obtenida añadiendo el elemento x&lt;br /&gt;
  al principio de la lista xs. &lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, la lista obtenida añadiendo sucesivamente a la lista&lt;br /&gt;
  vacía los elementos 3, 2 y 1 es [1,2,3]. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;1#(2#(3#[]))&amp;quot; -- &amp;quot;= [1,2,3]&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {* Funciones de descomposión de listas:&lt;br /&gt;
  · (hd xs) es el primer elemento de la lista xs.&lt;br /&gt;
  · (tl xs) es el resto de la lista xs.&lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, si xs es la lista de números naturales [1,2,3], entonces&lt;br /&gt;
  el primero de xs es 1 y el resto de xs es [2,3]. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;let l = [1,2,3]::(nat list) in hd l = 1 ∧ tl l = [2,3]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* (length xs) es la longitud de la lista xs.&lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, la longitud de la lista [1,2,3] es 3.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;length [1,2,3]&amp;quot; -- &amp;quot;= 3&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {* En la sesión 38 de &amp;quot;HOL: The basis of Higher-Order Logic&amp;quot; se&lt;br /&gt;
  encuentran  más definiciones y propiedades de las listas. *}&lt;br /&gt;
&lt;br /&gt;
section {* Registros *}&lt;br /&gt;
&lt;br /&gt;
text {* Un registro es una colección de campos y valores. &lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, los puntos del plano pueden representarse mediante&lt;br /&gt;
  registros con dos campos, las coordenadas, con valores enteros. *}&lt;br /&gt;
&lt;br /&gt;
record punto = &lt;br /&gt;
  coordenada_x :: int&lt;br /&gt;
  coordenada_y :: int&lt;br /&gt;
&lt;br /&gt;
text {* Ejemplo, el punto pt tiene de coordenadas 3 y 7. *}&lt;br /&gt;
&lt;br /&gt;
definition pt :: punto where&lt;br /&gt;
  &amp;quot;pt ≡ (|coordenada_x = 3, coordenada_y = 7|)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* Ejemplo, la coordenada x del punto pt es 3. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coordenada_x pt&amp;quot; -- &amp;quot;= 3&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {* Ejemplo, sea pt2 el punto obtenido a partir del punto pt&lt;br /&gt;
  cambiando el valor de su coordenada x por 4. Entonces la coordenada x&lt;br /&gt;
  del punto pt2 es 4. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;let pt2=pt(|coordenada_x:=4|) in coordenada_x (pt2)&amp;quot; -- &amp;quot;= 4&amp;quot; &lt;br /&gt;
&lt;br /&gt;
section {* Funciones anónimas *}&lt;br /&gt;
&lt;br /&gt;
text {* En Isabelle pueden definirse funciones anónimas.  &lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, el valor de la función que a un número le asigna su doble&lt;br /&gt;
  aplicada a 1 es 2. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;(λx. x + x) 1::nat&amp;quot; -- &amp;quot;= 2&amp;quot; &lt;br /&gt;
&lt;br /&gt;
section {* Condicionales *}&lt;br /&gt;
&lt;br /&gt;
text {* El valor absoluto del entero x es x, si &amp;quot;x ≥ 0&amp;quot; y es -x en caso &lt;br /&gt;
  contrario. *}&lt;br /&gt;
&lt;br /&gt;
definition absoluto :: &amp;quot;int ⇒ int&amp;quot; where&lt;br /&gt;
  &amp;quot;absoluto x ≡ (if x ≥ 0 then x else -x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* Ejemplo, el valor absoluto de -3 es 3. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;absoluto(-3)&amp;quot; -- &amp;quot;= 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* Def.: Un número natural n es un sucesor si es de la forma &lt;br /&gt;
  (Suc m). *}&lt;br /&gt;
&lt;br /&gt;
definition es_sucesor :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_sucesor n ≡&lt;br /&gt;
  (case n of &lt;br /&gt;
    0     ⇒ False &lt;br /&gt;
  | Suc m ⇒ True)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* Ejemplo, el número 3 es sucesor. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;es_sucesor 3&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
section {* Tipos de datos y recursión primitiva *}&lt;br /&gt;
&lt;br /&gt;
text {* Una lista de elementos de tipo a es la lista Vacia o se obtiene&lt;br /&gt;
  añadiendo, con ConsLista, un elemento de tipo a a una lista de&lt;br /&gt;
  elementos de tipo a. *}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a Lista = Vacia | ConsLista &amp;#039;a &amp;quot;&amp;#039;a Lista&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* (conc xs ys) es la concatenación de las lista xs e ys. *}&lt;br /&gt;
&lt;br /&gt;
primrec conc :: &amp;quot;&amp;#039;a Lista ⇒ &amp;#039;a Lista ⇒ &amp;#039;a Lista&amp;quot; where&lt;br /&gt;
  &amp;quot;conc Vacia ys            = ys&amp;quot;&lt;br /&gt;
| &amp;quot;conc (ConsLista x xs) ys = ConsLista x (conc xs ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* Ejemplo, la concatenación de la lista formada por 1 y 2 con la&lt;br /&gt;
  lista formada por el 3 es la lista cuyos elementos son 1, 2 y 3.  *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc (ConsLista 1 (ConsLista 2 Vacia)) (ConsLista 3 Vacia) =&lt;br /&gt;
       (ConsLista 1 (ConsLista 2 (ConsLista 3 Vacia)))&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* (suma n) es la suma de los primeros n números naturales. Por&lt;br /&gt;
  ejemplo,&lt;br /&gt;
     suma 3 = 6&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec suma :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma 0 = 0&amp;quot;&lt;br /&gt;
| &amp;quot;suma (Suc m) = (Suc m) + suma m&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;suma 3&amp;quot; -- &amp;quot;= 6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* (sumaImpares n)&amp;quot; es la suma de los n primeros números&lt;br /&gt;
  impares. Por ejemplo,&lt;br /&gt;
     sumaImpares 3 = 9&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec sumaImpares :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares 0 = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sumaImpares (Suc n) = (2 * (Suc n) - 1) + sumaImpares n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaImpares 3&amp;quot; -- &amp;quot;= 9&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* Prop.: La suma de los n primeros numeros impares es n\&amp;lt;^sup&amp;gt;2&lt;br /&gt;
  Dem.: Por induccion en n. *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n * n&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=MediaWiki:Common.css&amp;diff=71</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=MediaWiki:Common.css&amp;diff=71"/>
		<updated>2018-07-15T18:15:25Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con «/* Los estilos CSS colocados aquí se aplicarán a todas las apariencias */ @import url(&amp;quot;/~jalonso/font-awesome-4.7.0/css/font-awesome.min.css&amp;quot;);»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Los estilos CSS colocados aquí se aplicarán a todas las apariencias */&lt;br /&gt;
@import url(&amp;quot;/~jalonso/font-awesome-4.7.0/css/font-awesome.min.css&amp;quot;);&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_9:_Patrones_de_demostraci%C3%B3n&amp;diff=70</id>
		<title>Tema 9: Patrones de demostración</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_9:_Patrones_de_demostraci%C3%B3n&amp;diff=70"/>
		<updated>2012-02-09T14:01:24Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 9: Patrones de demostración *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_9&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Demostraciones por casos *} &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. [Regla de eliminación de la disyunción]&lt;br /&gt;
  · disjE: ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R&lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de demostración por casos]&lt;br /&gt;
     P ∨ Q ⟹ Q ∨ P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma disj_conmutativa: &amp;quot;P ∨ Q ⟹ Q ∨ P&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  assume &amp;quot;P ∨ Q&amp;quot; &lt;br /&gt;
  thus &amp;quot;Q ∨ P&amp;quot; &lt;br /&gt;
  proof (rule disjE) &lt;br /&gt;
    assume P &lt;br /&gt;
    thus ?thesis  by (rule disjI2)&lt;br /&gt;
  next&lt;br /&gt;
    assume Q &lt;br /&gt;
    thus ?thesis by (rule disjI1) &lt;br /&gt;
  qed &lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. El lema anterior puede demostrarse automáticamente como se&lt;br /&gt;
  muestra a continuación. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma disj_conmutativa_auto: &amp;quot;P ∨ Q ⟹ Q ∨ P&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
section {* Negación *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Reglas de la negación:&lt;br /&gt;
  · notI: (P ⟹ False) ⟹ ¬P&lt;br /&gt;
  · notE: ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de demostración con negaciones]&lt;br /&gt;
  Si x²+y = 13 e y ≠ 4, entonces x ≠ 3.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes x :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;x * x + y = 13&amp;quot; &lt;br /&gt;
      and 2: &amp;quot;y ≠ 4&amp;quot;&lt;br /&gt;
  shows &amp;quot;x ≠ 3&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume &amp;quot;x = 3&amp;quot;&lt;br /&gt;
  with 1 have &amp;quot;y = 4&amp;quot; by simp&lt;br /&gt;
  with 2 show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La demostración puede hacerse automáticamente como se muestra a&lt;br /&gt;
  continuación. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes x :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;x * x + y = 13&amp;quot; &lt;br /&gt;
      and 2: &amp;quot;y ≠ 4&amp;quot;&lt;br /&gt;
  shows &amp;quot;x ≠ 3&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume &amp;quot;x = 3&amp;quot;&lt;br /&gt;
  with 1 2 show &amp;quot;False&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El lema anterior puede demostrarse más automáticamente como se muestra a&lt;br /&gt;
  continuación. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes x :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;x * x + y = 13&amp;quot; &lt;br /&gt;
      and 2: &amp;quot;y ≠ 4&amp;quot;&lt;br /&gt;
  shows &amp;quot;x ≠ 3&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
section {* Contradicciones *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Regla de contradicción:&lt;br /&gt;
  · FalseE: False ⟹ P&lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de uso de la regla de contradicción]&lt;br /&gt;
  Si 1=2, entonces 3=7.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;1 = (2::nat)&amp;quot;&lt;br /&gt;
  shows &amp;quot;3 = (7::nat)&amp;quot;&lt;br /&gt;
proof - &lt;br /&gt;
  have &amp;quot;False&amp;quot; using assms by simp&lt;br /&gt;
  thus &amp;quot;3 = (7::nat)&amp;quot; by (rule FalseE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El lema puede demostrarse automáticamente, como sigue.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;1 = (2::nat)&amp;quot;&lt;br /&gt;
  shows &amp;quot;3 = (7::nat)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Ejemplo de demostración por casos y contradicción]&lt;br /&gt;
     ¬P, P ∨ Q ⊢ Q&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma disjCE:&lt;br /&gt;
  assumes &amp;quot;¬P&amp;quot; and &amp;quot;P ∨ Q&amp;quot;&lt;br /&gt;
  shows &amp;quot;Q&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;Q&amp;quot; using `¬P` by contradiction&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;Q&amp;quot;&lt;br /&gt;
  thus &amp;quot;Q&amp;quot; by assumption&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Equivalencias *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Reglas de equivalencia:&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;
&lt;br /&gt;
  Lema. [Ejemplo de introducción de equivalencia]&lt;br /&gt;
  La fórmula &lt;br /&gt;
     (R ⟶ C) ∧ (S ⟶ C))&lt;br /&gt;
  es equivalente a &lt;br /&gt;
     R ∨ S ⟶ C&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;((R ⟶ C) ∧ (S ⟶ C)) = (R ∨ S ⟶ C)&amp;quot;&lt;br /&gt;
proof (rule iffI)&lt;br /&gt;
  assume &amp;quot;(R ⟶ C) ∧ (S ⟶ C)&amp;quot;&lt;br /&gt;
  thus &amp;quot;R ∨ S ⟶ C&amp;quot; by blast&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;R ∨ S ⟶ C&amp;quot;&lt;br /&gt;
  thus &amp;quot;(R ⟶ C) ∧ (S ⟶ C)&amp;quot; by blast&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  El método &amp;quot;blast&amp;quot;:&lt;br /&gt;
  En la demostración anterior es la primera vez que se usa el método de&lt;br /&gt;
  razonamiento automático &amp;quot;blast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Nota. El lema anterior puede demostrarse automáticamente como se&lt;br /&gt;
  muestra a continuación.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;((R ⟶ C) ∧ (S ⟶ C)) = (R ∨ S ⟶ C)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Ejemplo de eliminación de equivalencia]&lt;br /&gt;
  · A ⟷ B, A ⊢ B&lt;br /&gt;
  · A ⟷ B, B ⊢ A&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma assumes &amp;quot;A = B&amp;quot; and &amp;quot;A&amp;quot; shows &amp;quot;B&amp;quot;&lt;br /&gt;
using assms &lt;br /&gt;
by (rule iffD1)&lt;br /&gt;
&lt;br /&gt;
lemma assumes &amp;quot;A = B&amp;quot; and &amp;quot;B&amp;quot; shows &amp;quot;A&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (rule iffD2)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_8:_Distinci%C3%B3n_de_casos_e_inducci%C3%B3n&amp;diff=69</id>
		<title>Tema 8: Distinción de casos e inducción</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_8:_Distinci%C3%B3n_de_casos_e_inducci%C3%B3n&amp;diff=69"/>
		<updated>2012-02-09T13:55:05Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 8: Distinción de casos e inducción *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_8&lt;br /&gt;
imports Main Parity&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Razonamiento por distinción de casos *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Distinción de casos booleanos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Demostración por distinción de casos booleanos]&lt;br /&gt;
     ¬A ∨ A&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;¬A ∨ A&amp;quot; &lt;br /&gt;
proof cases&lt;br /&gt;
  assume &amp;quot;A&amp;quot; thus ?thesis ..&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;¬A&amp;quot; thus ?thesis ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Demostración por distinción de casos booleanos nominados]&lt;br /&gt;
     ¬A ∨ A&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;¬A ∨ A&amp;quot; &lt;br /&gt;
proof (cases &amp;quot;A&amp;quot;)&lt;br /&gt;
  case True thus ?thesis ..&lt;br /&gt;
next&lt;br /&gt;
  case False thus ?thesis .. &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El método &amp;quot;cases&amp;quot; sobre una fórmula:&lt;br /&gt;
  · El método (cases F) es una abreviatura de la aplicación de la regla&lt;br /&gt;
       ⟦F ⟹ Q; ¬F ⟹ Q⟧ ⟹ Q  &lt;br /&gt;
  · La expresión &amp;quot;case True&amp;quot; es una abreviatura de F.&lt;br /&gt;
  · La expresión &amp;quot;case False&amp;quot; es una abreviatura de ¬F.&lt;br /&gt;
  · Ventajas de &amp;quot;cases&amp;quot; con nombre: &lt;br /&gt;
    · reduce la escritura de la fórmula y&lt;br /&gt;
    · es independiente del orden de los casos.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Distinción de casos sobre otros tipos de datos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Distinción de casos sobre listas]&lt;br /&gt;
  La longitud del resto de una lista es la longitud de la lista menos 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length(tl xs) = length xs - 1&amp;quot; &lt;br /&gt;
proof (cases xs)&lt;br /&gt;
  case Nil thus ?thesis by simp&lt;br /&gt;
next&lt;br /&gt;
  case Cons thus ?thesis by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Distinción de casos sobre listas:&lt;br /&gt;
  · El método de distinción de casos se activa con (cases xs) donde xs&lt;br /&gt;
    es del tipo lista. &lt;br /&gt;
  · &amp;quot;case Nil&amp;quot; es una abreviatura de &lt;br /&gt;
       &amp;quot;assume Nil: xs =[]&amp;quot;.&lt;br /&gt;
  · &amp;quot;case Cons&amp;quot; es una abreviatura de &lt;br /&gt;
       &amp;quot;fix ? ?? assume Cons: xs = ? # ??&amp;quot;&lt;br /&gt;
    donde ? y ?? son variables anónimas. &lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de análisis de casos]&lt;br /&gt;
  El resultado de eliminar los n+1 primeros elementos de xs es el mismo&lt;br /&gt;
  que eliminar los n primeros elementos del resto de xs.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;drop (n + 1) xs = drop n (tl xs)&amp;quot;&lt;br /&gt;
proof (cases xs)&lt;br /&gt;
  case Nil thus &amp;quot;drop (n + 1) xs = drop n (tl xs)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  case Cons thus &amp;quot;drop (n + 1) xs = drop n (tl xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La función drop está definida en la teoría List de forma que&lt;br /&gt;
  (drop n xs) la lista obtenida eliminando en xs} los n primeros&lt;br /&gt;
  elementos. Su definición es la siguiente  &lt;br /&gt;
     primrec drop:: &amp;quot;nat =&amp;gt; &amp;#039;a list =&amp;gt; &amp;#039;a list&amp;quot; where&lt;br /&gt;
     drop_Nil:  &amp;quot;drop n [] = []&amp;quot; |&lt;br /&gt;
     drop_Cons: &amp;quot;drop n (x#xs) = (case n of &lt;br /&gt;
                                    0 =&amp;gt; x#xs | &lt;br /&gt;
                                    Suc(m) =&amp;gt; drop m xs)&amp;quot;&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Inducción matemática *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  [Principio de inducción matemática]&lt;br /&gt;
  Para demostrar una propiedad P para todos los números naturales basta&lt;br /&gt;
  probar que el 0 tiene la propiedad P y que si n tiene la propiedad P,&lt;br /&gt;
  entonces n+1 también la tiene. &lt;br /&gt;
     ⟦P 0; ⋀n. P n ⟹ P (Suc n)⟧ ⟹ P m&lt;br /&gt;
  &lt;br /&gt;
  Ejemplo de demostración por inducción: Usaremos el principio de&lt;br /&gt;
  inducción matemática para demostrar que &lt;br /&gt;
     1 + 3 + ... + (2n-1) = n^2&lt;br /&gt;
&lt;br /&gt;
  Definición. [Suma de los primeros impares] &lt;br /&gt;
  (suma_impares n) la suma de los n números impares.    &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec suma_impares :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
&amp;quot;suma_impares 0 = 0&amp;quot; |&lt;br /&gt;
&amp;quot;suma_impares (Suc n) = (2*(Suc n) - 1) + suma_impares n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Ejemplo de suma de impares]&lt;br /&gt;
  La suma de los 3 primeros números impares es 9.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares 2 = 4&amp;quot;&lt;br /&gt;
by (simp add: suma_impares_def)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La suma de los 3 primero número impares se puede calcular mediante &amp;quot;value&amp;quot;. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;suma_impares 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Ejemplo de demostración por inducción matemática]&lt;br /&gt;
  La suma de los n primeros números impares es n^2.&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática: Por inducción en n.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot;&lt;br /&gt;
by (induct n) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En la demostración &amp;quot;by (induct n) simp_all&amp;quot; se aplica inducción en n y&lt;br /&gt;
  los dos casos se prueban por simplificación.  &lt;br /&gt;
  &lt;br /&gt;
  Demostración del lema anterior usando patrones.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot; (is &amp;quot;?P n&amp;quot;)&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;?P 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n assume &amp;quot;?P n&amp;quot;&lt;br /&gt;
  thus &amp;quot;?P (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Patrones: Cualquier fórmula seguida de (is patrón) equipara el patrón&lt;br /&gt;
  con la fórmula.&lt;br /&gt;
&lt;br /&gt;
  Demostración del lema anterior con patrones y razonamiento ecuacional.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot; (is &amp;quot;?P n&amp;quot;)&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;?P 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n assume HI: &amp;quot;?P n&amp;quot;&lt;br /&gt;
  have &amp;quot;suma_impares (Suc n) = (2 * (Suc n) - 1) + suma_impares n&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (2 * (Suc n) - 1) + n * n&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;… = n * n + 2 * n + 1&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostración del lema anterior por inducción y razonamiento ecuacional.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;suma_impares 0 = 0 * 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n assume HI: &amp;quot;suma_impares n = n * n&amp;quot;&lt;br /&gt;
  have &amp;quot;suma_impares (Suc n) = (2 * (Suc n) - 1) + suma_impares n&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (2 * (Suc n) - 1) + n * n&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;… = n * n + 2 * n + 1&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;suma_impares (Suc n) = (Suc n) * (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición. [Números pares]&lt;br /&gt;
  Un número natural n es par si existe un natural m tal que n=m+m. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition par ::  &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;par n ≡ ∃m. n=m+m&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Ejemplo de inducción y existenciales]&lt;br /&gt;
  Para todo número natural n, se verifica que n*(n+1) par.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  shows &amp;quot;par (n*(n+1))&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;par (0*(0+1))&amp;quot; by (simp add:par_def)&lt;br /&gt;
next&lt;br /&gt;
  fix n assume &amp;quot;par (n*(n+1))&amp;quot;&lt;br /&gt;
  hence &amp;quot;∃m. n*(n+1) = m+m&amp;quot; by (simp add:par_def)&lt;br /&gt;
  then obtain m where m: &amp;quot;n*(n+1) = m+m&amp;quot; by (rule exE)&lt;br /&gt;
  hence &amp;quot;(Suc n)*((Suc n)+1) = (m+n+1)+(m+n+1)&amp;quot; by auto&lt;br /&gt;
  hence &amp;quot;∃m. (Suc n)*((Suc n)+1) = m+m&amp;quot; by (rule exI)&lt;br /&gt;
  thus &amp;quot;par ((Suc n)*((Suc n)+1))&amp;quot; by (simp add:par_def)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En Isabelle puede demostrarse de manera más simple un lema equivalente usando&lt;br /&gt;
  en lugar de la función &amp;quot;par&amp;quot; la función &amp;quot;even&amp;quot; definida en la teoría Parity.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  shows &amp;quot;even (n*(n+1))&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Para completar la demostración basta demostrar la equivalencia de las&lt;br /&gt;
  funciones &amp;quot;par&amp;quot; y &amp;quot;even&amp;quot;. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  shows &amp;quot;par n = even n&amp;quot;&lt;br /&gt;
proof - &lt;br /&gt;
  have &amp;quot;par n = (∃m. n = m+m)&amp;quot; by (simp add:par_def)&lt;br /&gt;
  thus &amp;quot;par n = even n&amp;quot; by presburger&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En la demostración anterior hemos usado la táctica &amp;quot;presburger&amp;quot; que&lt;br /&gt;
  corresponde a la aritmética de Presburger.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Inducción estructural *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Inducción estructural]&lt;br /&gt;
  · En Isabelle puede hacerse inducción estructural sobre cualquier tipo&lt;br /&gt;
    recursivo.&lt;br /&gt;
  · La inducción matemática es la inducción estructural sobre el tipo de&lt;br /&gt;
    los naturales.&lt;br /&gt;
  · El esquema de inducción estructural sobre listas es&lt;br /&gt;
    · list.induct: ⟦P []; ⋀x ys. P ys ⟹ P (x # ys)⟧ ⟹ P zs&lt;br /&gt;
  · Para demostrar una propiedad para todas las listas basta demostrar&lt;br /&gt;
    que la lista vacía tiene la propiedad y que al añadir un elemento a una&lt;br /&gt;
    lista que tiene la propiedad se obtiene una lista que también tiene la&lt;br /&gt;
    propiedad. &lt;br /&gt;
&lt;br /&gt;
  Concatenación de listas:&lt;br /&gt;
  En la teoría List.thy está definida la concatenación de listas (que&lt;br /&gt;
  se representa por @) como sigue&lt;br /&gt;
    primrec&lt;br /&gt;
      append_Nil:  &amp;quot;[]@ys = ys&amp;quot;&lt;br /&gt;
      append_Cons: &amp;quot;(x#xs)@ys = x#(xs@ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de inducción sobre listas]&lt;br /&gt;
  La concatenación de listas es asociativa.&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática del lema.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma conc_asociativa_1: &amp;quot;xs @ (ys @ zs) = (xs @ ys) @ zs&amp;quot;&lt;br /&gt;
by (induct xs) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostración estructurada del lema anterior.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma conc_asociativa: &amp;quot;xs @ (ys @ zs) = (xs @ ys) @ zs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;[] @ (ys @ zs) = ([] @ ys) @ zs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;[] @ (ys @ zs) = ys @ zs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = ([] @ ys) @ zs&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;xs @ (ys @ zs) = (xs @ ys) @ zs&amp;quot;&lt;br /&gt;
  show &amp;quot;(x#xs) @ (ys @ zs) = ((x#xs) @ ys) @ zs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;(x#xs) @ (ys @ zs) = x#(xs @ (ys @ zs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = x#((xs @ ys) @ zs)&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;… = (x#(xs @ ys)) @ zs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = ((x#xs) @ ys) @ zs&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [Árboles binarios]&lt;br /&gt;
  Definir un tipo de dato para los árboles binarios.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = Hoja &amp;quot;&amp;#039;a&amp;quot; &lt;br /&gt;
                  | Nodo &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;
text {* &lt;br /&gt;
  Ejercicio. [Imagen especular]&lt;br /&gt;
  Definir la función &amp;quot;espejo&amp;quot; que aplicada a un árbol devuelve su imagen&lt;br /&gt;
  especular.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;espejo (Hoja a) = (Hoja a)&amp;quot;&lt;br /&gt;
| &amp;quot;espejo (Nodo f x y) = (Nodo f (espejo y) (espejo x))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [La imagen especular es involutiva]&lt;br /&gt;
  Demostrar que la función &amp;quot;espejo&amp;quot; involutiva; es decir, para cualquier&lt;br /&gt;
  árbol t, se tiene que &lt;br /&gt;
     espejo (espejo(t)) = t.&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática del lema.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma espejo_involutiva_1: &amp;quot;espejo(espejo(t)) = t&amp;quot;&lt;br /&gt;
by (induct t) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostración estructurada del lema.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma espejo_involutiva: &amp;quot;espejo(espejo(t)) = t&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof (induct t)&lt;br /&gt;
  fix x :: &amp;#039;a show &amp;quot;?P (Hoja x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix t1 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h1: &amp;quot;?P t1&amp;quot;&lt;br /&gt;
  fix t2 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h2: &amp;quot;?P t2&amp;quot;&lt;br /&gt;
  fix x :: &amp;#039;a&lt;br /&gt;
  show &amp;quot;?P (Nodo x t1 t2)&amp;quot; &lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;espejo(espejo(Nodo x t1 t2)) = espejo(Nodo x (espejo t2) (espejo t1))&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = Nodo x (espejo (espejo t1)) (espejo (espejo t2))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = Nodo x t1 t2&amp;quot; using h1 h2 by simp &lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [Aplanamiento de árboles]&lt;br /&gt;
  Definir la función &amp;quot;aplana&amp;quot; que aplane los árboles recorriéndolos en&lt;br /&gt;
  orden infijo.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec aplana :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;aplana (Hoja a) = [a]&amp;quot;&lt;br /&gt;
| &amp;quot;aplana (Nodo x t1 t2) = (aplana t1)@[x]@(aplana t2)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [Aplanamiento de la imagen especular] Demostrar que&lt;br /&gt;
     aplana (espejo t) = rev (aplana t)&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática del lema.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (espejo t) = rev (aplana t)&amp;quot;&lt;br /&gt;
by (induct t) auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Demostración estructurada del lema anterior.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (espejo t) = rev (aplana t)&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof (induct t)&lt;br /&gt;
  fix x :: &amp;#039;a &lt;br /&gt;
  show &amp;quot;?P (Hoja x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix t1 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h1: &amp;quot;?P t1&amp;quot;&lt;br /&gt;
  fix t2 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h2: &amp;quot;?P t2&amp;quot;&lt;br /&gt;
  fix x :: &amp;#039;a&lt;br /&gt;
  show &amp;quot;?P (Nodo x t1 t2)&amp;quot; &lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;aplana (espejo (Nodo x t1 t2)) = &lt;br /&gt;
          aplana (Nodo x (espejo t2) (espejo t1))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (aplana(espejo t2))@[x]@(aplana(espejo t1))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (rev(aplana t2))@[x]@(rev(aplana t1))&amp;quot; using h1 h2 by simp&lt;br /&gt;
    also have &amp;quot;… = rev((aplana t1)@[x]@(aplana t2))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev(aplana (Nodo x t1 t2))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_7:_El_lenguaje_de_demostraci%C3%B3n_Isar&amp;diff=68</id>
		<title>Tema 7: El lenguaje de demostración Isar</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_7:_El_lenguaje_de_demostraci%C3%B3n_Isar&amp;diff=68"/>
		<updated>2012-02-02T18:33:25Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 7: El lenguaje de demostración Isar *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_7&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Este tema describe los elementos básicos del lenguaje de demostración&lt;br /&gt;
  Isar (Intelligible semi-automated reasoning).&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Panorama de la sintaxis (simplificada) de Isar *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Representación de lemas (y teoremas)&lt;br /&gt;
  · Un lema (o teorema) comienza con una etiqueta seguida por algunas&lt;br /&gt;
    premisas y una conclusión.&lt;br /&gt;
  · Las premisas se introducen con la palabra &amp;quot;assumes&amp;quot; y se separan&lt;br /&gt;
    con &amp;quot;and&amp;quot;.&lt;br /&gt;
  · Cada premisa puede etiquetarse para referenciarse en la demostración.&lt;br /&gt;
  · La conclusión se introduce con la palabra &amp;quot;shows&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Gramática (simplificada) de las demostraciones en Isar&lt;br /&gt;
  &amp;lt;demostración&amp;gt; ::= proof &amp;lt;método&amp;gt; &amp;lt;declaración&amp;gt;* qed&lt;br /&gt;
                   | by &amp;lt;método&amp;gt;&lt;br /&gt;
  &amp;lt;declaración&amp;gt;  ::= fix &amp;lt;variable&amp;gt;+ &lt;br /&gt;
                   | assume &amp;lt;proposición&amp;gt;+&lt;br /&gt;
                   | (from &amp;lt;hecho&amp;gt;+)? have &amp;lt;proposición&amp;gt;+ &amp;lt;demostración&amp;gt;&lt;br /&gt;
                   | (from &amp;lt;hecho&amp;gt;+)? show &amp;lt;proposición&amp;gt;+ &amp;lt;demostración&amp;gt;&lt;br /&gt;
  &amp;lt;proposición&amp;gt;  ::= (&amp;lt;etiqueta&amp;gt;:)? &amp;lt;cadena&amp;gt;&lt;br /&gt;
  hecho          ::= &amp;lt;etiqueta&amp;gt;&lt;br /&gt;
  método         ::= -&lt;br /&gt;
                   | this&lt;br /&gt;
                   | rule &amp;lt;hecho&amp;gt;&lt;br /&gt;
                   | simp &lt;br /&gt;
                   | blast&lt;br /&gt;
                   | auto&lt;br /&gt;
                   | induct &amp;lt;variable&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  La declaración &amp;quot;show&amp;quot; demuestra la conclusión de la demostración&lt;br /&gt;
  mientras que la declaración &amp;quot;have&amp;quot; demuestra un resultado intermedio.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Razonamiento proposicional *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Regla de introducción de la conjunción:&lt;br /&gt;
  · conjI: ⟦P; Q⟧ ⟹ P ∧ Q&lt;br /&gt;
&lt;br /&gt;
  Nota: Se puede consultar mediante&lt;br /&gt;
     thm conjI     &lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de introducción de conjunción con razonamiento progresivo] &lt;br /&gt;
    P, Q ⊢ P ∧ (Q ∧ P)  &lt;br /&gt;
&lt;br /&gt;
  Demostración. Estamos suponiendo&lt;br /&gt;
     P                                     (1)&lt;br /&gt;
  y&lt;br /&gt;
     Q                                     (2)&lt;br /&gt;
  De (2) y (1), por introducción de la conjunción, se tiene&lt;br /&gt;
     Q ∧ P                                 (3)&lt;br /&gt;
  De (1) y (3), por introducción de la conjunción, se tiene&lt;br /&gt;
     P ∧ (Q ∧ P)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma conj2: &lt;br /&gt;
  assumes 1: P and 2: &amp;quot;Q&amp;quot; &lt;br /&gt;
  shows &amp;quot;P ∧ (Q ∧ P)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  from 2 1 have 3: &amp;quot;Q ∧ P&amp;quot; by (rule conjI)&lt;br /&gt;
  from 1 3 show &amp;quot;P ∧ (Q ∧ P)&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Razonamiento progresivo y regresivo en Isabelle:&lt;br /&gt;
  · Isabelle soporta razonamiento progresivo. La anterior demostración&lt;br /&gt;
    es una muestra. &lt;br /&gt;
  · Isabelle soporta razonamiento regresivo. La siguiente demostración&lt;br /&gt;
    es una muestra. &lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de introducción de la conjunción con razonamiento regresivo] &lt;br /&gt;
     P, Q ⊢ P ∧ (Q ∧ P)&lt;br /&gt;
&lt;br /&gt;
  Demostración. Estamos suponiendo&lt;br /&gt;
     P                                    (1)&lt;br /&gt;
  y&lt;br /&gt;
     Q                                    (2)&lt;br /&gt;
&lt;br /&gt;
  Para demostrar el lema, por introducción de la conjunción, basta probar&lt;br /&gt;
     P&lt;br /&gt;
  y&lt;br /&gt;
     Q ∧ P                                (3)&lt;br /&gt;
&lt;br /&gt;
  La condición &amp;#039;P&amp;#039; se tiene por la hipótesis (1). Para demostrar&lt;br /&gt;
  la condición (3), por introducción de la conjunción, basta probar&lt;br /&gt;
     Q                                     &lt;br /&gt;
  y&lt;br /&gt;
     P&lt;br /&gt;
  La condición &amp;#039;Q&amp;#039; se tiene por la hipótesis (2) y la condición &amp;#039;P&amp;#039; se&lt;br /&gt;
  tiene por la hipótesis (1).&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;P&amp;quot; and 2: &amp;quot;Q&amp;quot; &lt;br /&gt;
  shows &amp;quot;P ∧ (Q ∧ P)&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  from 1 show &amp;quot;P&amp;quot; by this&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;Q ∧ P&amp;quot;&lt;br /&gt;
  proof (rule conjI)&lt;br /&gt;
    from 2 show &amp;quot;Q&amp;quot; by this&lt;br /&gt;
  next&lt;br /&gt;
    from 1 show &amp;quot;P&amp;quot; by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  El método &amp;quot;this&amp;quot; demuestra el objetivo usando el hecho actual; es&lt;br /&gt;
  decir, el de la cláusula &amp;quot;from&amp;quot;.  &lt;br /&gt;
&lt;br /&gt;
  Reglas de eliminación de la conjunción:&lt;br /&gt;
  · conjunct1: P ∧ Q ⟹ P&lt;br /&gt;
  · conjunct2: P ∧ Q ⟹ Q&lt;br /&gt;
&lt;br /&gt;
  Regla de introducción de la implicación:&lt;br /&gt;
  · impI: (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de razonamiento híbrido]&lt;br /&gt;
  Sean a y b dos números naturales. Si 0 &amp;lt; a y a &amp;lt; b, entonces a*a &amp;lt; b*b.    &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  fixes a b :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  shows &amp;quot;0 &amp;lt; a ∧ a &amp;lt; b ⟶ a * a &amp;lt; b * b&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume x: &amp;quot;0 &amp;lt; a ∧ a &amp;lt; b&amp;quot;&lt;br /&gt;
  from x have za: &amp;quot;0 &amp;lt; a&amp;quot; by (rule conjunct1)&lt;br /&gt;
  from x have ab: &amp;quot;a &amp;lt; b&amp;quot; by (rule conjunct2)&lt;br /&gt;
  from za ab have aa: &amp;quot;a*a &amp;lt; a*b&amp;quot; by simp&lt;br /&gt;
  from ab have bb: &amp;quot;a*b &amp;lt; b*b&amp;quot; by simp&lt;br /&gt;
  from aa bb show &amp;quot;a*a &amp;lt; b*b&amp;quot; by arith&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Modus ponens:&lt;br /&gt;
  · mp: ⟦P ⟶ Q; P⟧ ⟹ Q&lt;br /&gt;
&lt;br /&gt;
  Reglas de introducción de la disyunción:&lt;br /&gt;
  · disjI1: P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2: Q ⟹ P ∨ Q&lt;br /&gt;
&lt;br /&gt;
  Regla de eliminación de la disyunción:&lt;br /&gt;
  . disjE: ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R&lt;br /&gt;
&lt;br /&gt;
  Lema. [Razonamiento por casos] &lt;br /&gt;
     A ∨ B, A ⟶ C, B ⟶ C ⊢ C&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes ab: &amp;quot;A ∨ B&amp;quot; and ac: &amp;quot;A ⟶ C&amp;quot; and bc: &amp;quot;B ⟶ C&amp;quot;&lt;br /&gt;
  shows &amp;quot;C&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  note ab&lt;br /&gt;
  moreover { &lt;br /&gt;
    assume a: &amp;quot;A&amp;quot; &lt;br /&gt;
    from ac a have &amp;quot;C&amp;quot; by (rule mp) } &lt;br /&gt;
  moreover { &lt;br /&gt;
    assume b: &amp;quot;B&amp;quot; &lt;br /&gt;
    from bc b have &amp;quot;C&amp;quot; by (rule mp) }&lt;br /&gt;
  ultimately show &amp;quot;C&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Resumen de reglas proposicionales:&lt;br /&gt;
  · TrueI:         True&lt;br /&gt;
  · FalseE:        False ⟹ P&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;
  · 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;
  · notI:          (P ⟹ False) ⟹ ¬P&lt;br /&gt;
  · notE:          ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  · impI:          (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
  · impE:          ⟦P ⟶ Q; P; Q ⟹ R⟧ ⟹ R&lt;br /&gt;
  · mp:            ⟦P ⟶ Q; P⟧ ⟹ Q&lt;br /&gt;
  · iff:           (P ⟶ Q) ⟶ (Q ⟶ P) ⟶ P = Q&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;
  · ccontr:        (¬P ⟹ False) ⟹ P&lt;br /&gt;
  · classical:     (¬P ⟹ P) ⟹ P      &lt;br /&gt;
  · exlude_middle: ¬P ∨ P&lt;br /&gt;
  · disjCI:        (¬Q ⟹ P) ⟹ P ∨ Q&lt;br /&gt;
  · impCE:         ⟦P ⟶ Q; ¬P ⟹ R; Q ⟹ R⟧ ⟹ R&lt;br /&gt;
  · iffCE:         ⟦P = Q; ⟦P; Q⟧ ⟹ R; ⟦¬P; ¬Q⟧ ⟹ R⟧ ⟹ R&lt;br /&gt;
  · notnotD:       ¬¬P ⟹ P&lt;br /&gt;
  · swap:          ⟦¬P; ¬R ⟹ P⟧ ⟹ R&lt;br /&gt;
&lt;br /&gt;
  Referencia de reglas de inferencia: Más información sobre las reglas&lt;br /&gt;
  de inferencia se encuentra en la sección  2.2 de &amp;quot;Isabelle&amp;#039;s Logics:&lt;br /&gt;
  HOL&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Atajos de Isar *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Isar tiene muchos atajos, como los siguientes:&lt;br /&gt;
  this        | éste           | el hecho probado en la declaración anterior&lt;br /&gt;
  then        | entonces       | from this&lt;br /&gt;
  hence       | por lo tanto   | then have&lt;br /&gt;
  thus        | de esta manera | then show&lt;br /&gt;
  with hecho+ | con            | from hecho+ and this&lt;br /&gt;
  .           | por ésto       | by this&lt;br /&gt;
  ..          | trivialmente   | by regla (Isabelle adivina la regla)&lt;br /&gt;
&lt;br /&gt;
  Razonamiento acumulativo:&lt;br /&gt;
  Una sucesión de hechos que se van a usar como premisa en una declaración&lt;br /&gt;
  puede agruparse usando &amp;quot;moreover&amp;quot; (además) y usarse en la declaración&lt;br /&gt;
  usando &amp;quot;ultimately&amp;quot; (finalmente). &lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de uso de atajos y razonamiento acumulativo]&lt;br /&gt;
     A ∧ B ⊢ B ∧ A.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;A ∧ B ⟶ B ∧ A&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume ab: &amp;quot;A ∧ B&amp;quot;&lt;br /&gt;
  hence &amp;quot;B&amp;quot; by (rule conjunct2)&lt;br /&gt;
  moreover from ab have &amp;quot;A&amp;quot; ..&lt;br /&gt;
  ultimately show &amp;quot;B ∧ A&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Cuantificadores universal y existencial *}&lt;br /&gt;
&lt;br /&gt;
thm allE&lt;br /&gt;
text {* &lt;br /&gt;
  Reglas del cuantificador universal:&lt;br /&gt;
  · allI: (⋀x. P x) ⟹ ∀x. P x&lt;br /&gt;
  · allE: ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  En la regla allI la nueva variable se introduce mediante la palabra &amp;quot;fix&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo con  cuantificadores universales]&lt;br /&gt;
     ∀x. P ⟶ Q x ⊢ P ⟶ (∀x. Q x)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  assumes a: &amp;quot;∀ x. P ⟶ Q x&amp;quot;&lt;br /&gt;
  shows &amp;quot;P ⟶ (∀ x. Q x)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume p: &amp;quot;P&amp;quot;&lt;br /&gt;
  show &amp;quot;∀ x. Q x&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
    fix y&lt;br /&gt;
    from a have pq: &amp;quot;P ⟶ Q y&amp;quot; by (rule allE)&lt;br /&gt;
    from pq p show &amp;quot;Q y&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Reglas del cuantificador existencial:&lt;br /&gt;
  · exI: P x ⟹ ∃x. P x&lt;br /&gt;
  · exE: ⟦∃x. P x; ⋀x. P x ⟹ Q⟧ ⟹ Q&lt;br /&gt;
  En la regla exE la nueva variable se introduce mediante la declaración &lt;br /&gt;
  &amp;quot;obtain ... where ... by (rule exE)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo con cuantificador existencial y demostración progresiva]&lt;br /&gt;
     ∃x. P ∧ Q(x) ⊢ P ∧ (∃x. Q(x))&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  assumes e: &amp;quot;∃ x. P ∧ Q(x)&amp;quot;&lt;br /&gt;
  shows &amp;quot;P ∧ (∃ x. Q(x))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  from e obtain y where f: &amp;quot;P ∧ Q(y)&amp;quot; by (rule exE) &lt;br /&gt;
  from f have p: &amp;quot;P&amp;quot; by (rule conjunct1)&lt;br /&gt;
  from f have q: &amp;quot;Q(y)&amp;quot; by (rule conjunct2)&lt;br /&gt;
  from q have eq: &amp;quot;∃ x. Q(x)&amp;quot; by (rule exI)&lt;br /&gt;
  from p eq show &amp;quot;P ∧ (∃ x. Q(x))&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Ejemplo con cuantificador existencial y demostración automática] &lt;br /&gt;
     ∃x. P ∧ Q(x) ⊢ P ∧ (∃x. Q(x))&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  assumes e: &amp;quot;∃ x. P ∧ Q(x)&amp;quot;&lt;br /&gt;
  shows &amp;quot;P ∧ (∃ x. Q(x))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  from e obtain y where f: &amp;quot;P ∧ Q(y)&amp;quot; ..&lt;br /&gt;
  from f have p: &amp;quot;P&amp;quot; ..&lt;br /&gt;
  from f have q: &amp;quot;Q(y)&amp;quot; ..&lt;br /&gt;
  from q have eq: &amp;quot;∃x. Q(x)&amp;quot; ..&lt;br /&gt;
  from p eq show &amp;quot;P ∧ (∃x. Q(x))&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Ejemplo con cuantificador existencial y demostración regresiva]&lt;br /&gt;
     ∃x. P ∧ Q(x) ⊢ P ∧ (∃x. Q(x))&amp;quot;&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  assumes e: &amp;quot;∃x. P ∧ Q(x)&amp;quot;&lt;br /&gt;
  shows &amp;quot;P ∧ (∃x. Q(x))&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &amp;quot;P&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
    from e obtain y where p: &amp;quot;P ∧ Q(y)&amp;quot; by (rule exE)&lt;br /&gt;
    from p show &amp;quot;P&amp;quot; by (rule conjunct1)&lt;br /&gt;
    qed&lt;br /&gt;
  show &amp;quot;∃x. Q(x)&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
    from e obtain y where p: &amp;quot;P ∧ Q(y)&amp;quot; by (rule exE)&lt;br /&gt;
    from p have q: &amp;quot;Q(y)&amp;quot; by (rule conjunct2)&lt;br /&gt;
    from q show &amp;quot;∃x. Q(x)&amp;quot; by (rule exI)&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición. [Ejemplo de definición existencial]&lt;br /&gt;
  El número natural x divide al número natural y si existe un natural k&lt;br /&gt;
  tal que k×x = y. Se representa por x | y. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition divide :: &amp;quot;nat ⇒ nat ⇒ bool&amp;quot; (&amp;quot;_ | _&amp;quot; [80,80] 80) where&lt;br /&gt;
  &amp;quot;x | y ≡ ∃k. k*x = y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo de activación automática de regla de simplificación:&lt;br /&gt;
  La definición de divide se añade a las reglas de simplificación. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
declare divide_def[simp]&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Transitividad de la divisibilidad]&lt;br /&gt;
  Sean a, b y c números naturales. Si b es divisible por a y c es&lt;br /&gt;
  divisible por b, entonces c es divisible por a. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma divide_trans: &lt;br /&gt;
  fixes a b c :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  assumes ab: &amp;quot;a | b&amp;quot; and bc: &amp;quot;b | c&amp;quot;&lt;br /&gt;
  shows &amp;quot;a | c&amp;quot;&lt;br /&gt;
proof simp&lt;br /&gt;
  from ab obtain m where m: &amp;quot;m*a = b&amp;quot; by auto&lt;br /&gt;
  from bc obtain n where n: &amp;quot;n*b = c&amp;quot; by auto&lt;br /&gt;
  from m n have &amp;quot;m*n*a = c&amp;quot; by auto&lt;br /&gt;
  thus &amp;quot;∃k. k*a = c&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Método auto: En el lema anterior es la primera vez que se usa el&lt;br /&gt;
  método automático &amp;quot;auto&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Lema. [CNS de divisibilidad]&lt;br /&gt;
  Sean a y b dos números naturales. Entonces a es divisible por b syss&lt;br /&gt;
  el resto de dividir a entre b es cero.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma CNS_divisibilidad: &lt;br /&gt;
  &amp;quot;(a | b) = (b mod a = 0)&amp;quot; &lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
section {* Razonamiento ecuacional *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Elementos para el razonamiento ecuacional:&lt;br /&gt;
  El razonamiento ecuacional se realiza de manera más concisa usando la&lt;br /&gt;
  combinación de &amp;quot;also&amp;quot; (además) y &amp;quot;finally&amp;quot; (finalmente).&lt;br /&gt;
  &lt;br /&gt;
  Lema. [Ejemplo de razonamiento ecuacional]&lt;br /&gt;
  Si a=b, b=c y c=d, entonces a=d.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;a = b&amp;quot; and 2: &amp;quot;b = c&amp;quot; and 3: &amp;quot;c = d&amp;quot;&lt;br /&gt;
  shows &amp;quot;a = d&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;a = b&amp;quot; by (rule 1)&lt;br /&gt;
  also have &amp;quot;… = c&amp;quot; by (rule 2)&lt;br /&gt;
  also have &amp;quot;… = d&amp;quot; by (rule 3)&lt;br /&gt;
  finally show &amp;quot;a = d&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  El lema anterior puede demostrarse automáticamente con la maza&lt;br /&gt;
  (&amp;quot;sledgehammer&amp;quot;). &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;a = b&amp;quot; and 2: &amp;quot;b = c&amp;quot; and 3: &amp;quot;c = d&amp;quot;&lt;br /&gt;
  shows &amp;quot;a = d&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;a=d&amp;quot; by (metis 1 2 3)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_11:_Caso_de_estudio:_Compilaci%C3%B3n_de_expresiones&amp;diff=67</id>
		<title>Tema 11: Caso de estudio: Compilación de expresiones</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_11:_Caso_de_estudio:_Compilaci%C3%B3n_de_expresiones&amp;diff=67"/>
		<updated>2012-01-31T19:08:46Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 11: Caso de estudio: Compilación de expresiones *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_11&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El objetivo de este tema es contruir un compilador de expresiones&lt;br /&gt;
  genéricas (construidas con variables, constantes y operaciones&lt;br /&gt;
  binarias) a una máquina de pila y demostrar su corrección.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Las expresiones y el intérprete *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. Las expresiones son las constantes, las variables&lt;br /&gt;
  (representadas por números naturales) y las aplicaciones de operadores&lt;br /&gt;
  binarios a dos expresiones. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
types &amp;#039;v binop = &amp;quot;&amp;#039;v ⇒ &amp;#039;v ⇒ &amp;#039;v&amp;quot;&lt;br /&gt;
datatype &amp;#039;v expr = &lt;br /&gt;
    Const &amp;#039;v &lt;br /&gt;
  | Var nat &lt;br /&gt;
  | App &amp;quot;&amp;#039;v binop&amp;quot; &amp;quot;&amp;#039;v expr&amp;quot; &amp;quot;&amp;#039;v expr&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. [Intérprete] &lt;br /&gt;
  La función &amp;quot;valor&amp;quot; toma como argumentos una expresión y un entorno&lt;br /&gt;
  (i.e. una aplicación de las variables en elementos del lenguaje) y&lt;br /&gt;
  devuelve el valor de la expresión en el entorno.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec valor :: &amp;quot;&amp;#039;v expr ⇒ (nat ⇒ &amp;#039;v) ⇒ &amp;#039;v&amp;quot; where&lt;br /&gt;
  &amp;quot;valor (Const b) ent = b&amp;quot;&lt;br /&gt;
| &amp;quot;valor (Var x) ent = ent x&amp;quot;&lt;br /&gt;
| &amp;quot;valor (App f e1 e2) ent = (f (valor e1 ent) (valor e2 ent))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo. A continuación mostramos algunos ejemplos de evaluación con&lt;br /&gt;
  el intérprete. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;valor (Const 3) id = 3 ∧&lt;br /&gt;
  valor (Var 2) id = 2 ∧&lt;br /&gt;
  valor (Var 2) (λx. x+1) = 3 ∧ &lt;br /&gt;
  valor (App (op +) (Const 3) (Var 2)) (λx. x+1) = 6 ∧&lt;br /&gt;
  valor (App (op +) (Const 3) (Var 2)) (λx. x+4) = 9&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* La máquina de pila *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. La máquina de pila tiene tres clases de intrucciones:&lt;br /&gt;
  · cargar en la pila una constante,&lt;br /&gt;
  · cargar en la pila el contenido de una dirección y&lt;br /&gt;
  · aplicar un operador binario a los dos elementos superiores de la pila.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;v instr = &lt;br /&gt;
    IConst &amp;#039;v &lt;br /&gt;
  | ILoad nat &lt;br /&gt;
  | IApp &amp;quot;&amp;#039;v binop&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. [Ejecución]&lt;br /&gt;
  La ejecución de la máquina de pila se modeliza mediante la función&lt;br /&gt;
  &amp;quot;ejec&amp;quot; que toma una lista de intrucciones, una memoria (representada&lt;br /&gt;
  como una función de las direcciones a los valores, análogamente a los&lt;br /&gt;
  entornos) y una pila (representada como una lista) y devuelve la pila al&lt;br /&gt;
  final de la ejecución.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec ejec :: &amp;quot;&amp;#039;v instr list ⇒ (nat⇒&amp;#039;v) ⇒ &amp;#039;v list ⇒ &amp;#039;v list&amp;quot; where&lt;br /&gt;
  &amp;quot;ejec [] ent vs = vs&amp;quot;&lt;br /&gt;
| &amp;quot;ejec (i#is) ent vs = &lt;br /&gt;
     (case i of&lt;br /&gt;
        IConst v ⇒ ejec is ent (v#vs)&lt;br /&gt;
      | ILoad x ⇒ ejec is ent ((ent x)#vs)&lt;br /&gt;
      | IApp f ⇒ ejec is ent ((f (hd vs) (hd (tl vs)))#(tl(tl vs))))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  A continuación se muestran ejemplos de ejecución.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  &amp;quot;ejec [IConst 3] id [7] = [3,7] ∧&lt;br /&gt;
  ejec [ILoad 2, IConst 3] id [7] = [3,2,7] ∧&lt;br /&gt;
  ejec [ILoad 2, IConst 3] (λx. x+4) [7] = [3,6,7] ∧&lt;br /&gt;
  ejec [ILoad 2, IConst 3, IApp (op +)] (λx. x+4) [7] = [9,7]&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* El compilador *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. El compilador &amp;quot;comp&amp;quot; traduce una expresión en una lista de&lt;br /&gt;
  instrucciones. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec comp :: &amp;quot;&amp;#039;v expr ⇒ &amp;#039;v instr list&amp;quot; where&lt;br /&gt;
  &amp;quot;comp (Const v) = [IConst v]&amp;quot;&lt;br /&gt;
| &amp;quot;comp (Var x) = [ILoad x]&amp;quot;&lt;br /&gt;
| &amp;quot;comp (App f e1 e2) = (comp e2) @ (comp e1) @ [IApp f]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  A continuación se muestran ejemplos de compilación.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  &amp;quot;comp (Const 3) = [IConst 3] ∧&lt;br /&gt;
  comp (Var 2) = [ILoad 2] ∧&lt;br /&gt;
  comp (App (op +) (Const 3) (Var 2)) = [ILoad 2, IConst 3, IApp (op +)]&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Corrección del compilador *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Para demostrar que el compilador es correcto, probamos que el resultado de&lt;br /&gt;
  compilar una expresión y a continuación ejecutarla es lo mismo que&lt;br /&gt;
  interpretarla; es decir, &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;ejec (comp e) ent [] = [valor e ent]&amp;quot; &lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El teorema anterior no puede demostrarse por inducción en e. Para&lt;br /&gt;
  demostrarlo por inducción, lo generalizamos a&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;∀vs. ejec (comp e) ent vs = (valor e ent)#vs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En la demostración del teorema anterior usaremos el siguiente lema.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma ejec_append:&lt;br /&gt;
  &amp;quot;∀ vs. ejec (xs@ys) ent vs = ejec ys ent (ejec xs ent vs)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;?P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;?P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;?P (a#xs)&amp;quot;&lt;br /&gt;
  proof (cases &amp;quot;a&amp;quot;)&lt;br /&gt;
    case IConst thus ?thesis using HI by simp&lt;br /&gt;
  next&lt;br /&gt;
    case ILoad thus ?thesis using HI by simp&lt;br /&gt;
  next&lt;br /&gt;
    case IApp thus ?thesis using HI by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Una demostración más detallada del lema es la siguiente:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma ejec_append_2:&lt;br /&gt;
  &amp;quot;∀ vs. ejec (xs@ys) ent vs = ejec ys ent (ejec xs ent vs)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;?P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;?P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;?P (a#xs)&amp;quot;&lt;br /&gt;
  proof (cases &amp;quot;a&amp;quot;)&lt;br /&gt;
    fix v assume C1: &amp;quot;a=IConst v&amp;quot;&lt;br /&gt;
    show &amp;quot; ∀vs. ejec ((a#xs)@ys) ent vs = ejec ys ent (ejec (a#xs) ent vs)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix vs&lt;br /&gt;
      have &amp;quot;ejec ((a#xs)@ys) ent vs = ejec (((IConst v)#xs)@ys) ent vs&amp;quot;&lt;br /&gt;
        using C1 by simp&lt;br /&gt;
      also have &amp;quot;… = ejec (xs@ys) ent (v#vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec xs ent (v#vs))&amp;quot; using HI by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec ((IConst v)#xs) ent vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec (a#xs) ent vs)&amp;quot; using C1 by simp&lt;br /&gt;
      finally show &amp;quot;ejec ((a#xs)@ys) ent vs = &lt;br /&gt;
                    ejec ys ent (ejec (a#xs) ent vs)&amp;quot; .&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    fix n assume C2: &amp;quot;a=ILoad n&amp;quot;&lt;br /&gt;
    show &amp;quot; ∀vs. ejec ((a#xs)@ys) ent vs = ejec ys ent (ejec (a#xs) ent vs)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix vs&lt;br /&gt;
      have &amp;quot;ejec ((a#xs)@ys) ent vs = ejec (((ILoad n)#xs)@ys) ent vs&amp;quot;&lt;br /&gt;
        using C2 by simp&lt;br /&gt;
      also have &amp;quot;… = ejec (xs@ys) ent ((ent n)#vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec xs ent ((ent n)#vs))&amp;quot; using HI by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec ((ILoad n)#xs) ent vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec (a#xs) ent vs)&amp;quot; using C2 by simp&lt;br /&gt;
      finally show &amp;quot;ejec ((a#xs)@ys) ent vs = &lt;br /&gt;
                    ejec ys ent (ejec (a#xs) ent vs)&amp;quot; .&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    fix f assume C3: &amp;quot;a=IApp f&amp;quot;&lt;br /&gt;
    show &amp;quot;∀vs. ejec ((a#xs)@ys) ent vs = ejec ys ent (ejec (a#xs) ent vs)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix vs&lt;br /&gt;
      have &amp;quot;ejec ((a#xs)@ys) ent vs = ejec (((IApp f)#xs)@ys) ent vs&amp;quot;&lt;br /&gt;
        using C3 by simp&lt;br /&gt;
      also have &amp;quot;… = ejec (xs@ys) ent ((f (hd vs) (hd (tl vs)))#(tl(tl vs)))&amp;quot; &lt;br /&gt;
        by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys &lt;br /&gt;
                          ent &lt;br /&gt;
                          (ejec xs ent ((f (hd vs) (hd (tl vs)))#(tl(tl vs))))&amp;quot; &lt;br /&gt;
        using HI by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec ((IApp f)#xs) ent vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec (a#xs) ent vs)&amp;quot; using C3 by simp&lt;br /&gt;
      finally show &amp;quot;ejec ((a#xs)@ys) ent vs = &lt;br /&gt;
                    ejec ys ent (ejec (a#xs) ent vs)&amp;quot; .&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La demostración del teorema es la siguiente&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;∀ vs. ejec (comp e) ent vs = (valor e ent)#vs&amp;quot;&lt;br /&gt;
proof (induct e)&lt;br /&gt;
  fix v&lt;br /&gt;
  show &amp;quot;∀vs. ejec (comp (Const v)) ent vs = (valor (Const v) ent)#vs&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;∀vs. ejec (comp (Var x)) ent vs = (valor (Var x) ent) # vs&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix f e1 e2&lt;br /&gt;
  assume HI1: &amp;quot;∀vs. ejec (comp e1) ent vs = (valor e1 ent) # vs&amp;quot;&lt;br /&gt;
    and HI2: &amp;quot;∀vs. ejec (comp e2) ent vs = (valor e2 ent) # vs&amp;quot;&lt;br /&gt;
  show &amp;quot;∀vs. ejec (comp (App f e1 e2)) ent vs = (valor (App f e1 e2) ent) # vs&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix vs&lt;br /&gt;
    have &amp;quot;ejec (comp (App f e1 e2)) ent vs&lt;br /&gt;
          = ejec ((comp e2) @ (comp e1) @ [IApp f]) ent vs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = ejec ((comp e1) @ [IApp f]) ent (ejec (comp e2) ent vs)&amp;quot;&lt;br /&gt;
      using ejec_append by blast&lt;br /&gt;
    also have &amp;quot;… = ejec [IApp f] &lt;br /&gt;
                         ent &lt;br /&gt;
                         (ejec (comp e1) ent (ejec (comp e2) ent vs))&amp;quot; &lt;br /&gt;
      using ejec_append by blast&lt;br /&gt;
    also have &amp;quot;… =  ejec [IApp f] ent (ejec (comp e1) ent ((valor e2 ent)#vs))&amp;quot;&lt;br /&gt;
      using HI2 by simp&lt;br /&gt;
    also have &amp;quot;… = ejec [IApp f] ent ((valor e1 ent)#((valor e2 ent)#vs))&amp;quot;&lt;br /&gt;
      using HI1 by simp&lt;br /&gt;
    also have &amp;quot;… = (f (valor e1 ent) (valor e2 ent))#vs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (valor (App f e1 e2) ent) # vs&amp;quot; by simp&lt;br /&gt;
    finally &lt;br /&gt;
    show &amp;quot;ejec (comp (App f e1 e2)) ent vs = (valor (App f e1 e2) ent) # vs&amp;quot; &lt;br /&gt;
      by blast&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_12:_Conjuntos,_funciones_y_relaciones&amp;diff=66</id>
		<title>Tema 12: Conjuntos, funciones y relaciones</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_12:_Conjuntos,_funciones_y_relaciones&amp;diff=66"/>
		<updated>2012-01-31T19:07:29Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 12: Conjuntos, funciones y relaciones *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_12&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Conjuntos *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Operaciones con conjuntos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. La teoría elemental de conjuntos es HOL/Set.thy.&lt;br /&gt;
&lt;br /&gt;
  Nota. En un conjunto todos los elemento son del mismo tipo (por&lt;br /&gt;
  ejemplo, del tipo τ) y el conjunto tiene tipo (en el ejemplo, &amp;quot;τ set&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
  Reglas de la intersección:&lt;br /&gt;
  · IntI:  ⟦c ∈ A; c ∈ B⟧ ⟹ c ∈ A ∩ B&lt;br /&gt;
  · IntD1: c ∈ A ∩ B ⟹ c ∈ A&lt;br /&gt;
  · IntD2: c ∈ A ∩ B ⟹ c ∈ B&lt;br /&gt;
&lt;br /&gt;
  Nota. Propiedades del complementario:&lt;br /&gt;
  · Compl_iff: (c ∈ - A) = (c ∉ A)&lt;br /&gt;
  · Compl_Un:  - (A ∪ B) = - A ∩ - B&lt;br /&gt;
&lt;br /&gt;
  Nota. El conjunto vacío se representa por {} y el universal por UNIV. &lt;br /&gt;
&lt;br /&gt;
  Nota. Propiedades de la \textbf{diferencia} y del complementario:&lt;br /&gt;
  · Diff_disjoint:   A ∩ (B - A) = {}&lt;br /&gt;
  · Compl_partition: A ∪ - A = UNIV&lt;br /&gt;
&lt;br /&gt;
  Nota. Reglas de la relación de \textbf{subconjunto}:&lt;br /&gt;
  · subsetI: (⋀x. x ∈ A ⟹ x ∈ B) ⟹ A ⊆ B&lt;br /&gt;
  · subsetD: ⟦A ⊆ B; c ∈ A⟧ ⟹ c ∈ B&lt;br /&gt;
&lt;br /&gt;
  Nota. Ejemplo trivial.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A ∪ B ⊆ C) = (A ⊆ C ∧ B ⊆ C)&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Nota. Otro ejemplo trivial.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A ⊆ -B) = (B ⊆ -A)&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Principio de extensionalidad de conjuntos:&lt;br /&gt;
  · set_ext: (⋀x. (x ∈ A) = (x ∈ B)) ⟹ A = B&lt;br /&gt;
&lt;br /&gt;
  Reglas de la igualdad de conjuntos:&lt;br /&gt;
  · equalityI: ⟦A ⊆ B; B ⊆ A⟧ ⟹ A = B&lt;br /&gt;
  · equalityE: ⟦A = B; ⟦A ⊆ B; B ⊆ A⟧ ⟹ P⟧ ⟹ P&lt;br /&gt;
&lt;br /&gt;
  Lema. [Analogía entre intersección y conjunción]&lt;br /&gt;
  &amp;quot;x ∈ A ∩ B&amp;quot; syss &amp;quot;x ∈ A&amp;quot; y &amp;quot;x ∈ B&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x ∈ A ∩ B) = (x ∈ A ∧ x ∈ B)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Analogía entre unión y disyunción]&lt;br /&gt;
  &amp;quot;x ∈ A ∪ B&amp;quot; syss &amp;quot;x ∈ A&amp;quot; ó &amp;quot;x ∈ B&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x ∈ A ∪ B) = (x ∈ A ∨ x ∈ B)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Analogía entre subconjunto e implicación]&lt;br /&gt;
  &amp;quot;(A ⊆ B)&amp;quot; syss para todo &amp;quot;x&amp;quot;, si &amp;quot;x ∈ A&amp;quot; entonces &amp;quot;x ∈ B&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A ⊆ B) = (∀ x. x ∈ A ⟶ x ∈ B)&amp;quot; &lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Analogía entre complementario y negación]&lt;br /&gt;
  x pertenece al complementario de A syss x no pertenece a A.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x ∈ -A) = (x ∉ A)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
subsection {* Notación de conjuntos finitos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. La teoría de conjuntos finitos es HOL/Finite_Set.thy.&lt;br /&gt;
&lt;br /&gt;
  Nota. Los conjuntos finitos se definen por inducción a partir de las&lt;br /&gt;
  siguientes reglas inductivas:&lt;br /&gt;
  · El conjunto vacío es un conjunto finito.&lt;br /&gt;
    · emptyI: &amp;quot;finite {}&amp;quot;&lt;br /&gt;
  · Si se le añade un elemento a un conjunto finito se obtiene otro&lt;br /&gt;
    conjunto finito. &lt;br /&gt;
    · insertI: &amp;quot;finite A ⟹ finite (insert a A)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  A continuación se muestran ejemplos de conjuntos finitos.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;insert 2 {} = {2} ∧&lt;br /&gt;
  insert 3 {2} = {2,3} ∧&lt;br /&gt;
  insert 2 {2,3} = {2,3} ∧&lt;br /&gt;
  {2,3} = {3,2,3,2,2}&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. Los conjuntos finitos se representan con la notación conjuntista&lt;br /&gt;
  habitual: los elementos entre llaves y separados por comas.&lt;br /&gt;
&lt;br /&gt;
  Nota. Lema trivial.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{a,b} ∪ {c,d} = {a,b,c,d}&amp;quot; &lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. Conjetura falsa.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{a,b} ∩ {b,c} = {b}&amp;quot; &lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. Conjetura corregida.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{a,b} ∩ {b,c} = (if a=c then {a,b} else {b})&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Sumas y productos de conjuntos finitos:&lt;br /&gt;
  · (setsum f A) es la suma de la aplicación de f a los elementos del&lt;br /&gt;
    conjunto finito A,  &lt;br /&gt;
  · (setprod f A) es producto de la aplicación de f a los elementos del&lt;br /&gt;
    conjunto finito A,  &lt;br /&gt;
  · ∑A es la suma de los elementos del conjunto finito A,&lt;br /&gt;
  · ∏A es el producto de los elementos del conjunto finito A.&lt;br /&gt;
&lt;br /&gt;
  Ejemplos de definiciones recursivas sobre conjuntos finitos: &lt;br /&gt;
  Sea A un conjunto finito de números naturales.&lt;br /&gt;
  · sumaConj A es la suma de los elementos A.&lt;br /&gt;
  · productoConj A es el producto de los elementos de A.&lt;br /&gt;
  · sumaCuadradosconj A es la suma de los cuadrados de los elementos A. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition sumaConj :: &amp;quot;nat set ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaConj S ≡ ∑S&amp;quot;&lt;br /&gt;
&lt;br /&gt;
definition productoConj :: &amp;quot;nat set ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;productoConj S ≡ ∏S&amp;quot;&lt;br /&gt;
&lt;br /&gt;
definition sumaCuadradosConj :: &amp;quot;nat set ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaCuadradosConj S ≡ setsum (λx. x*x) S&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. Para simplificar lo que sigue, declaramos las anteriores&lt;br /&gt;
  definiciones como reglas de simplificación.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
declare sumaConj_def[simp]&lt;br /&gt;
declare productoConj_def[simp]&lt;br /&gt;
declare sumaCuadradosConj_def[simp]&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplos de evaluación de las anteriores definiciones recursivas.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;sumaConj {1,2,3,4} = 10 ∧&lt;br /&gt;
  productoConj {1,2,3} = productoConj {3,2} ∧ &lt;br /&gt;
  sumaCuadradosConj {1,2,3,4} = 30&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Inducción sobre conjuntos finitos: Para demostrar que todos los&lt;br /&gt;
  conjuntos finitos tienen una propiedad P basta probar que&lt;br /&gt;
  · El conjunto vacío tiene la propiedad P.&lt;br /&gt;
  · Si a un conjunto finito que tiene la propiedad P se le añade un nuevo&lt;br /&gt;
    elemento, el conjunto obtenido sigue teniendo la propiedad P.&lt;br /&gt;
  En forma de regla&lt;br /&gt;
  · finite_induct: ⟦finite F; &lt;br /&gt;
                    P {}; &lt;br /&gt;
                    ⋀x F. ⟦finite F; x ∉ F; P F⟧ ⟹ P ({x} ∪ F)⟧ &lt;br /&gt;
                   ⟹ P F&lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de inducción sobre conjuntos finitos]&lt;br /&gt;
  Sea S un conjunto finito de números naturales. Entonces todos los&lt;br /&gt;
  elementos de S son menores o iguales que la suma de los elementos de S.&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;finite S ⟹ ∀x∈S. x ≤ sumaConj S&amp;quot;&lt;br /&gt;
by (induct rule: finite_induct) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostración estructurada:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma sumaConj_acota: &amp;quot;finite S ⟹ ∀x∈S. x ≤ sumaConj S&amp;quot;&lt;br /&gt;
proof (induct rule: finite_induct)&lt;br /&gt;
  show &amp;quot;∀x∈{}. x ≤ sumaConj {}&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x and F&lt;br /&gt;
  assume fF: &amp;quot;finite F&amp;quot; &lt;br /&gt;
     and xF: &amp;quot;x ∉ F&amp;quot; &lt;br /&gt;
     and HI: &amp;quot;∀ x∈F. x ≤ sumaConj F&amp;quot;&lt;br /&gt;
  show &amp;quot;∀y∈insert x F. y ≤ sumaConj (insert x F)&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    fix y &lt;br /&gt;
    assume &amp;quot;y ∈ insert x F&amp;quot;&lt;br /&gt;
    show &amp;quot;y ≤ sumaConj (insert x F)&amp;quot;&lt;br /&gt;
    proof (cases &amp;quot;y = x&amp;quot;)&lt;br /&gt;
      assume &amp;quot;y = x&amp;quot;&lt;br /&gt;
      hence &amp;quot;y ≤ x + (sumaConj F)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = sumaConj (insert x F)&amp;quot; using fF xF by simp&lt;br /&gt;
      finally show ?thesis .&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;y ≠ x&amp;quot;&lt;br /&gt;
      hence &amp;quot;y ∈ F&amp;quot; using `y ∈ insert x F` by simp&lt;br /&gt;
      hence &amp;quot;y ≤ sumaConj F&amp;quot; using HI by blast&lt;br /&gt;
      also have &amp;quot;… ≤ x + (sumaConj F)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = sumaConj (insert x F)&amp;quot; using fF xF by simp&lt;br /&gt;
      finally show ?thesis .&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsection {* Definiciones por comprensión *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El conjunto de los elementos que cumple la propiedad P se representa&lt;br /&gt;
  por {x. P}. &lt;br /&gt;
&lt;br /&gt;
  Reglas de comprensión (relación entre colección y pertenencia):&lt;br /&gt;
  · mem_Collect_eq: (a ∈ {x. P x}) = P a&lt;br /&gt;
  · Collect_mem_eq: {x. x ∈ A} = A&lt;br /&gt;
  &lt;br /&gt;
  Dos lemas triviales.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{x. P x ∨ x ∈ A} = {x. P x} ∪ A&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{x. P x ⟶ Q x} = -{x. P x} ∪ {x. Q x}&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. Ejemplo con la sintaxis general de comprensión.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;{p*q | p q. p ∈ prime ∧ q ∈ prime} = &lt;br /&gt;
   {z. ∃p q. z = p*q ∧ p ∈ prime ∧ q ∈ prime}&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
   En HOL, la notación conjuntista es azúcar sintáctica:&lt;br /&gt;
   · x ∈ A  es equivalente a A(x).&lt;br /&gt;
   · {x. P} es equivalente a λx. P.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. [Ejemplo de definición por comprensión]&lt;br /&gt;
  El conjunto de los pares es el de los números n para los que existe un&lt;br /&gt;
  m tal que n = 2*m.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition Pares :: &amp;quot;nat set&amp;quot; where&lt;br /&gt;
  &amp;quot;Pares ≡ {n. ∃ m. n = 2*m }&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo. Los números 2 y 34 son pares.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;2 ∈ Pares ∧&lt;br /&gt;
  34 ∈ Pares&amp;quot; &lt;br /&gt;
by (simp add: Pares_def)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. El conjunto de los impares es el de los números n para los&lt;br /&gt;
  que existe un m tal que n = 2*m + 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition Impares :: &amp;quot;nat set&amp;quot; where&lt;br /&gt;
  &amp;quot;Impares ≡ {n. ∃ m. n = 2*m + 1 }&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Ejemplo con las reglas de intersección y comprensión]&lt;br /&gt;
  El conjunto de los pares es disjunto con el de los impares.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;x ∉ (Pares ∩ Impares)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  fix x assume S: &amp;quot;x ∈ (Pares ∩ Impares)&amp;quot;&lt;br /&gt;
  hence &amp;quot;x ∈ Pares&amp;quot; by (rule IntD1)&lt;br /&gt;
  hence &amp;quot;∃ m. x = 2 * m&amp;quot; by (simp only: Pares_def mem_Collect_eq)&lt;br /&gt;
  then obtain p where p: &amp;quot;x = 2 * p&amp;quot; .. &lt;br /&gt;
&lt;br /&gt;
  from S have &amp;quot;x ∈ Impares&amp;quot; by (rule IntD2)&lt;br /&gt;
  hence &amp;quot;∃ m. x = 2 * m + 1&amp;quot; by (simp only: Impares_def mem_Collect_eq)&lt;br /&gt;
  then obtain q where q: &amp;quot;x = 2 * q + 1&amp;quot; .. &lt;br /&gt;
&lt;br /&gt;
  from p and q show &amp;quot;False&amp;quot; by arith&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsection {* Cuantificadores acotados *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Reglas de cuantificador universal acotado (&amp;quot;bounded&amp;quot;):&lt;br /&gt;
  · ballI: (⋀x. x ∈ A ⟹ P x) ⟹ ∀x∈A. P x&lt;br /&gt;
  · bspec: ⟦∀x∈A. P x; x ∈ A⟧ ⟹ P x&lt;br /&gt;
&lt;br /&gt;
  Reglas de cuantificador existencial acotado (&amp;quot;bounded&amp;quot;):&lt;br /&gt;
  · bexI: ⟦P x; x ∈ A⟧ ⟹ ∃x∈A. P x&lt;br /&gt;
  · bexE: ⟦∃x∈A. P x; ⋀x. ⟦x ∈ A; P x⟧ ⟹ Q⟧ ⟹ Q&lt;br /&gt;
&lt;br /&gt;
  Reglas de la unión indexada:&lt;br /&gt;
  · UN_iff: (b ∈ (⋃x∈A. B x)) = (∃x∈A. b ∈ B x)&lt;br /&gt;
  · UN_I:   ⟦a ∈ A; b ∈ B a⟧ ⟹ b ∈ (⋃x∈A. B x)&lt;br /&gt;
  · UN_E:   ⟦b ∈ (⋃x∈A. B x); ⋀x. ⟦x ∈ A; b ∈ B x⟧ ⟹ R⟧ ⟹ R&lt;br /&gt;
&lt;br /&gt;
  Reglas de la unión de una familia:&lt;br /&gt;
  · Union_def: ⋃S = (⋃x∈S. x)&lt;br /&gt;
  · Union_iff: (A ∈ ⋃C) = (∃X∈C. A ∈ X)&lt;br /&gt;
&lt;br /&gt;
  Reglas de la intersección indexada:&lt;br /&gt;
  · INT_iff: (b ∈ (⋂x∈A. B x)) = (∀x∈A. b ∈ B x)&lt;br /&gt;
  · INT_I:   (⋀x. x ∈ A ⟹ b ∈ B x) ⟹ b ∈ (⋂x∈A. B x)&lt;br /&gt;
  · INT_E:   ⟦b ∈ (⋂x∈A. B x); b ∈ B a ⟹ R; a ∉ A ⟹ R⟧ ⟹ R&lt;br /&gt;
&lt;br /&gt;
  Reglas de la intersección de una familia:&lt;br /&gt;
  · Inter_def: ⋂S = (⋂x∈S. x)&lt;br /&gt;
  · Inter_iff: (A ∈ ⋂C) = (∀X∈C. A ∈ X)&lt;br /&gt;
&lt;br /&gt;
  Abreviaturas:&lt;br /&gt;
  · &amp;quot;Collect P&amp;quot; es lo mismo que &amp;quot;{x. P}&amp;quot;.&lt;br /&gt;
  · &amp;quot;All P&amp;quot;     es lo mismo que &amp;quot;∀x. P x&amp;quot;.&lt;br /&gt;
  · &amp;quot;Ex P&amp;quot;      es lo mismo que &amp;quot;∃x. P x&amp;quot;.&lt;br /&gt;
  · &amp;quot;Ball P&amp;quot;    es lo mismo que &amp;quot;∀x∈A. P x&amp;quot;.&lt;br /&gt;
  · &amp;quot;Bex P&amp;quot;     es lo mismo que &amp;quot;∃x∈A. P x&amp;quot;.&lt;br /&gt;
  *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Conjuntos finitos y cardinalidad *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El número de elementos de un conjunto finito A es el cardinal de A y se&lt;br /&gt;
  representa por &amp;quot;card A&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Ejemplos de cardinales de conjuntos finitos.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;card {} = 0 ∧&lt;br /&gt;
   card {4} = 1 ∧&lt;br /&gt;
   card {4,1} = 2 ∧&lt;br /&gt;
   x ≠ y ⟹ card {x,y} = 2&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Propiedades de cardinales:&lt;br /&gt;
  · Cardinal de la unión de conjuntos finitos:&lt;br /&gt;
    card_Un_Int: ⟦finite A; finite B⟧ &lt;br /&gt;
                 ⟹ card A + card B = card (A ∪ B) + card (A ∩ B)&amp;quot; &lt;br /&gt;
  · Cardinal del conjunto potencia: &lt;br /&gt;
    card_Pow: finite A ⟹ card (Pow A) = 2 ^ card A&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Funciones *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  La teoría de funciones es HOL/Fun.thy. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Nociones básicas de funciones *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Principio de extensionalidad para funciones:&lt;br /&gt;
  · ext: (⋀x. f x = g x) ⟹ f = g&lt;br /&gt;
&lt;br /&gt;
  Actualización de funciones  &lt;br /&gt;
  · fun_upd_apply: (f(x := y)) z = (if z = x then y else f z)&lt;br /&gt;
  · fun_upd_upd:   f(x := y, x := z) = f(x := z)&lt;br /&gt;
&lt;br /&gt;
  Función identidad&lt;br /&gt;
  · id_def: id ≡ λx. x&lt;br /&gt;
&lt;br /&gt;
  Composición de funciones:&lt;br /&gt;
  · o_def: f ∘ g = (λx. f (g x))&lt;br /&gt;
&lt;br /&gt;
  Asociatividad de la composición:&lt;br /&gt;
  · o_assoc: f ∘ (g ∘ h) = (f ∘ g) ∘ h&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Funciones inyectivas, suprayectivas y biyectivas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Función inyectiva sobre A:&lt;br /&gt;
  · inj_on_def: inj_on f A ≡ ∀x∈A. ∀y∈A. f x = f y ⟶ x = y&lt;br /&gt;
&lt;br /&gt;
  Nota. &amp;quot;inj f&amp;quot; es una abreviatura de &amp;quot;inj_on f UNIV&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Función suprayectiva:&lt;br /&gt;
  · surj_def: surj f ≡ ∀y. ∃x. y = f x&lt;br /&gt;
&lt;br /&gt;
  Función biyectiva:&lt;br /&gt;
  · bij_def: bij f ≡ inj f ∧ surj f&lt;br /&gt;
&lt;br /&gt;
  Propiedades de las funciones inversas:&lt;br /&gt;
  · inv_f_f:      inj f ⟹ inv f (f x) = x&lt;br /&gt;
  · surj_f_inv_f: surj f ⟹ f (inv f y) = y&lt;br /&gt;
  · inv_inv_eq:   bij f ⟹ inv (inv f) = f&lt;br /&gt;
&lt;br /&gt;
  Igualdad de funciones (por extensionalidad):&lt;br /&gt;
  · fun_eq_iff: (f = g) = (∀x. f x = g x)&lt;br /&gt;
&lt;br /&gt;
  Lema. Una función inyectiva puede cancelarse en el lado izquierdo de&lt;br /&gt;
  la composición de funciones.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;inj f&amp;quot;&lt;br /&gt;
  shows &amp;quot;(f ∘ g = f ∘ h) = (g = h)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;f ∘ g = f ∘ h&amp;quot; &lt;br /&gt;
  thus &amp;quot;g = h&amp;quot; using `inj f` by (simp add:fun_eq_iff inj_on_def) &lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;g = h&amp;quot; &lt;br /&gt;
  thus &amp;quot;f ∘ g = f ∘ h&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Una demostración más detallada es la siguiente&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;inj f&amp;quot;&lt;br /&gt;
  shows &amp;quot;(f ∘ g = f ∘ h) = (g = h)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;f ∘ g = f ∘ h&amp;quot;&lt;br /&gt;
  show &amp;quot;g = h&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix x&lt;br /&gt;
    have &amp;quot;(f ∘ g)(x) = (f ∘ h)(x)&amp;quot; using `f ∘ g = f ∘ h` by simp&lt;br /&gt;
    hence &amp;quot;f(g(x)) = f(h(x))&amp;quot; by simp&lt;br /&gt;
    thus &amp;quot;g(x) = h(x)&amp;quot; using `inj f` by (simp add:inj_on_def)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;g = h&amp;quot;&lt;br /&gt;
  show &amp;quot;f ∘ g = f ∘ h&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix x&lt;br /&gt;
    have &amp;quot;(f ∘ g) x = f(g(x))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = f(h(x))&amp;quot; using `g = h` by simp&lt;br /&gt;
    also have &amp;quot;… = (f ∘ h) x&amp;quot; by simp&lt;br /&gt;
    finally show &amp;quot;(f ∘ g) x = (f ∘ h) x&amp;quot; by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection {* Función imagen *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Imagen de un conjunto mediante una función:&lt;br /&gt;
  · image_def: f ` A = {y. (∃x∈A. y = f x)&lt;br /&gt;
&lt;br /&gt;
  Propiedades de la imagen:&lt;br /&gt;
  · image_compose: (f ∘ g)`r = f`g`r&lt;br /&gt;
  · image_Un:      f`(A ∪ B) = f`A ∪ f`B &lt;br /&gt;
  · image_Int:     inj f ⟹ f`(A ∩ B) = f`A ∩ f`B&amp;quot; &lt;br /&gt;
&lt;br /&gt;
  Ejemplos de demostraciones triviales de propiedades de la imagen.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;f`A ∪ g`A = (⋃x∈A. {f x, g x})&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;f`{(x,y). P x y} = {f(x,y) | x y. P x y}&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El rango de una función (&amp;quot;range f&amp;quot;) es la imagen del universo (&amp;quot;f`UNIV&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
  Imagen inversa de un conjunto:&lt;br /&gt;
  · vimage_def: f -` B ≡ {x. f x : B}&lt;br /&gt;
&lt;br /&gt;
  Propiedad de la imagen inversa de un conjunto:&lt;br /&gt;
  · vimage_Compl: f -` (-A) = -(f -` A)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Relaciones *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Relaciones básicas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La teoría de relaciones es HOL/Relation.thy.&lt;br /&gt;
&lt;br /&gt;
  Las relaciones son conjuntos de pares.&lt;br /&gt;
&lt;br /&gt;
  Relación identidad:&lt;br /&gt;
  · Id_def: Id ≡ {p. ∃x. p = (x,x)}&lt;br /&gt;
&lt;br /&gt;
  Composición de relaciones:&lt;br /&gt;
  · rel_comp_def: r O s ≡ {(x,z). EX y. (x, y) ∈ r &amp;amp; (y, z) ∈ s}&lt;br /&gt;
&lt;br /&gt;
  Propiedades:&lt;br /&gt;
  · R_O_Id:        R O Id = R&lt;br /&gt;
  · rel_comp_mono: ⟦r&amp;#039; ⊆ r; s&amp;#039; ⊆ s⟧ ⟹ (r&amp;#039; O s&amp;#039;) ⊆ (r O s)&lt;br /&gt;
&lt;br /&gt;
  Imagen inversa de una relación:&lt;br /&gt;
  · converse_iff: ((a,b) ∈ r\&amp;lt;^bsup&amp;gt;\&amp;lt;^sup&amp;gt;-1\&amp;lt;^esup&amp;gt;) = ((b,a) ∈ r)&lt;br /&gt;
&lt;br /&gt;
  Propiedad de la imagen inversa de una relación:&lt;br /&gt;
  · converse_rel_comp: (r O s)\&amp;lt;^bsup&amp;gt;-1\&amp;lt;^esup&amp;gt; = s\&amp;lt;^bsup&amp;gt;-1\&amp;lt;^esup&amp;gt; O r\&amp;lt;^bsup&amp;gt;-1\&amp;lt;^esup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  Imagen de un conjunto mediante una relación:&lt;br /&gt;
  · Image_iff: (b ∈ r``A) = (∃x:A. (x, b) ∈ r)&lt;br /&gt;
&lt;br /&gt;
  Dominio de una relación:&lt;br /&gt;
  · Domain_iff: (a ∈ Domain r) = (∃y. (a, y) ∈ r)&lt;br /&gt;
&lt;br /&gt;
  Rango de una relación:&lt;br /&gt;
  · Range_iff: (a ∈ Range r) = (∃y. (y,a) ∈ r)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Clausura reflexiva y transitiva *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La teoría de la clausura reflexiva y transitiva de una relación es&lt;br /&gt;
  HOL/Transitive_Closure.thy.&lt;br /&gt;
&lt;br /&gt;
  Potencias de relaciones:&lt;br /&gt;
  · R ^^ 0 = Id&lt;br /&gt;
  · R ^^ (Suc n) = (R ^^ n) O R&lt;br /&gt;
  &lt;br /&gt;
  La clausura reflexiva y transitiva de la relación r es la menor&lt;br /&gt;
  solución de la ecuación: &lt;br /&gt;
  · rtrancl_unfold: r\&amp;lt;^sup&amp;gt;* = Id ∪ (r\&amp;lt;^sup&amp;gt;* O r)&lt;br /&gt;
  &lt;br /&gt;
  Propiedades básicas de la clausura reflexiva y transitiva:&lt;br /&gt;
  · rtrancl_refl:   (a, a) ∈ r\&amp;lt;^sup&amp;gt;*&lt;br /&gt;
  · r_into_rtrancl: p ∈ r ⟹ p ∈ r\&amp;lt;^sup&amp;gt;*&lt;br /&gt;
  · rtrancl_trans:  ⟦(a, b) ∈ r\&amp;lt;^sup&amp;gt;*; (b, c) ∈ r\&amp;lt;^sup&amp;gt;*⟧ ⟹ (a, c) ∈ r\&amp;lt;^sup&amp;gt;*&lt;br /&gt;
  &lt;br /&gt;
  Inducción sobre la clausura reflexiva y transitiva&lt;br /&gt;
  · rtrancl_induct: ⟦(a,b) ∈ r\&amp;lt;^sup&amp;gt;*; &lt;br /&gt;
                     P b; &lt;br /&gt;
                     ⋀y z. ⟦(y, z) ∈ r; (z, b) ∈ r\&amp;lt;^sup&amp;gt;*; P z⟧ ⟹ P y⟧&lt;br /&gt;
                    ⟹ P a&amp;quot;}&lt;br /&gt;
  &lt;br /&gt;
  Idempotencia de la clausura reflexiva y transitiva:&lt;br /&gt;
  · rtrancl_idemp: (r\&amp;lt;^sup&amp;gt;* )\&amp;lt;^sup&amp;gt;* = r\&amp;lt;^sup&amp;gt;*&lt;br /&gt;
  &lt;br /&gt;
  Reglas de introducción de la clausura transitiva:&lt;br /&gt;
  · r_into_trancl&amp;#039;: p ∈ r ⟹ p ∈ r\&amp;lt;^sup&amp;gt;+&lt;br /&gt;
  · trancl_trans:   ⟦(a, b) ∈ r\&amp;lt;^sup&amp;gt;+; (b, c) ∈ r\&amp;lt;^sup&amp;gt;+⟧ ⟹ (a, c) ∈ r\&amp;lt;^sup&amp;gt;+&lt;br /&gt;
&lt;br /&gt;
  Ejemplo de propiedad:&lt;br /&gt;
  · trancl\_converse: (r¯¹)\&amp;lt;^sup&amp;gt;+ = (r\&amp;lt;^sup&amp;gt;+)¯¹&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Una demostración elemental *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El teorema que se desea demostrar es que la clausura reflexiva y&lt;br /&gt;
  transitiva conmuta con la inversa (rtrancl_converse). Para&lt;br /&gt;
  demostrarlo introducimos dos lemas auxiliares: rtrancl_converseD y&lt;br /&gt;
  rtrancl_converseI.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma rtrancl_converseD: &amp;quot;(x,y) ∈ (r¯¹)\&amp;lt;^sup&amp;gt;* ⟹ (y,x) ∈ r\&amp;lt;^sup&amp;gt;*&amp;quot;&lt;br /&gt;
proof (induct rule:rtrancl_induct)&lt;br /&gt;
  show &amp;quot;(x,x) ∈ r\&amp;lt;^sup&amp;gt;*&amp;quot; by (rule rtrancl_refl) &lt;br /&gt;
next&lt;br /&gt;
  fix y z&lt;br /&gt;
  assume &amp;quot;(x,y) ∈ (r¯¹)\&amp;lt;^sup&amp;gt;*&amp;quot; and &amp;quot;(y,z) ∈ r¯¹&amp;quot; and &amp;quot;(y,x) ∈ r\&amp;lt;^sup&amp;gt;*&amp;quot;&lt;br /&gt;
  show &amp;quot;(z,x) ∈ r\&amp;lt;^sup&amp;gt;*&amp;quot;&lt;br /&gt;
  proof (rule rtrancl_trans)&lt;br /&gt;
    show &amp;quot;(z,y) ∈ r\&amp;lt;^sup&amp;gt;*&amp;quot; using `(y,z) ∈ r¯¹` by simp&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;(y,x) ∈ r\&amp;lt;^sup&amp;gt;*&amp;quot; using `(y,x) ∈ r\&amp;lt;^sup&amp;gt;*` by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma rtrancl_converseI: &amp;quot;(y,x) ∈ r\&amp;lt;^sup&amp;gt;* ⟹ (x,y) ∈ (r¯¹)\&amp;lt;^sup&amp;gt;*&amp;quot;&lt;br /&gt;
proof (induct rule:rtrancl_induct)&lt;br /&gt;
  show &amp;quot;(y,y) ∈ (r¯¹)\&amp;lt;^sup&amp;gt;*&amp;quot; by (rule rtrancl_refl) &lt;br /&gt;
next&lt;br /&gt;
  fix u z&lt;br /&gt;
  assume &amp;quot;(y,u) ∈ r\&amp;lt;^sup&amp;gt;*&amp;quot; and &amp;quot;(u,z) ∈ r&amp;quot; and &amp;quot;(u,y) ∈ (r¯¹)\&amp;lt;^sup&amp;gt;*&amp;quot;&lt;br /&gt;
  show &amp;quot;(z,y) ∈ (r¯¹)\&amp;lt;^sup&amp;gt;*&amp;quot;&lt;br /&gt;
  proof (rule rtrancl_trans)&lt;br /&gt;
    show &amp;quot;(z,u) ∈ (r¯¹)\&amp;lt;^sup&amp;gt;*&amp;quot; using `(u,z) ∈ r` by auto&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;(u,y) ∈ (r¯¹)\&amp;lt;^sup&amp;gt;*&amp;quot; using `(u,y) ∈ (r¯¹)\&amp;lt;^sup&amp;gt;*` by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
theorem rtrancl_converse: &amp;quot;(r¯¹)\&amp;lt;^sup&amp;gt;* = (r\&amp;lt;^sup&amp;gt;*)¯¹&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;(r¯¹)\&amp;lt;^sup&amp;gt;* ⊆ (r\&amp;lt;^sup&amp;gt;*)¯¹&amp;quot; by (auto simp add:rtrancl_converseD)&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;(r\&amp;lt;^sup&amp;gt;*)¯¹ ⊆ (r¯¹)\&amp;lt;^sup&amp;gt;*&amp;quot; by (auto simp add:rtrancl_converseI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Puede demostrarse de manera más corta como sigue:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;(r¯¹)\&amp;lt;^sup&amp;gt;* = (r\&amp;lt;^sup&amp;gt;*)¯¹&amp;quot;&lt;br /&gt;
by (auto intro: rtrancl_converseI dest: rtrancl_converseD)&lt;br /&gt;
&lt;br /&gt;
section {* Relaciones bien fundamentadas e inducción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La teoría de las relaciones bien fundamentadas es &lt;br /&gt;
  HOL/Wellfounded_Relations.thy.&lt;br /&gt;
&lt;br /&gt;
  La relación-objeto &amp;quot;less_than&amp;quot; es el orden de los naturales que es&lt;br /&gt;
  bien fundamentada:&lt;br /&gt;
  · less_than_iff: ((x,y) ∈ less_than) = (x &amp;lt; y)&lt;br /&gt;
  · wf_less_than:  wf less_than&lt;br /&gt;
&lt;br /&gt;
  Notas sobre medidas:&lt;br /&gt;
  · Imagen inversa de una relación mediante una función:&lt;br /&gt;
    · inv_image_def: inv_image r f ≡ {(x,y). (f x,f y) ∈ r&lt;br /&gt;
  · Conservación de la buena fundamentación:\\&lt;br /&gt;
    · wf_inv_image: wf r ⟹ wf (inv_image r f)&lt;br /&gt;
  · Definición de la \textbf{medida}:\\&lt;br /&gt;
    · measure_def: measure ≡ inv_image less_than&lt;br /&gt;
  · Buena fundamentación de la medida:\\&lt;br /&gt;
    · wf_measure: wf (measure f)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas sobre el producto lexicográfico:&lt;br /&gt;
  · Definición del producto lexicográfico (lex_prod_def)&amp;quot;:&lt;br /&gt;
    ra &amp;lt;*lex*&amp;gt; rb ≡ {((a,b),(a&amp;#039;,b&amp;#039;)). (a,a&amp;#039;) ∈ ra ∨ &lt;br /&gt;
                                      (a = a&amp;#039; ∧ (b,b&amp;#039;) ∈ rb)}&lt;br /&gt;
  · Conservación de la buena fundamentación:&lt;br /&gt;
    · wf_lex_prod: ⟦wf ra; wf rb⟧ ⟹ wf (ra &amp;lt;*lex*&amp;gt; rb)&lt;br /&gt;
&lt;br /&gt;
  El orden de multiconjuntos está en la teoría HOL/Library/Multiset.thy.&lt;br /&gt;
&lt;br /&gt;
  Inducción sobre relaciones bien fundamentadas:&lt;br /&gt;
  · wf_induct: ⟦wf r; ⋀x. (⋀y. (y,x) ∈ r ⟹ P y) ⟹ P x⟧ ⟹ P a&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_12:_Conjuntos,_funciones_y_relaciones&amp;diff=65</id>
		<title>Tema 12: Conjuntos, funciones y relaciones</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_12:_Conjuntos,_funciones_y_relaciones&amp;diff=65"/>
		<updated>2012-01-31T19:06:28Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; header {* Tema 12: Conjuntos, funciones y relaciones *}  theory Tema_12 imports Main  begin  section {* Conjuntos *}  subsection {* Operaciones con conjunto...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 12: Conjuntos, funciones y relaciones *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_12&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Conjuntos *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Operaciones con conjuntos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. La teoría elemental de conjuntos es HOL/Set.thy.&lt;br /&gt;
&lt;br /&gt;
  Nota. En un conjunto todos los elemento son del mismo tipo (por&lt;br /&gt;
  ejemplo, del tipo \&amp;lt;tau&amp;gt;) y el conjunto tiene tipo (en el ejemplo, &amp;quot;\&amp;lt;tau&amp;gt; set&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
  Reglas de la intersección:&lt;br /&gt;
  · IntI:  \&amp;lt;lbrakk&amp;gt;c \&amp;lt;in&amp;gt; A; c \&amp;lt;in&amp;gt; B\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; c \&amp;lt;in&amp;gt; A \&amp;lt;inter&amp;gt; B&lt;br /&gt;
  · IntD1: c \&amp;lt;in&amp;gt; A \&amp;lt;inter&amp;gt; B \&amp;lt;Longrightarrow&amp;gt; c \&amp;lt;in&amp;gt; A&lt;br /&gt;
  · IntD2: c \&amp;lt;in&amp;gt; A \&amp;lt;inter&amp;gt; B \&amp;lt;Longrightarrow&amp;gt; c \&amp;lt;in&amp;gt; B&lt;br /&gt;
&lt;br /&gt;
  Nota. Propiedades del complementario:&lt;br /&gt;
  · Compl_iff: (c \&amp;lt;in&amp;gt; - A) = (c \&amp;lt;notin&amp;gt; A)&lt;br /&gt;
  · Compl_Un:  - (A \&amp;lt;union&amp;gt; B) = - A \&amp;lt;inter&amp;gt; - B&lt;br /&gt;
&lt;br /&gt;
  Nota. El conjunto vacío se representa por {} y el universal por UNIV. &lt;br /&gt;
&lt;br /&gt;
  Nota. Propiedades de la \textbf{diferencia} y del complementario:&lt;br /&gt;
  · Diff_disjoint:   A \&amp;lt;inter&amp;gt; (B - A) = {}&lt;br /&gt;
  · Compl_partition: A \&amp;lt;union&amp;gt; - A = UNIV&lt;br /&gt;
&lt;br /&gt;
  Nota. Reglas de la relación de \textbf{subconjunto}:&lt;br /&gt;
  · subsetI: (\&amp;lt;And&amp;gt;x. x \&amp;lt;in&amp;gt; A \&amp;lt;Longrightarrow&amp;gt; x \&amp;lt;in&amp;gt; B) \&amp;lt;Longrightarrow&amp;gt; A \&amp;lt;subseteq&amp;gt; B&lt;br /&gt;
  · subsetD: \&amp;lt;lbrakk&amp;gt;A \&amp;lt;subseteq&amp;gt; B; c \&amp;lt;in&amp;gt; A\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; c \&amp;lt;in&amp;gt; B&lt;br /&gt;
&lt;br /&gt;
  Nota. Ejemplo trivial.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A \&amp;lt;union&amp;gt; B \&amp;lt;subseteq&amp;gt; C) = (A \&amp;lt;subseteq&amp;gt; C \&amp;lt;and&amp;gt; B \&amp;lt;subseteq&amp;gt; C)&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Nota. Otro ejemplo trivial.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A \&amp;lt;subseteq&amp;gt; -B) = (B \&amp;lt;subseteq&amp;gt; -A)&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Principio de extensionalidad de conjuntos:&lt;br /&gt;
  · set_ext: (\&amp;lt;And&amp;gt;x. (x \&amp;lt;in&amp;gt; A) = (x \&amp;lt;in&amp;gt; B)) \&amp;lt;Longrightarrow&amp;gt; A = B&lt;br /&gt;
&lt;br /&gt;
  Reglas de la igualdad de conjuntos:&lt;br /&gt;
  · equalityI: \&amp;lt;lbrakk&amp;gt;A \&amp;lt;subseteq&amp;gt; B; B \&amp;lt;subseteq&amp;gt; A\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; A = B&lt;br /&gt;
  · equalityE: \&amp;lt;lbrakk&amp;gt;A = B; \&amp;lt;lbrakk&amp;gt;A \&amp;lt;subseteq&amp;gt; B; B \&amp;lt;subseteq&amp;gt; A\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; P\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; P&lt;br /&gt;
&lt;br /&gt;
  Lema. [Analogía entre intersección y conjunción]&lt;br /&gt;
  &amp;quot;x \&amp;lt;in&amp;gt; A \&amp;lt;inter&amp;gt; B&amp;quot; syss &amp;quot;x \&amp;lt;in&amp;gt; A&amp;quot; y &amp;quot;x \&amp;lt;in&amp;gt; B&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x \&amp;lt;in&amp;gt; A \&amp;lt;inter&amp;gt; B) = (x \&amp;lt;in&amp;gt; A \&amp;lt;and&amp;gt; x \&amp;lt;in&amp;gt; B)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Analogía entre unión y disyunción]&lt;br /&gt;
  &amp;quot;x \&amp;lt;in&amp;gt; A \&amp;lt;union&amp;gt; B&amp;quot; syss &amp;quot;x \&amp;lt;in&amp;gt; A&amp;quot; ó &amp;quot;x \&amp;lt;in&amp;gt; B&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x \&amp;lt;in&amp;gt; A \&amp;lt;union&amp;gt; B) = (x \&amp;lt;in&amp;gt; A \&amp;lt;or&amp;gt; x \&amp;lt;in&amp;gt; B)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Analogía entre subconjunto e implicación]&lt;br /&gt;
  &amp;quot;(A \&amp;lt;subseteq&amp;gt; B)&amp;quot; syss para todo &amp;quot;x&amp;quot;, si &amp;quot;x \&amp;lt;in&amp;gt; A&amp;quot; entonces &amp;quot;x \&amp;lt;in&amp;gt; B&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A \&amp;lt;subseteq&amp;gt; B) = (\&amp;lt;forall&amp;gt; x. x \&amp;lt;in&amp;gt; A \&amp;lt;longrightarrow&amp;gt; x \&amp;lt;in&amp;gt; B)&amp;quot; &lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Analogía entre complementario y negación]&lt;br /&gt;
  x pertenece al complementario de A syss x no pertenece a A.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x \&amp;lt;in&amp;gt; -A) = (x \&amp;lt;notin&amp;gt; A)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
subsection {* Notación de conjuntos finitos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. La teoría de conjuntos finitos es HOL/Finite_Set.thy.&lt;br /&gt;
&lt;br /&gt;
  Nota. Los conjuntos finitos se definen por inducción a partir de las&lt;br /&gt;
  siguientes reglas inductivas:&lt;br /&gt;
  · El conjunto vacío es un conjunto finito.&lt;br /&gt;
    · emptyI: &amp;quot;finite {}&amp;quot;&lt;br /&gt;
  · Si se le añade un elemento a un conjunto finito se obtiene otro&lt;br /&gt;
    conjunto finito. &lt;br /&gt;
    · insertI: &amp;quot;finite A \&amp;lt;Longrightarrow&amp;gt; finite (insert a A)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  A continuación se muestran ejemplos de conjuntos finitos.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;insert 2 {} = {2} \&amp;lt;and&amp;gt;&lt;br /&gt;
  insert 3 {2} = {2,3} \&amp;lt;and&amp;gt;&lt;br /&gt;
  insert 2 {2,3} = {2,3} \&amp;lt;and&amp;gt;&lt;br /&gt;
  {2,3} = {3,2,3,2,2}&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. Los conjuntos finitos se representan con la notación conjuntista&lt;br /&gt;
  habitual: los elementos entre llaves y separados por comas.&lt;br /&gt;
&lt;br /&gt;
  Nota. Lema trivial.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{a,b} \&amp;lt;union&amp;gt; {c,d} = {a,b,c,d}&amp;quot; &lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. Conjetura falsa.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{a,b} \&amp;lt;inter&amp;gt; {b,c} = {b}&amp;quot; &lt;br /&gt;
refute&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. Conjetura corregida.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{a,b} \&amp;lt;inter&amp;gt; {b,c} = (if a=c then {a,b} else {b})&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Sumas y productos de conjuntos finitos:&lt;br /&gt;
  · (setsum f A) es la suma de la aplicación de f a los elementos del&lt;br /&gt;
    conjunto finito A,  &lt;br /&gt;
  · (setprod f A) es producto de la aplicación de f a los elementos del&lt;br /&gt;
    conjunto finito A,  &lt;br /&gt;
  · \&amp;lt;Sum&amp;gt;A es la suma de los elementos del conjunto finito A,&lt;br /&gt;
  · \&amp;lt;Prod&amp;gt;A es el producto de los elementos del conjunto finito A.&lt;br /&gt;
&lt;br /&gt;
  Ejemplos de definiciones recursivas sobre conjuntos finitos: &lt;br /&gt;
  Sea A un conjunto finito de números naturales.&lt;br /&gt;
  · sumaConj A es la suma de los elementos A.&lt;br /&gt;
  · productoConj A es el producto de los elementos de A.&lt;br /&gt;
  · sumaCuadradosconj A es la suma de los cuadrados de los elementos A. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition sumaConj :: &amp;quot;nat set \&amp;lt;Rightarrow&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaConj S \&amp;lt;equiv&amp;gt; \&amp;lt;Sum&amp;gt;S&amp;quot;&lt;br /&gt;
&lt;br /&gt;
definition productoConj :: &amp;quot;nat set \&amp;lt;Rightarrow&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;productoConj S \&amp;lt;equiv&amp;gt; \&amp;lt;Prod&amp;gt;S&amp;quot;&lt;br /&gt;
&lt;br /&gt;
definition sumaCuadradosConj :: &amp;quot;nat set \&amp;lt;Rightarrow&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaCuadradosConj S \&amp;lt;equiv&amp;gt; setsum (\&amp;lt;lambda&amp;gt;x. x*x) S&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. Para simplificar lo que sigue, declaramos las anteriores&lt;br /&gt;
  definiciones como reglas de simplificación.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
declare sumaConj_def[simp]&lt;br /&gt;
declare productoConj_def[simp]&lt;br /&gt;
declare sumaCuadradosConj_def[simp]&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplos de evaluación de las anteriores definiciones recursivas.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;sumaConj {1,2,3,4} = 10 \&amp;lt;and&amp;gt;&lt;br /&gt;
  productoConj {1,2,3} = productoConj {3,2} \&amp;lt;and&amp;gt; &lt;br /&gt;
  sumaCuadradosConj {1,2,3,4} = 30&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Inducción sobre conjuntos finitos: Para demostrar que todos los&lt;br /&gt;
  conjuntos finitos tienen una propiedad P basta probar que&lt;br /&gt;
  · El conjunto vacío tiene la propiedad P.&lt;br /&gt;
  · Si a un conjunto finito que tiene la propiedad P se le añade un nuevo&lt;br /&gt;
    elemento, el conjunto obtenido sigue teniendo la propiedad P.&lt;br /&gt;
  En forma de regla&lt;br /&gt;
  · finite_induct: \&amp;lt;lbrakk&amp;gt;finite F; &lt;br /&gt;
                    P {}; &lt;br /&gt;
                    \&amp;lt;And&amp;gt;x F. \&amp;lt;lbrakk&amp;gt;finite F; x \&amp;lt;notin&amp;gt; F; P F\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; P ({x} \&amp;lt;union&amp;gt; F)\&amp;lt;rbrakk&amp;gt; &lt;br /&gt;
                   \&amp;lt;Longrightarrow&amp;gt; P F&lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de inducción sobre conjuntos finitos]&lt;br /&gt;
  Sea S un conjunto finito de números naturales. Entonces todos los&lt;br /&gt;
  elementos de S son menores o iguales que la suma de los elementos de S.&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;finite S \&amp;lt;Longrightarrow&amp;gt; \&amp;lt;forall&amp;gt;x\&amp;lt;in&amp;gt;S. x \&amp;lt;le&amp;gt; sumaConj S&amp;quot;&lt;br /&gt;
by (induct rule: finite_induct) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostración estructurada:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma sumaConj_acota: &amp;quot;finite S \&amp;lt;Longrightarrow&amp;gt; \&amp;lt;forall&amp;gt;x\&amp;lt;in&amp;gt;S. x \&amp;lt;le&amp;gt; sumaConj S&amp;quot;&lt;br /&gt;
proof (induct rule: finite_induct)&lt;br /&gt;
  show &amp;quot;\&amp;lt;forall&amp;gt;x\&amp;lt;in&amp;gt;{}. x \&amp;lt;le&amp;gt; sumaConj {}&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x and F&lt;br /&gt;
  assume fF: &amp;quot;finite F&amp;quot; &lt;br /&gt;
     and xF: &amp;quot;x \&amp;lt;notin&amp;gt; F&amp;quot; &lt;br /&gt;
     and HI: &amp;quot;\&amp;lt;forall&amp;gt; x\&amp;lt;in&amp;gt;F. x \&amp;lt;le&amp;gt; sumaConj F&amp;quot;&lt;br /&gt;
  show &amp;quot;\&amp;lt;forall&amp;gt;y\&amp;lt;in&amp;gt;insert x F. y \&amp;lt;le&amp;gt; sumaConj (insert x F)&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    fix y &lt;br /&gt;
    assume &amp;quot;y \&amp;lt;in&amp;gt; insert x F&amp;quot;&lt;br /&gt;
    show &amp;quot;y \&amp;lt;le&amp;gt; sumaConj (insert x F)&amp;quot;&lt;br /&gt;
    proof (cases &amp;quot;y = x&amp;quot;)&lt;br /&gt;
      assume &amp;quot;y = x&amp;quot;&lt;br /&gt;
      hence &amp;quot;y \&amp;lt;le&amp;gt; x + (sumaConj F)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;\&amp;lt;dots&amp;gt; = sumaConj (insert x F)&amp;quot; using fF xF by simp&lt;br /&gt;
      finally show ?thesis .&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;y \&amp;lt;noteq&amp;gt; x&amp;quot;&lt;br /&gt;
      hence &amp;quot;y \&amp;lt;in&amp;gt; F&amp;quot; using `y \&amp;lt;in&amp;gt; insert x F` by simp&lt;br /&gt;
      hence &amp;quot;y \&amp;lt;le&amp;gt; sumaConj F&amp;quot; using HI by blast&lt;br /&gt;
      also have &amp;quot;\&amp;lt;dots&amp;gt; \&amp;lt;le&amp;gt; x + (sumaConj F)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;\&amp;lt;dots&amp;gt; = sumaConj (insert x F)&amp;quot; using fF xF by simp&lt;br /&gt;
      finally show ?thesis .&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsection {* Definiciones por comprensión *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El conjunto de los elementos que cumple la propiedad P se representa&lt;br /&gt;
  por {x. P}. &lt;br /&gt;
&lt;br /&gt;
  Reglas de comprensión (relación entre colección y pertenencia):&lt;br /&gt;
  · mem_Collect_eq: (a \&amp;lt;in&amp;gt; {x. P x}) = P a&lt;br /&gt;
  · Collect_mem_eq: {x. x \&amp;lt;in&amp;gt; A} = A&lt;br /&gt;
  &lt;br /&gt;
  Dos lemas triviales.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{x. P x \&amp;lt;or&amp;gt; x \&amp;lt;in&amp;gt; A} = {x. P x} \&amp;lt;union&amp;gt; A&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{x. P x \&amp;lt;longrightarrow&amp;gt; Q x} = -{x. P x} \&amp;lt;union&amp;gt; {x. Q x}&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. Ejemplo con la sintaxis general de comprensión.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;{p*q | p q. p \&amp;lt;in&amp;gt; prime \&amp;lt;and&amp;gt; q \&amp;lt;in&amp;gt; prime} = &lt;br /&gt;
   {z. \&amp;lt;exists&amp;gt;p q. z = p*q \&amp;lt;and&amp;gt; p \&amp;lt;in&amp;gt; prime \&amp;lt;and&amp;gt; q \&amp;lt;in&amp;gt; prime}&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
   En HOL, la notación conjuntista es azúcar sintáctica:&lt;br /&gt;
   · x \&amp;lt;in&amp;gt; A  es equivalente a A(x).&lt;br /&gt;
   · {x. P} es equivalente a \&amp;lt;lambda&amp;gt;x. P.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. [Ejemplo de definición por comprensión]&lt;br /&gt;
  El conjunto de los pares es el de los números n para los que existe un&lt;br /&gt;
  m tal que n = 2*m.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition Pares :: &amp;quot;nat set&amp;quot; where&lt;br /&gt;
  &amp;quot;Pares \&amp;lt;equiv&amp;gt; {n. \&amp;lt;exists&amp;gt; m. n = 2*m }&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo. Los números 2 y 34 son pares.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;2 \&amp;lt;in&amp;gt; Pares \&amp;lt;and&amp;gt;&lt;br /&gt;
  34 \&amp;lt;in&amp;gt; Pares&amp;quot; &lt;br /&gt;
by (simp add: Pares_def)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. El conjunto de los impares es el de los números n para los&lt;br /&gt;
  que existe un m tal que n = 2*m + 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition Impares :: &amp;quot;nat set&amp;quot; where&lt;br /&gt;
  &amp;quot;Impares \&amp;lt;equiv&amp;gt; {n. \&amp;lt;exists&amp;gt; m. n = 2*m + 1 }&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Ejemplo con las reglas de intersección y comprensión]&lt;br /&gt;
  El conjunto de los pares es disjunto con el de los impares.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;x \&amp;lt;notin&amp;gt; (Pares \&amp;lt;inter&amp;gt; Impares)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  fix x assume S: &amp;quot;x \&amp;lt;in&amp;gt; (Pares \&amp;lt;inter&amp;gt; Impares)&amp;quot;&lt;br /&gt;
  hence &amp;quot;x \&amp;lt;in&amp;gt; Pares&amp;quot; by (rule IntD1)&lt;br /&gt;
  hence &amp;quot;\&amp;lt;exists&amp;gt; m. x = 2 * m&amp;quot; by (simp only: Pares_def mem_Collect_eq)&lt;br /&gt;
  then obtain p where p: &amp;quot;x = 2 * p&amp;quot; .. &lt;br /&gt;
&lt;br /&gt;
  from S have &amp;quot;x \&amp;lt;in&amp;gt; Impares&amp;quot; by (rule IntD2)&lt;br /&gt;
  hence &amp;quot;\&amp;lt;exists&amp;gt; m. x = 2 * m + 1&amp;quot; by (simp only: Impares_def mem_Collect_eq)&lt;br /&gt;
  then obtain q where q: &amp;quot;x = 2 * q + 1&amp;quot; .. &lt;br /&gt;
&lt;br /&gt;
  from p and q show &amp;quot;False&amp;quot; by arith&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsection {* Cuantificadores acotados *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Reglas de cuantificador universal acotado (&amp;quot;bounded&amp;quot;):&lt;br /&gt;
  · ballI: (\&amp;lt;And&amp;gt;x. x \&amp;lt;in&amp;gt; A \&amp;lt;Longrightarrow&amp;gt; P x) \&amp;lt;Longrightarrow&amp;gt; \&amp;lt;forall&amp;gt;x\&amp;lt;in&amp;gt;A. P x&lt;br /&gt;
  · bspec: \&amp;lt;lbrakk&amp;gt;\&amp;lt;forall&amp;gt;x\&amp;lt;in&amp;gt;A. P x; x \&amp;lt;in&amp;gt; A\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; P x&lt;br /&gt;
&lt;br /&gt;
  Reglas de cuantificador existencial acotado (&amp;quot;bounded&amp;quot;):&lt;br /&gt;
  · bexI: \&amp;lt;lbrakk&amp;gt;P x; x \&amp;lt;in&amp;gt; A\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; \&amp;lt;exists&amp;gt;x\&amp;lt;in&amp;gt;A. P x&lt;br /&gt;
  · bexE: \&amp;lt;lbrakk&amp;gt;\&amp;lt;exists&amp;gt;x\&amp;lt;in&amp;gt;A. P x; \&amp;lt;And&amp;gt;x. \&amp;lt;lbrakk&amp;gt;x \&amp;lt;in&amp;gt; A; P x\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; Q\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; Q&lt;br /&gt;
&lt;br /&gt;
  Reglas de la unión indexada:&lt;br /&gt;
  · UN_iff: (b \&amp;lt;in&amp;gt; (\&amp;lt;Union&amp;gt;x\&amp;lt;in&amp;gt;A. B x)) = (\&amp;lt;exists&amp;gt;x\&amp;lt;in&amp;gt;A. b \&amp;lt;in&amp;gt; B x)&lt;br /&gt;
  · UN_I:   \&amp;lt;lbrakk&amp;gt;a \&amp;lt;in&amp;gt; A; b \&amp;lt;in&amp;gt; B a\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; b \&amp;lt;in&amp;gt; (\&amp;lt;Union&amp;gt;x\&amp;lt;in&amp;gt;A. B x)&lt;br /&gt;
  · UN_E:   \&amp;lt;lbrakk&amp;gt;b \&amp;lt;in&amp;gt; (\&amp;lt;Union&amp;gt;x\&amp;lt;in&amp;gt;A. B x); \&amp;lt;And&amp;gt;x. \&amp;lt;lbrakk&amp;gt;x \&amp;lt;in&amp;gt; A; b \&amp;lt;in&amp;gt; B x\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; R\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
  Reglas de la unión de una familia:&lt;br /&gt;
  · Union_def: \&amp;lt;Union&amp;gt;S = (\&amp;lt;Union&amp;gt;x\&amp;lt;in&amp;gt;S. x)&lt;br /&gt;
  · Union_iff: (A \&amp;lt;in&amp;gt; \&amp;lt;Union&amp;gt;C) = (\&amp;lt;exists&amp;gt;X\&amp;lt;in&amp;gt;C. A \&amp;lt;in&amp;gt; X)&lt;br /&gt;
&lt;br /&gt;
  Reglas de la intersección indexada:&lt;br /&gt;
  · INT_iff: (b \&amp;lt;in&amp;gt; (\&amp;lt;Inter&amp;gt;x\&amp;lt;in&amp;gt;A. B x)) = (\&amp;lt;forall&amp;gt;x\&amp;lt;in&amp;gt;A. b \&amp;lt;in&amp;gt; B x)&lt;br /&gt;
  · INT_I:   (\&amp;lt;And&amp;gt;x. x \&amp;lt;in&amp;gt; A \&amp;lt;Longrightarrow&amp;gt; b \&amp;lt;in&amp;gt; B x) \&amp;lt;Longrightarrow&amp;gt; b \&amp;lt;in&amp;gt; (\&amp;lt;Inter&amp;gt;x\&amp;lt;in&amp;gt;A. B x)&lt;br /&gt;
  · INT_E:   \&amp;lt;lbrakk&amp;gt;b \&amp;lt;in&amp;gt; (\&amp;lt;Inter&amp;gt;x\&amp;lt;in&amp;gt;A. B x); b \&amp;lt;in&amp;gt; B a \&amp;lt;Longrightarrow&amp;gt; R; a \&amp;lt;notin&amp;gt; A \&amp;lt;Longrightarrow&amp;gt; R\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; R&lt;br /&gt;
&lt;br /&gt;
  Reglas de la intersección de una familia:&lt;br /&gt;
  · Inter_def: \&amp;lt;Inter&amp;gt;S = (\&amp;lt;Inter&amp;gt;x\&amp;lt;in&amp;gt;S. x)&lt;br /&gt;
  · Inter_iff: (A \&amp;lt;in&amp;gt; \&amp;lt;Inter&amp;gt;C) = (\&amp;lt;forall&amp;gt;X\&amp;lt;in&amp;gt;C. A \&amp;lt;in&amp;gt; X)&lt;br /&gt;
&lt;br /&gt;
  Abreviaturas:&lt;br /&gt;
  · &amp;quot;Collect P&amp;quot; es lo mismo que &amp;quot;{x. P}&amp;quot;.&lt;br /&gt;
  · &amp;quot;All P&amp;quot;     es lo mismo que &amp;quot;\&amp;lt;forall&amp;gt;x. P x&amp;quot;.&lt;br /&gt;
  · &amp;quot;Ex P&amp;quot;      es lo mismo que &amp;quot;\&amp;lt;exists&amp;gt;x. P x&amp;quot;.&lt;br /&gt;
  · &amp;quot;Ball P&amp;quot;    es lo mismo que &amp;quot;\&amp;lt;forall&amp;gt;x\&amp;lt;in&amp;gt;A. P x&amp;quot;.&lt;br /&gt;
  · &amp;quot;Bex P&amp;quot;     es lo mismo que &amp;quot;\&amp;lt;exists&amp;gt;x\&amp;lt;in&amp;gt;A. P x&amp;quot;.&lt;br /&gt;
  *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Conjuntos finitos y cardinalidad *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El número de elementos de un conjunto finito A es el cardinal de A y se&lt;br /&gt;
  representa por &amp;quot;card A&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Ejemplos de cardinales de conjuntos finitos.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;card {} = 0 \&amp;lt;and&amp;gt;&lt;br /&gt;
   card {4} = 1 \&amp;lt;and&amp;gt;&lt;br /&gt;
   card {4,1} = 2 \&amp;lt;and&amp;gt;&lt;br /&gt;
   x \&amp;lt;noteq&amp;gt; y \&amp;lt;Longrightarrow&amp;gt; card {x,y} = 2&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Propiedades de cardinales:&lt;br /&gt;
  · Cardinal de la unión de conjuntos finitos:&lt;br /&gt;
    card_Un_Int: \&amp;lt;lbrakk&amp;gt;finite A; finite B\&amp;lt;rbrakk&amp;gt; &lt;br /&gt;
                 \&amp;lt;Longrightarrow&amp;gt; card A + card B = card (A \&amp;lt;union&amp;gt; B) + card (A \&amp;lt;inter&amp;gt; B)&amp;quot; &lt;br /&gt;
  · Cardinal del conjunto potencia: &lt;br /&gt;
    card_Pow: finite A \&amp;lt;Longrightarrow&amp;gt; card (Pow A) = 2 ^ card A&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Funciones *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  La teoría de funciones es HOL/Fun.thy. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Nociones básicas de funciones *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Principio de extensionalidad para funciones:&lt;br /&gt;
  · ext: (\&amp;lt;And&amp;gt;x. f x = g x) \&amp;lt;Longrightarrow&amp;gt; f = g&lt;br /&gt;
&lt;br /&gt;
  Actualización de funciones  &lt;br /&gt;
  · fun_upd_apply: (f(x := y)) z = (if z = x then y else f z)&lt;br /&gt;
  · fun_upd_upd:   f(x := y, x := z) = f(x := z)&lt;br /&gt;
&lt;br /&gt;
  Función identidad&lt;br /&gt;
  · id_def: id \&amp;lt;equiv&amp;gt; \&amp;lt;lambda&amp;gt;x. x&lt;br /&gt;
&lt;br /&gt;
  Composición de funciones:&lt;br /&gt;
  · o_def: f \&amp;lt;circ&amp;gt; g = (\&amp;lt;lambda&amp;gt;x. f (g x))&lt;br /&gt;
&lt;br /&gt;
  Asociatividad de la composición:&lt;br /&gt;
  · o_assoc: f \&amp;lt;circ&amp;gt; (g \&amp;lt;circ&amp;gt; h) = (f \&amp;lt;circ&amp;gt; g) \&amp;lt;circ&amp;gt; h&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Funciones inyectivas, suprayectivas y biyectivas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Función inyectiva sobre A:&lt;br /&gt;
  · inj_on_def: inj_on f A \&amp;lt;equiv&amp;gt; \&amp;lt;forall&amp;gt;x\&amp;lt;in&amp;gt;A. \&amp;lt;forall&amp;gt;y\&amp;lt;in&amp;gt;A. f x = f y \&amp;lt;longrightarrow&amp;gt; x = y&lt;br /&gt;
&lt;br /&gt;
  Nota. &amp;quot;inj f&amp;quot; es una abreviatura de &amp;quot;inj_on f UNIV&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Función suprayectiva:&lt;br /&gt;
  · surj_def: surj f \&amp;lt;equiv&amp;gt; \&amp;lt;forall&amp;gt;y. \&amp;lt;exists&amp;gt;x. y = f x&lt;br /&gt;
&lt;br /&gt;
  Función biyectiva:&lt;br /&gt;
  · bij_def: bij f \&amp;lt;equiv&amp;gt; inj f \&amp;lt;and&amp;gt; surj f&lt;br /&gt;
&lt;br /&gt;
  Propiedades de las funciones inversas:&lt;br /&gt;
  · inv_f_f:      inj f \&amp;lt;Longrightarrow&amp;gt; inv f (f x) = x&lt;br /&gt;
  · surj_f_inv_f: surj f \&amp;lt;Longrightarrow&amp;gt; f (inv f y) = y&lt;br /&gt;
  · inv_inv_eq:   bij f \&amp;lt;Longrightarrow&amp;gt; inv (inv f) = f&lt;br /&gt;
&lt;br /&gt;
  Igualdad de funciones (por extensionalidad):&lt;br /&gt;
  · fun_eq_iff: (f = g) = (\&amp;lt;forall&amp;gt;x. f x = g x)&lt;br /&gt;
&lt;br /&gt;
  Lema. Una función inyectiva puede cancelarse en el lado izquierdo de&lt;br /&gt;
  la composición de funciones.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;inj f&amp;quot;&lt;br /&gt;
  shows &amp;quot;(f \&amp;lt;circ&amp;gt; g = f \&amp;lt;circ&amp;gt; h) = (g = h)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;f \&amp;lt;circ&amp;gt; g = f \&amp;lt;circ&amp;gt; h&amp;quot; &lt;br /&gt;
  thus &amp;quot;g = h&amp;quot; using `inj f` by (simp add:fun_eq_iff inj_on_def) &lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;g = h&amp;quot; &lt;br /&gt;
  thus &amp;quot;f \&amp;lt;circ&amp;gt; g = f \&amp;lt;circ&amp;gt; h&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Una demostración más detallada es la siguiente&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;inj f&amp;quot;&lt;br /&gt;
  shows &amp;quot;(f \&amp;lt;circ&amp;gt; g = f \&amp;lt;circ&amp;gt; h) = (g = h)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;f \&amp;lt;circ&amp;gt; g = f \&amp;lt;circ&amp;gt; h&amp;quot;&lt;br /&gt;
  show &amp;quot;g = h&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix x&lt;br /&gt;
    have &amp;quot;(f \&amp;lt;circ&amp;gt; g)(x) = (f \&amp;lt;circ&amp;gt; h)(x)&amp;quot; using `f \&amp;lt;circ&amp;gt; g = f \&amp;lt;circ&amp;gt; h` by simp&lt;br /&gt;
    hence &amp;quot;f(g(x)) = f(h(x))&amp;quot; by simp&lt;br /&gt;
    thus &amp;quot;g(x) = h(x)&amp;quot; using `inj f` by (simp add:inj_on_def)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;g = h&amp;quot;&lt;br /&gt;
  show &amp;quot;f \&amp;lt;circ&amp;gt; g = f \&amp;lt;circ&amp;gt; h&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix x&lt;br /&gt;
    have &amp;quot;(f \&amp;lt;circ&amp;gt; g) x = f(g(x))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;\&amp;lt;dots&amp;gt; = f(h(x))&amp;quot; using `g = h` by simp&lt;br /&gt;
    also have &amp;quot;\&amp;lt;dots&amp;gt; = (f \&amp;lt;circ&amp;gt; h) x&amp;quot; by simp&lt;br /&gt;
    finally show &amp;quot;(f \&amp;lt;circ&amp;gt; g) x = (f \&amp;lt;circ&amp;gt; h) x&amp;quot; by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection {* Función imagen *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Imagen de un conjunto mediante una función:&lt;br /&gt;
  · image_def: f ` A = {y. (\&amp;lt;exists&amp;gt;x\&amp;lt;in&amp;gt;A. y = f x)&lt;br /&gt;
&lt;br /&gt;
  Propiedades de la imagen:&lt;br /&gt;
  · image_compose: (f \&amp;lt;circ&amp;gt; g)`r = f`g`r&lt;br /&gt;
  · image_Un:      f`(A \&amp;lt;union&amp;gt; B) = f`A \&amp;lt;union&amp;gt; f`B &lt;br /&gt;
  · image_Int:     inj f \&amp;lt;Longrightarrow&amp;gt; f`(A \&amp;lt;inter&amp;gt; B) = f`A \&amp;lt;inter&amp;gt; f`B&amp;quot; &lt;br /&gt;
&lt;br /&gt;
  Ejemplos de demostraciones triviales de propiedades de la imagen.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;f`A \&amp;lt;union&amp;gt; g`A = (\&amp;lt;Union&amp;gt;x\&amp;lt;in&amp;gt;A. {f x, g x})&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;f`{(x,y). P x y} = {f(x,y) | x y. P x y}&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El rango de una función (&amp;quot;range f&amp;quot;) es la imagen del universo (&amp;quot;f`UNIV&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
  Imagen inversa de un conjunto:&lt;br /&gt;
  · vimage_def: f -` B \&amp;lt;equiv&amp;gt; {x. f x : B}&lt;br /&gt;
&lt;br /&gt;
  Propiedad de la imagen inversa de un conjunto:&lt;br /&gt;
  · vimage_Compl: f -` (-A) = -(f -` A)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Relaciones *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Relaciones básicas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La teoría de relaciones es HOL/Relation.thy.&lt;br /&gt;
&lt;br /&gt;
  Las relaciones son conjuntos de pares.&lt;br /&gt;
&lt;br /&gt;
  Relación identidad:&lt;br /&gt;
  · Id_def: Id \&amp;lt;equiv&amp;gt; {p. \&amp;lt;exists&amp;gt;x. p = (x,x)}&lt;br /&gt;
&lt;br /&gt;
  Composición de relaciones:&lt;br /&gt;
  · rel_comp_def: r O s \&amp;lt;equiv&amp;gt; {(x,z). EX y. (x, y) \&amp;lt;in&amp;gt; r &amp;amp; (y, z) \&amp;lt;in&amp;gt; s}&lt;br /&gt;
&lt;br /&gt;
  Propiedades:&lt;br /&gt;
  · R_O_Id:        R O Id = R&lt;br /&gt;
  · rel_comp_mono: \&amp;lt;lbrakk&amp;gt;r&amp;#039; \&amp;lt;subseteq&amp;gt; r; s&amp;#039; \&amp;lt;subseteq&amp;gt; s\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; (r&amp;#039; O s&amp;#039;) \&amp;lt;subseteq&amp;gt; (r O s)&lt;br /&gt;
&lt;br /&gt;
  Imagen inversa de una relación:&lt;br /&gt;
  · converse_iff: ((a,b) \&amp;lt;in&amp;gt; r\&amp;lt;^bsup&amp;gt;\&amp;lt;^sup&amp;gt;-1\&amp;lt;^esup&amp;gt;) = ((b,a) \&amp;lt;in&amp;gt; r)&lt;br /&gt;
&lt;br /&gt;
  Propiedad de la imagen inversa de una relación:&lt;br /&gt;
  · converse_rel_comp: (r O s)\&amp;lt;^bsup&amp;gt;-1\&amp;lt;^esup&amp;gt; = s\&amp;lt;^bsup&amp;gt;-1\&amp;lt;^esup&amp;gt; O r\&amp;lt;^bsup&amp;gt;-1\&amp;lt;^esup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  Imagen de un conjunto mediante una relación:&lt;br /&gt;
  · Image_iff: (b \&amp;lt;in&amp;gt; r``A) = (\&amp;lt;exists&amp;gt;x:A. (x, b) \&amp;lt;in&amp;gt; r)&lt;br /&gt;
&lt;br /&gt;
  Dominio de una relación:&lt;br /&gt;
  · Domain_iff: (a \&amp;lt;in&amp;gt; Domain r) = (\&amp;lt;exists&amp;gt;y. (a, y) \&amp;lt;in&amp;gt; r)&lt;br /&gt;
&lt;br /&gt;
  Rango de una relación:&lt;br /&gt;
  · Range_iff: (a \&amp;lt;in&amp;gt; Range r) = (\&amp;lt;exists&amp;gt;y. (y,a) \&amp;lt;in&amp;gt; r)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Clausura reflexiva y transitiva *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La teoría de la clausura reflexiva y transitiva de una relación es&lt;br /&gt;
  HOL/Transitive_Closure.thy.&lt;br /&gt;
&lt;br /&gt;
  Potencias de relaciones:&lt;br /&gt;
  · R ^^ 0 = Id&lt;br /&gt;
  · R ^^ (Suc n) = (R ^^ n) O R&lt;br /&gt;
  &lt;br /&gt;
  La clausura reflexiva y transitiva de la relación r es la menor&lt;br /&gt;
  solución de la ecuación: &lt;br /&gt;
  · rtrancl_unfold: r\&amp;lt;^sup&amp;gt;* = Id \&amp;lt;union&amp;gt; (r\&amp;lt;^sup&amp;gt;* O r)&lt;br /&gt;
  &lt;br /&gt;
  Propiedades básicas de la clausura reflexiva y transitiva:&lt;br /&gt;
  · rtrancl_refl:   (a, a) \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;*&lt;br /&gt;
  · r_into_rtrancl: p \&amp;lt;in&amp;gt; r \&amp;lt;Longrightarrow&amp;gt; p \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;*&lt;br /&gt;
  · rtrancl_trans:  \&amp;lt;lbrakk&amp;gt;(a, b) \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;*; (b, c) \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;*\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; (a, c) \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;*&lt;br /&gt;
  &lt;br /&gt;
  Inducción sobre la clausura reflexiva y transitiva&lt;br /&gt;
  · rtrancl_induct: \&amp;lt;lbrakk&amp;gt;(a,b) \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;*; &lt;br /&gt;
                     P b; &lt;br /&gt;
                     \&amp;lt;And&amp;gt;y z. \&amp;lt;lbrakk&amp;gt;(y, z) \&amp;lt;in&amp;gt; r; (z, b) \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;*; P z\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; P y\&amp;lt;rbrakk&amp;gt;&lt;br /&gt;
                    \&amp;lt;Longrightarrow&amp;gt; P a&amp;quot;}&lt;br /&gt;
  &lt;br /&gt;
  Idempotencia de la clausura reflexiva y transitiva:&lt;br /&gt;
  · rtrancl_idemp: (r\&amp;lt;^sup&amp;gt;* )\&amp;lt;^sup&amp;gt;* = r\&amp;lt;^sup&amp;gt;*&lt;br /&gt;
  &lt;br /&gt;
  Reglas de introducción de la clausura transitiva:&lt;br /&gt;
  · r_into_trancl&amp;#039;: p \&amp;lt;in&amp;gt; r \&amp;lt;Longrightarrow&amp;gt; p \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;+&lt;br /&gt;
  · trancl_trans:   \&amp;lt;lbrakk&amp;gt;(a, b) \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;+; (b, c) \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;+\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; (a, c) \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;+&lt;br /&gt;
&lt;br /&gt;
  Ejemplo de propiedad:&lt;br /&gt;
  · trancl\_converse: (r\&amp;lt;inverse&amp;gt;)\&amp;lt;^sup&amp;gt;+ = (r\&amp;lt;^sup&amp;gt;+)\&amp;lt;inverse&amp;gt;&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Una demostración elemental *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El teorema que se desea demostrar es que la clausura reflexiva y&lt;br /&gt;
  transitiva conmuta con la inversa (rtrancl_converse). Para&lt;br /&gt;
  demostrarlo introducimos dos lemas auxiliares: rtrancl_converseD y&lt;br /&gt;
  rtrancl_converseI.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma rtrancl_converseD: &amp;quot;(x,y) \&amp;lt;in&amp;gt; (r\&amp;lt;inverse&amp;gt;)\&amp;lt;^sup&amp;gt;* \&amp;lt;Longrightarrow&amp;gt; (y,x) \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;*&amp;quot;&lt;br /&gt;
proof (induct rule:rtrancl_induct)&lt;br /&gt;
  show &amp;quot;(x,x) \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;*&amp;quot; by (rule rtrancl_refl) &lt;br /&gt;
next&lt;br /&gt;
  fix y z&lt;br /&gt;
  assume &amp;quot;(x,y) \&amp;lt;in&amp;gt; (r\&amp;lt;inverse&amp;gt;)\&amp;lt;^sup&amp;gt;*&amp;quot; and &amp;quot;(y,z) \&amp;lt;in&amp;gt; r\&amp;lt;inverse&amp;gt;&amp;quot; and &amp;quot;(y,x) \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;*&amp;quot;&lt;br /&gt;
  show &amp;quot;(z,x) \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;*&amp;quot;&lt;br /&gt;
  proof (rule rtrancl_trans)&lt;br /&gt;
    show &amp;quot;(z,y) \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;*&amp;quot; using `(y,z) \&amp;lt;in&amp;gt; r\&amp;lt;inverse&amp;gt;` by simp&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;(y,x) \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;*&amp;quot; using `(y,x) \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;*` by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma rtrancl_converseI: &amp;quot;(y,x) \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;* \&amp;lt;Longrightarrow&amp;gt; (x,y) \&amp;lt;in&amp;gt; (r\&amp;lt;inverse&amp;gt;)\&amp;lt;^sup&amp;gt;*&amp;quot;&lt;br /&gt;
proof (induct rule:rtrancl_induct)&lt;br /&gt;
  show &amp;quot;(y,y) \&amp;lt;in&amp;gt; (r\&amp;lt;inverse&amp;gt;)\&amp;lt;^sup&amp;gt;*&amp;quot; by (rule rtrancl_refl) &lt;br /&gt;
next&lt;br /&gt;
  fix u z&lt;br /&gt;
  assume &amp;quot;(y,u) \&amp;lt;in&amp;gt; r\&amp;lt;^sup&amp;gt;*&amp;quot; and &amp;quot;(u,z) \&amp;lt;in&amp;gt; r&amp;quot; and &amp;quot;(u,y) \&amp;lt;in&amp;gt; (r\&amp;lt;inverse&amp;gt;)\&amp;lt;^sup&amp;gt;*&amp;quot;&lt;br /&gt;
  show &amp;quot;(z,y) \&amp;lt;in&amp;gt; (r\&amp;lt;inverse&amp;gt;)\&amp;lt;^sup&amp;gt;*&amp;quot;&lt;br /&gt;
  proof (rule rtrancl_trans)&lt;br /&gt;
    show &amp;quot;(z,u) \&amp;lt;in&amp;gt; (r\&amp;lt;inverse&amp;gt;)\&amp;lt;^sup&amp;gt;*&amp;quot; using `(u,z) \&amp;lt;in&amp;gt; r` by auto&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;(u,y) \&amp;lt;in&amp;gt; (r\&amp;lt;inverse&amp;gt;)\&amp;lt;^sup&amp;gt;*&amp;quot; using `(u,y) \&amp;lt;in&amp;gt; (r\&amp;lt;inverse&amp;gt;)\&amp;lt;^sup&amp;gt;*` by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
theorem rtrancl_converse: &amp;quot;(r\&amp;lt;inverse&amp;gt;)\&amp;lt;^sup&amp;gt;* = (r\&amp;lt;^sup&amp;gt;*)\&amp;lt;inverse&amp;gt;&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;(r\&amp;lt;inverse&amp;gt;)\&amp;lt;^sup&amp;gt;* \&amp;lt;subseteq&amp;gt; (r\&amp;lt;^sup&amp;gt;*)\&amp;lt;inverse&amp;gt;&amp;quot; by (auto simp add:rtrancl_converseD)&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;(r\&amp;lt;^sup&amp;gt;*)\&amp;lt;inverse&amp;gt; \&amp;lt;subseteq&amp;gt; (r\&amp;lt;inverse&amp;gt;)\&amp;lt;^sup&amp;gt;*&amp;quot; by (auto simp add:rtrancl_converseI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Puede demostrarse de manera más corta como sigue:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;(r\&amp;lt;inverse&amp;gt;)\&amp;lt;^sup&amp;gt;* = (r\&amp;lt;^sup&amp;gt;*)\&amp;lt;inverse&amp;gt;&amp;quot;&lt;br /&gt;
by (auto intro: rtrancl_converseI dest: rtrancl_converseD)&lt;br /&gt;
&lt;br /&gt;
section {* Relaciones bien fundamentadas e inducción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La teoría de las relaciones bien fundamentadas es &lt;br /&gt;
  HOL/Wellfounded_Relations.thy.&lt;br /&gt;
&lt;br /&gt;
  La relación-objeto &amp;quot;less_than&amp;quot; es el orden de los naturales que es&lt;br /&gt;
  bien fundamentada:&lt;br /&gt;
  · less_than_iff: ((x,y) \&amp;lt;in&amp;gt; less_than) = (x &amp;lt; y)&lt;br /&gt;
  · wf_less_than:  wf less_than&lt;br /&gt;
&lt;br /&gt;
  Notas sobre medidas:&lt;br /&gt;
  · Imagen inversa de una relación mediante una función:&lt;br /&gt;
    · inv_image_def: inv_image r f \&amp;lt;equiv&amp;gt; {(x,y). (f x,f y) \&amp;lt;in&amp;gt; r&lt;br /&gt;
  · Conservación de la buena fundamentación:\\&lt;br /&gt;
    · wf_inv_image: wf r \&amp;lt;Longrightarrow&amp;gt; wf (inv_image r f)&lt;br /&gt;
  · Definición de la \textbf{medida}:\\&lt;br /&gt;
    · measure_def: measure \&amp;lt;equiv&amp;gt; inv_image less_than&lt;br /&gt;
  · Buena fundamentación de la medida:\\&lt;br /&gt;
    · wf_measure: wf (measure f)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas sobre el producto lexicográfico:&lt;br /&gt;
  · Definición del producto lexicográfico (lex_prod_def)&amp;quot;:&lt;br /&gt;
    ra &amp;lt;*lex*&amp;gt; rb \&amp;lt;equiv&amp;gt; {((a,b),(a&amp;#039;,b&amp;#039;)). (a,a&amp;#039;) \&amp;lt;in&amp;gt; ra \&amp;lt;or&amp;gt; &lt;br /&gt;
                                      (a = a&amp;#039; \&amp;lt;and&amp;gt; (b,b&amp;#039;) \&amp;lt;in&amp;gt; rb)}&lt;br /&gt;
  · Conservación de la buena fundamentación:&lt;br /&gt;
    · wf_lex_prod: \&amp;lt;lbrakk&amp;gt;wf ra; wf rb\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; wf (ra &amp;lt;*lex*&amp;gt; rb)&lt;br /&gt;
&lt;br /&gt;
  El orden de multiconjuntos está en la teoría HOL/Library/Multiset.thy.&lt;br /&gt;
&lt;br /&gt;
  Inducción sobre relaciones bien fundamentadas:&lt;br /&gt;
  · wf_induct: \&amp;lt;lbrakk&amp;gt;wf r; \&amp;lt;And&amp;gt;x. (\&amp;lt;And&amp;gt;y. (y,x) \&amp;lt;in&amp;gt; r \&amp;lt;Longrightarrow&amp;gt; P y) \&amp;lt;Longrightarrow&amp;gt; P x\&amp;lt;rbrakk&amp;gt; \&amp;lt;Longrightarrow&amp;gt; P a&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_11:_Caso_de_estudio:_Compilaci%C3%B3n_de_expresiones&amp;diff=64</id>
		<title>Tema 11: Caso de estudio: Compilación de expresiones</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_11:_Caso_de_estudio:_Compilaci%C3%B3n_de_expresiones&amp;diff=64"/>
		<updated>2012-01-31T19:05:14Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; header {* Tema 11: Caso de estudio: Compilación de expresiones *}  theory Tema_11 imports Main begin  text {*   El objetivo de este tema es contruir un com...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 11: Caso de estudio: Compilación de expresiones *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_11&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El objetivo de este tema es contruir un compilador de expresiones&lt;br /&gt;
  genéricas (construidas con variables, constantes y operaciones&lt;br /&gt;
  binarias) a una máquina de pila y demostrar su corrección.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Las expresiones y el intérprete *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. Las expresiones son las constantes, las variables&lt;br /&gt;
  (representadas por números naturales) y las aplicaciones de operadores&lt;br /&gt;
  binarios a dos expresiones. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
types &amp;#039;v binop = &amp;quot;&amp;#039;v \&amp;lt;Rightarrow&amp;gt; &amp;#039;v \&amp;lt;Rightarrow&amp;gt; &amp;#039;v&amp;quot;&lt;br /&gt;
datatype &amp;#039;v expr = &lt;br /&gt;
    Const &amp;#039;v &lt;br /&gt;
  | Var nat &lt;br /&gt;
  | App &amp;quot;&amp;#039;v binop&amp;quot; &amp;quot;&amp;#039;v expr&amp;quot; &amp;quot;&amp;#039;v expr&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. [Intérprete] &lt;br /&gt;
  La función &amp;quot;valor&amp;quot; toma como argumentos una expresión y un entorno&lt;br /&gt;
  (i.e. una aplicación de las variables en elementos del lenguaje) y&lt;br /&gt;
  devuelve el valor de la expresión en el entorno.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec valor :: &amp;quot;&amp;#039;v expr \&amp;lt;Rightarrow&amp;gt; (nat \&amp;lt;Rightarrow&amp;gt; &amp;#039;v) \&amp;lt;Rightarrow&amp;gt; &amp;#039;v&amp;quot; where&lt;br /&gt;
  &amp;quot;valor (Const b) ent = b&amp;quot;&lt;br /&gt;
| &amp;quot;valor (Var x) ent = ent x&amp;quot;&lt;br /&gt;
| &amp;quot;valor (App f e1 e2) ent = (f (valor e1 ent) (valor e2 ent))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo. A continuación mostramos algunos ejemplos de evaluación con&lt;br /&gt;
  el intérprete. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;valor (Const 3) id = 3 \&amp;lt;and&amp;gt;&lt;br /&gt;
  valor (Var 2) id = 2 \&amp;lt;and&amp;gt;&lt;br /&gt;
  valor (Var 2) (\&amp;lt;lambda&amp;gt;x. x+1) = 3 \&amp;lt;and&amp;gt; &lt;br /&gt;
  valor (App (op +) (Const 3) (Var 2)) (\&amp;lt;lambda&amp;gt;x. x+1) = 6 \&amp;lt;and&amp;gt;&lt;br /&gt;
  valor (App (op +) (Const 3) (Var 2)) (\&amp;lt;lambda&amp;gt;x. x+4) = 9&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* La máquina de pila *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. La máquina de pila tiene tres clases de intrucciones:&lt;br /&gt;
  · cargar en la pila una constante,&lt;br /&gt;
  · cargar en la pila el contenido de una dirección y&lt;br /&gt;
  · aplicar un operador binario a los dos elementos superiores de la pila.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;v instr = &lt;br /&gt;
    IConst &amp;#039;v &lt;br /&gt;
  | ILoad nat &lt;br /&gt;
  | IApp &amp;quot;&amp;#039;v binop&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. [Ejecución]&lt;br /&gt;
  La ejecución de la máquina de pila se modeliza mediante la función&lt;br /&gt;
  &amp;quot;ejec&amp;quot; que toma una lista de intrucciones, una memoria (representada&lt;br /&gt;
  como una función de las direcciones a los valores, análogamente a los&lt;br /&gt;
  entornos) y una pila (representada como una lista) y devuelve la pila al&lt;br /&gt;
  final de la ejecución.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec ejec :: &amp;quot;&amp;#039;v instr list \&amp;lt;Rightarrow&amp;gt; (nat\&amp;lt;Rightarrow&amp;gt;&amp;#039;v) \&amp;lt;Rightarrow&amp;gt; &amp;#039;v list \&amp;lt;Rightarrow&amp;gt; &amp;#039;v list&amp;quot; where&lt;br /&gt;
  &amp;quot;ejec [] ent vs = vs&amp;quot;&lt;br /&gt;
| &amp;quot;ejec (i#is) ent vs = &lt;br /&gt;
     (case i of&lt;br /&gt;
        IConst v \&amp;lt;Rightarrow&amp;gt; ejec is ent (v#vs)&lt;br /&gt;
      | ILoad x \&amp;lt;Rightarrow&amp;gt; ejec is ent ((ent x)#vs)&lt;br /&gt;
      | IApp f \&amp;lt;Rightarrow&amp;gt; ejec is ent ((f (hd vs) (hd (tl vs)))#(tl(tl vs))))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  A continuación se muestran ejemplos de ejecución.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  &amp;quot;ejec [IConst 3] id [7] = [3,7] \&amp;lt;and&amp;gt;&lt;br /&gt;
  ejec [ILoad 2, IConst 3] id [7] = [3,2,7] \&amp;lt;and&amp;gt;&lt;br /&gt;
  ejec [ILoad 2, IConst 3] (\&amp;lt;lambda&amp;gt;x. x+4) [7] = [3,6,7] \&amp;lt;and&amp;gt;&lt;br /&gt;
  ejec [ILoad 2, IConst 3, IApp (op +)] (\&amp;lt;lambda&amp;gt;x. x+4) [7] = [9,7]&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* El compilador *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. El compilador &amp;quot;comp&amp;quot; traduce una expresión en una lista de&lt;br /&gt;
  instrucciones. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec comp :: &amp;quot;&amp;#039;v expr \&amp;lt;Rightarrow&amp;gt; &amp;#039;v instr list&amp;quot; where&lt;br /&gt;
  &amp;quot;comp (Const v) = [IConst v]&amp;quot;&lt;br /&gt;
| &amp;quot;comp (Var x) = [ILoad x]&amp;quot;&lt;br /&gt;
| &amp;quot;comp (App f e1 e2) = (comp e2) @ (comp e1) @ [IApp f]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  A continuación se muestran ejemplos de compilación.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  &amp;quot;comp (Const 3) = [IConst 3] \&amp;lt;and&amp;gt;&lt;br /&gt;
  comp (Var 2) = [ILoad 2] \&amp;lt;and&amp;gt;&lt;br /&gt;
  comp (App (op +) (Const 3) (Var 2)) = [ILoad 2, IConst 3, IApp (op +)]&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Corrección del compilador *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Para demostrar que el compilador es correcto, probamos que el resultado de&lt;br /&gt;
  compilar una expresión y a continuación ejecutarla es lo mismo que&lt;br /&gt;
  interpretarla; es decir, &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;ejec (comp e) ent [] = [valor e ent]&amp;quot; &lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El teorema anterior no puede demostrarse por inducción en e. Para&lt;br /&gt;
  demostrarlo por inducción, lo generalizamos a&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;\&amp;lt;forall&amp;gt;vs. ejec (comp e) ent vs = (valor e ent)#vs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En la demostración del teorema anterior usaremos el siguiente lema.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma ejec_append:&lt;br /&gt;
  &amp;quot;\&amp;lt;forall&amp;gt; vs. ejec (xs@ys) ent vs = ejec ys ent (ejec xs ent vs)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;?P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;?P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;?P (a#xs)&amp;quot;&lt;br /&gt;
  proof (cases &amp;quot;a&amp;quot;)&lt;br /&gt;
    case IConst thus ?thesis using HI by simp&lt;br /&gt;
  next&lt;br /&gt;
    case ILoad thus ?thesis using HI by simp&lt;br /&gt;
  next&lt;br /&gt;
    case IApp thus ?thesis using HI by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Una demostración más detallada del lema es la siguiente:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma ejec_append_2:&lt;br /&gt;
  &amp;quot;\&amp;lt;forall&amp;gt; vs. ejec (xs@ys) ent vs = ejec ys ent (ejec xs ent vs)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;?P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;?P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;?P (a#xs)&amp;quot;&lt;br /&gt;
  proof (cases &amp;quot;a&amp;quot;)&lt;br /&gt;
    fix v assume C1: &amp;quot;a=IConst v&amp;quot;&lt;br /&gt;
    show &amp;quot; \&amp;lt;forall&amp;gt;vs. ejec ((a#xs)@ys) ent vs = ejec ys ent (ejec (a#xs) ent vs)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix vs&lt;br /&gt;
      have &amp;quot;ejec ((a#xs)@ys) ent vs = ejec (((IConst v)#xs)@ys) ent vs&amp;quot;&lt;br /&gt;
        using C1 by simp&lt;br /&gt;
      also have &amp;quot;\&amp;lt;dots&amp;gt; = ejec (xs@ys) ent (v#vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;\&amp;lt;dots&amp;gt; = ejec ys ent (ejec xs ent (v#vs))&amp;quot; using HI by simp&lt;br /&gt;
      also have &amp;quot;\&amp;lt;dots&amp;gt; = ejec ys ent (ejec ((IConst v)#xs) ent vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;\&amp;lt;dots&amp;gt; = ejec ys ent (ejec (a#xs) ent vs)&amp;quot; using C1 by simp&lt;br /&gt;
      finally show &amp;quot;ejec ((a#xs)@ys) ent vs = &lt;br /&gt;
                    ejec ys ent (ejec (a#xs) ent vs)&amp;quot; .&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    fix n assume C2: &amp;quot;a=ILoad n&amp;quot;&lt;br /&gt;
    show &amp;quot; \&amp;lt;forall&amp;gt;vs. ejec ((a#xs)@ys) ent vs = ejec ys ent (ejec (a#xs) ent vs)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix vs&lt;br /&gt;
      have &amp;quot;ejec ((a#xs)@ys) ent vs = ejec (((ILoad n)#xs)@ys) ent vs&amp;quot;&lt;br /&gt;
        using C2 by simp&lt;br /&gt;
      also have &amp;quot;\&amp;lt;dots&amp;gt; = ejec (xs@ys) ent ((ent n)#vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;\&amp;lt;dots&amp;gt; = ejec ys ent (ejec xs ent ((ent n)#vs))&amp;quot; using HI by simp&lt;br /&gt;
      also have &amp;quot;\&amp;lt;dots&amp;gt; = ejec ys ent (ejec ((ILoad n)#xs) ent vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;\&amp;lt;dots&amp;gt; = ejec ys ent (ejec (a#xs) ent vs)&amp;quot; using C2 by simp&lt;br /&gt;
      finally show &amp;quot;ejec ((a#xs)@ys) ent vs = &lt;br /&gt;
                    ejec ys ent (ejec (a#xs) ent vs)&amp;quot; .&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    fix f assume C3: &amp;quot;a=IApp f&amp;quot;&lt;br /&gt;
    show &amp;quot;\&amp;lt;forall&amp;gt;vs. ejec ((a#xs)@ys) ent vs = ejec ys ent (ejec (a#xs) ent vs)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix vs&lt;br /&gt;
      have &amp;quot;ejec ((a#xs)@ys) ent vs = ejec (((IApp f)#xs)@ys) ent vs&amp;quot;&lt;br /&gt;
        using C3 by simp&lt;br /&gt;
      also have &amp;quot;\&amp;lt;dots&amp;gt; = ejec (xs@ys) ent ((f (hd vs) (hd (tl vs)))#(tl(tl vs)))&amp;quot; &lt;br /&gt;
        by simp&lt;br /&gt;
      also have &amp;quot;\&amp;lt;dots&amp;gt; = ejec ys &lt;br /&gt;
                          ent &lt;br /&gt;
                          (ejec xs ent ((f (hd vs) (hd (tl vs)))#(tl(tl vs))))&amp;quot; &lt;br /&gt;
        using HI by simp&lt;br /&gt;
      also have &amp;quot;\&amp;lt;dots&amp;gt; = ejec ys ent (ejec ((IApp f)#xs) ent vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;\&amp;lt;dots&amp;gt; = ejec ys ent (ejec (a#xs) ent vs)&amp;quot; using C3 by simp&lt;br /&gt;
      finally show &amp;quot;ejec ((a#xs)@ys) ent vs = &lt;br /&gt;
                    ejec ys ent (ejec (a#xs) ent vs)&amp;quot; .&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La demostración del teorema es la siguiente&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;\&amp;lt;forall&amp;gt; vs. ejec (comp e) ent vs = (valor e ent)#vs&amp;quot;&lt;br /&gt;
proof (induct e)&lt;br /&gt;
  fix v&lt;br /&gt;
  show &amp;quot;\&amp;lt;forall&amp;gt;vs. ejec (comp (Const v)) ent vs = (valor (Const v) ent)#vs&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;\&amp;lt;forall&amp;gt;vs. ejec (comp (Var x)) ent vs = (valor (Var x) ent) # vs&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix f e1 e2&lt;br /&gt;
  assume HI1: &amp;quot;\&amp;lt;forall&amp;gt;vs. ejec (comp e1) ent vs = (valor e1 ent) # vs&amp;quot;&lt;br /&gt;
    and HI2: &amp;quot;\&amp;lt;forall&amp;gt;vs. ejec (comp e2) ent vs = (valor e2 ent) # vs&amp;quot;&lt;br /&gt;
  show &amp;quot;\&amp;lt;forall&amp;gt;vs. ejec (comp (App f e1 e2)) ent vs = (valor (App f e1 e2) ent) # vs&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix vs&lt;br /&gt;
    have &amp;quot;ejec (comp (App f e1 e2)) ent vs&lt;br /&gt;
          = ejec ((comp e2) @ (comp e1) @ [IApp f]) ent vs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;\&amp;lt;dots&amp;gt; = ejec ((comp e1) @ [IApp f]) ent (ejec (comp e2) ent vs)&amp;quot;&lt;br /&gt;
      using ejec_append by blast&lt;br /&gt;
    also have &amp;quot;\&amp;lt;dots&amp;gt; = ejec [IApp f] &lt;br /&gt;
                         ent &lt;br /&gt;
                         (ejec (comp e1) ent (ejec (comp e2) ent vs))&amp;quot; &lt;br /&gt;
      using ejec_append by blast&lt;br /&gt;
    also have &amp;quot;\&amp;lt;dots&amp;gt; =  ejec [IApp f] ent (ejec (comp e1) ent ((valor e2 ent)#vs))&amp;quot;&lt;br /&gt;
      using HI2 by simp&lt;br /&gt;
    also have &amp;quot;\&amp;lt;dots&amp;gt; = ejec [IApp f] ent ((valor e1 ent)#((valor e2 ent)#vs))&amp;quot;&lt;br /&gt;
      using HI1 by simp&lt;br /&gt;
    also have &amp;quot;\&amp;lt;dots&amp;gt; = (f (valor e1 ent) (valor e2 ent))#vs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;\&amp;lt;dots&amp;gt; = (valor (App f e1 e2) ent) # vs&amp;quot; by simp&lt;br /&gt;
    finally &lt;br /&gt;
    show &amp;quot;ejec (comp (App f e1 e2)) ent vs = (valor (App f e1 e2) ent) # vs&amp;quot; &lt;br /&gt;
      by blast&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=DAO2011_(Demostraci%C3%B3n_asistida_por_ordenador)&amp;diff=63</id>
		<title>DAO2011 (Demostración asistida por ordenador)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=DAO2011_(Demostraci%C3%B3n_asistida_por_ordenador)&amp;diff=63"/>
		<updated>2012-01-31T19:03:57Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Razonamiento automático (2011-12) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Demostración asistida por ordenador ==&lt;br /&gt;
Este curso es una introducción a la demostración asistida por ordenador usando el sistema [http://www.cl.cam.ac.uk/research/hvg/Isabelle Isabelle/HOL/Isar]). Los objetivos del curso son:&lt;br /&gt;
* desarrollar la capacidad de razonamiento lógico,&lt;br /&gt;
* conocer formalismos de representación del conocimiento matemático,&lt;br /&gt;
* saber usar sistemas de razonamiento y&lt;br /&gt;
* desarrollar teorías matemáticas en sistemas de demostración automática. &lt;br /&gt;
&lt;br /&gt;
Administrativamente, es un [http://www.cfp.us.es/web/ficha_avanzada.asp?id_titulo=846&amp;amp;tipo=FE&amp;amp;basica=1&amp;amp;curso=2010 curso de formación especializada] del [http://www.cfp.us.es/ Centro de Formación Permanente de la Universidad de Sevilla].&lt;br /&gt;
&lt;br /&gt;
== Material para el curso ==&lt;br /&gt;
* [[Temas]]: Teorías de los temas.&lt;br /&gt;
* [[Ejercicios]]: Relaciones de ejercicios.&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao/doc.html Documentación]: Enlaces con documentación.&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao/sistemas.html Sistemas]: Sistemas utilizados.&lt;br /&gt;
* [http://www.glc.us.es/~jalonso/vestigium/tag/dao2011/ Diario]: Descripción diaria de las clases.&lt;br /&gt;
&lt;br /&gt;
== Razonamiento automático (2011-12) ==&lt;br /&gt;
* [[Tema 6: Isabelle como un lenguaje funcional]].&lt;br /&gt;
* [[Tema 7: El lenguaje de demostración Isar]].&lt;br /&gt;
* [[Tema 8: Distinción de casos e inducción]].&lt;br /&gt;
* [[Tema 9: Patrones de demostración]].&lt;br /&gt;
* [[Tema 10: Heurísticas para la inducción y recursión general]].&lt;br /&gt;
* [[Tema 11: Caso de estudio: Compilación de expresiones]].&lt;br /&gt;
* [[Tema 12: Conjuntos, funciones y relaciones]].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_10:_Heur%C3%ADsticas_para_la_inducci%C3%B3n_y_recursi%C3%B3n_general&amp;diff=62</id>
		<title>Tema 10: Heurísticas para la inducción y recursión general</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_10:_Heur%C3%ADsticas_para_la_inducci%C3%B3n_y_recursi%C3%B3n_general&amp;diff=62"/>
		<updated>2012-01-31T15:28:16Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; header {* Tema 10: Heurísticas para la inducción y recursión general *}  theory Tema_10 imports Main Tema_7 Efficient_Nat begin  section {* Heurísticas ...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 10: Heurísticas para la inducción y recursión general *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_10&lt;br /&gt;
imports Main Tema_7 Efficient_Nat&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Heurísticas para la inducción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. [Definición recursiva de inversa]&lt;br /&gt;
  (inversa xs) la inversa de la lista xs. Por ejemplo,&lt;br /&gt;
     inversa [2,5,3] = [3,5,2] &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec 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 [2::nat,5,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición. [Definición de inversa con acumuladores]&lt;br /&gt;
  (inversaAc xs) es la inversa de la lista xs calculada con&lt;br /&gt;
  acumuladores. Por ejemplo,&lt;br /&gt;
     inversaAc [2,5,3] = [3,5,2] &lt;br /&gt;
     inversaAcAux [2,5,3] [] = [3,5,2] &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec 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;
definition 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;inversaAcAux [2::nat,5,3] []&amp;quot;&lt;br /&gt;
value &amp;quot;inversaAc [2::nat,5,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Ejemplo de equivalencia entre las definiciones]&lt;br /&gt;
  La inversa de [1,2,3] es lo mismo calculada con la primera definición que&lt;br /&gt;
  con la segunda.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;inversaAc [1,2,3] = inversa [1,2,3]&amp;quot;&lt;br /&gt;
by (simp add: inversaAc_def)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. [Ejemplo fallido de demostración por inducción]&lt;br /&gt;
  El siguiente intento de demostrar que para cualquier lista xs, se tiene que&lt;br /&gt;
  &amp;quot;inversaAc xs = inversa xs&amp;quot; falla.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;inversaAc xs = inversa xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;inversaAc [] = inversa []&amp;quot; by (simp add: inversaAc_def)&lt;br /&gt;
next&lt;br /&gt;
  fix a xs assume HI: &amp;quot;inversaAc xs = inversa xs&amp;quot;&lt;br /&gt;
  have &amp;quot;inversaAc (a#xs) = inversaAcAux (a#xs) []&amp;quot; by (simp add: inversaAc_def)&lt;br /&gt;
  also have &amp;quot;… = inversaAcAux xs [a]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = inversa (a#xs)&amp;quot;&lt;br /&gt;
  -- &amp;quot;Problema: la hipótesis de inducción no es aplicable.&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Nota. [Heurística de generalización]&lt;br /&gt;
  Cuando se use demostración estructural, cuantificar universalmente las&lt;br /&gt;
  variables libres (o, equivalentemente, considerar las variables libres como&lt;br /&gt;
  variables arbitrarias).&lt;br /&gt;
&lt;br /&gt;
  Lema. [Lema con generalización]&lt;br /&gt;
  Para toda lista ys se tiene &lt;br /&gt;
     inversaAcAux xs ys = (inversa xs) @ ys&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma inversaAcAux_es_inversa:&lt;br /&gt;
  &amp;quot;inversaAcAux xs ys = (inversa xs)@ys&amp;quot;&lt;br /&gt;
proof (induct xs arbitrary: ys)&lt;br /&gt;
  show &amp;quot;⋀ys. inversaAcAux [] ys = (inversa [])@ys&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs &lt;br /&gt;
  assume HI: &amp;quot;⋀ys. inversaAcAux xs ys = inversa xs@ys&amp;quot;&lt;br /&gt;
  show &amp;quot;⋀ys. inversaAcAux (a#xs) ys = inversa (a#xs)@ys&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    fix ys&lt;br /&gt;
    have &amp;quot;inversaAcAux (a#xs) ys = inversaAcAux xs (a#ys)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = inversa xs@(a#ys)&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;… = inversa (a#xs)@ys&amp;quot; by simp &lt;br /&gt;
    finally show &amp;quot;inversaAcAux (a#xs) ys = inversa (a#xs)@ys&amp;quot; by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Corolario.  Para cualquier lista xs, se tiene que&lt;br /&gt;
     inversaAc xs = inversa xs&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
corollary &amp;quot;inversaAc xs = inversa xs&amp;quot;&lt;br /&gt;
by (simp add: inversaAcAux_es_inversa inversaAc_def)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. En el paso &amp;quot;inversa xs@(a#ys) = inversa (a#xs)@ys&amp;quot; se usan&lt;br /&gt;
  lemas de la teoría List. Se puede observar, activando &amp;quot;Trace&lt;br /&gt;
  Simplifier&amp;quot; y D&amp;quot;|Trace Rules&amp;quot;, que los lemas usados son &lt;br /&gt;
  · append_assoc:       (xs @ ys) @ zs = xs @ (ys @ zs)&lt;br /&gt;
  · append.append_Cons: (x#xs)@ys = x#(xs@ys)&lt;br /&gt;
  · append.append_Nil:  []@ys = ys&lt;br /&gt;
  Los dos últimos son las ecuaciones de la definición de append.&lt;br /&gt;
&lt;br /&gt;
  En la siguiente demostración se detallan los lemas utilizados.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(inversa xs)@(a#ys) = (inversa (a#xs))@ys&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;(inversa xs)@(a#ys) = (inversa xs)@(a#([]@ys))&amp;quot; &lt;br /&gt;
    by (simp only:append.append_Nil)&lt;br /&gt;
  also have &amp;quot;… = (inversa xs)@([a]@ys)&amp;quot; by (simp only:append.append_Cons)&lt;br /&gt;
  also have &amp;quot;… = ((inversa xs)@[a])@ys&amp;quot; by (simp only:append_assoc)&lt;br /&gt;
  also have &amp;quot;… = (inversa (a#xs))@ys&amp;quot; by (simp only:inversa.simps(2))&lt;br /&gt;
  finally show ?thesis .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Recursión general. La función de Ackermann *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  El objetivo de esta sección es mostrar el uso de las definiciones&lt;br /&gt;
  recursivas generales y sus esquemas de inducción. Como ejemplo se usa la&lt;br /&gt;
  función de Ackermann (se puede consultar información sobre dicha función en&lt;br /&gt;
  http://en.wikipedia.org/wiki/Ackermann_function).&lt;br /&gt;
&lt;br /&gt;
  Definición.  La función de Ackermann se define por&lt;br /&gt;
    A(m,n) = n+1,             si m=0,&lt;br /&gt;
             A(m-1,1)         si m&amp;gt;0 y n=0,&lt;br /&gt;
             A(m-1,A(m,n-1)), si m&amp;gt;0 y n&amp;gt;0&lt;br /&gt;
&lt;br /&gt;
  para todo los números naturales. &lt;br /&gt;
&lt;br /&gt;
  La función de Ackermann es recursiva, pero no es primitiva recursiva. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun ack :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
&amp;quot;ack 0 n = n+1&amp;quot; | &lt;br /&gt;
&amp;quot;ack (Suc m) 0 = ack m 1&amp;quot; | &lt;br /&gt;
&amp;quot;ack (Suc m) (Suc n) = ack m (ack (Suc m) n)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. [Ejemplo de cálculo]&lt;br /&gt;
  El cálculo del valor de la función de Ackermann para 2 y 3 se realiza&lt;br /&gt;
  mediante &amp;quot;value&amp;quot;&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;ack 2 3&amp;quot; (* devuelve 9 *)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. [Definiciones recursivas generales]&lt;br /&gt;
  · Las definiciones recursivas generales se identifican mediante &amp;quot;fun&amp;quot;.&lt;br /&gt;
  · Al definir una función recursiva general se genera una regla de&lt;br /&gt;
    inducción. En la definición anterior, la regla generada es&lt;br /&gt;
    ack.induct: &lt;br /&gt;
       ⟦⋀n. P 0 n; &lt;br /&gt;
        ⋀m. P m 1 ⟹ P (Suc m) 0;&lt;br /&gt;
        ⋀m n. ⟦P (Suc m) n; P m (ack (Suc m) n)⟧ ⟹ P (Suc m) (Suc n)⟧&lt;br /&gt;
       ⟹ P a b&lt;br /&gt;
&lt;br /&gt;
  Lema. Para todos m y n, A(m,n) &amp;gt; n.&lt;br /&gt;
*} &lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;ack m n &amp;gt; n&amp;quot;&lt;br /&gt;
proof (induct m n rule: ack.induct)&lt;br /&gt;
  fix n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  show &amp;quot;ack 0 n &amp;gt; n&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix m assume &amp;quot;ack m 1 &amp;gt; 1&amp;quot;&lt;br /&gt;
  thus &amp;quot;ack (Suc m) 0 &amp;gt; 0&amp;quot; by simp&lt;br /&gt;
next  &lt;br /&gt;
  fix m n&lt;br /&gt;
  assume &amp;quot;n &amp;lt; ack (Suc m) n&amp;quot; and &lt;br /&gt;
         &amp;quot;ack (Suc m) n &amp;lt; ack m (ack (Suc m) n)&amp;quot;&lt;br /&gt;
  thus &amp;quot;Suc n &amp;lt; ack (Suc m) (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  El lema anterior se puede demostrar automáticamente, como sigue.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;ack m n &amp;gt; n&amp;quot;&lt;br /&gt;
by (induct m n rule: ack.induct) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. [Inducción sobre recursión]&lt;br /&gt;
  El formato para iniciar una demostración por inducción en la regla inductiva&lt;br /&gt;
  correspondiente a la definición recursiva de la función f m n es&lt;br /&gt;
     proof (induct m n rule:f.induct) &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Recursión mutua e inducción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. [Ejemplo de definición de tipos mediante recursión cruzada]&lt;br /&gt;
  · Un árbol de tipo a es una hoja o un nodo de tipo a junto con un&lt;br /&gt;
    bosque de tipo a.&lt;br /&gt;
  · Un bosque de tipo a es el boque vacío o un bosque contruido añadiendo&lt;br /&gt;
    un árbol de tipo a a un bosque de tipo a.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = Hoja | Nodo &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a bosque&amp;quot;&lt;br /&gt;
and      &amp;#039;a bosque = Vacio | ConsB &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a bosque&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. [Regla de inducción correspondiente a la recursión cruzada]&lt;br /&gt;
  La regla de inducción sobre árboles y bosques es arbol_bosque.induct:&lt;br /&gt;
     ⟦P1 Hoja; &lt;br /&gt;
      ⋀x b. P2 b ⟹ P1 (Nodo x b); &lt;br /&gt;
      P2 Vacio;&lt;br /&gt;
      ⋀a b. ⟦P1 a; P2 b⟧ ⟹ P2 (ConsB a b)⟧ &lt;br /&gt;
     ⟹ P1 a ∧ P2 b&lt;br /&gt;
 &lt;br /&gt;
  Nota. [Ejemplos de definición por recursión cruzada]&lt;br /&gt;
  · aplana_arbol a) es la lista obtenida aplanando el árbol a.   &lt;br /&gt;
  · (aplana_bosque b) es la lista obtenida aplanando el bosque b.   &lt;br /&gt;
  · (map_arbol a h) es el árbol obtenido aplicando la función h a&lt;br /&gt;
    todos los nodos del árbol a.   &lt;br /&gt;
  · (map_bosque b h) es el bosque obtenido aplicando la función h a&lt;br /&gt;
    todos los nodos del bosque b. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun&lt;br /&gt;
  aplana_arbol :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; and &lt;br /&gt;
  aplana_bosque :: &amp;quot;&amp;#039;a bosque ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;aplana_arbol Hoja = []&amp;quot;&lt;br /&gt;
| &amp;quot;aplana_arbol (Nodo x b) = x#(aplana_bosque b)&amp;quot;&lt;br /&gt;
| &amp;quot;aplana_bosque Vacio = []&amp;quot;&lt;br /&gt;
| &amp;quot;aplana_bosque (ConsB a b) = (aplana_arbol a) @ (aplana_bosque b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun&lt;br /&gt;
  map_arbol :: &amp;quot;&amp;#039;a arbol ⇒ (&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;b arbol&amp;quot; and&lt;br /&gt;
  map_bosque :: &amp;quot;&amp;#039;a bosque ⇒ (&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;b bosque&amp;quot; where&lt;br /&gt;
  &amp;quot;map_arbol Hoja h = Hoja&amp;quot;&lt;br /&gt;
| &amp;quot;map_arbol (Nodo x b) h = Nodo (h x) (map_bosque b h)&amp;quot;&lt;br /&gt;
| &amp;quot;map_bosque Vacio h = Vacio&amp;quot;&lt;br /&gt;
| &amp;quot;map_bosque (ConsB a b) h = ConsB (map_arbol a h) (map_bosque b h)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Ejemplo de inducción cruzada]&lt;br /&gt;
  · aplana_arbol (map_arbol a h) = map h (aplana_arbol a)&lt;br /&gt;
  · aplana_bosque (map_bosque b h) = map h (aplana_bosque b)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana_arbol (map_arbol a h) = map h (aplana_arbol a)&lt;br /&gt;
     ∧ aplana_bosque (map_bosque b h) = map h (aplana_bosque b)&amp;quot;&lt;br /&gt;
proof (induct_tac a and b)&lt;br /&gt;
  show &amp;quot;aplana_arbol (map_arbol Hoja h) = map h (aplana_arbol Hoja)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x b&lt;br /&gt;
  assume HI: &amp;quot;aplana_bosque (map_bosque b h) = map h (aplana_bosque b)&amp;quot;&lt;br /&gt;
  have &amp;quot;aplana_arbol (map_arbol (Nodo x b) h) &lt;br /&gt;
        = aplana_arbol (Nodo (h x) (map_bosque b h))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (h x)#(aplana_bosque (map_bosque b h))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (h x)#(map h (aplana_bosque b))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;… = map h (aplana_arbol (Nodo x b))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;aplana_arbol (map_arbol (Nodo x b) h)&lt;br /&gt;
                = map h (aplana_arbol (Nodo x b))&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;aplana_bosque (map_bosque Vacio h) = map h (aplana_bosque Vacio)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a b&lt;br /&gt;
  assume HI1: &amp;quot;aplana_arbol (map_arbol a h) = map h (aplana_arbol a)&amp;quot;&lt;br /&gt;
     and HI2: &amp;quot;aplana_bosque (map_bosque b h) = map h (aplana_bosque b)&amp;quot;&lt;br /&gt;
  have &amp;quot;aplana_bosque (map_bosque (ConsB a b) h)&lt;br /&gt;
        = aplana_bosque (ConsB (map_arbol a h) (map_bosque b h))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = aplana_arbol(map_arbol a h)@aplana_bosque(map_bosque b h)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;… = (map h (aplana_arbol a))@(map h (aplana_bosque b))&amp;quot; &lt;br /&gt;
    using HI1 HI2 by simp&lt;br /&gt;
  also have &amp;quot;… = map h (aplana_bosque (ConsB a b))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;aplana_bosque (map_bosque (ConsB a b) h) &lt;br /&gt;
                = map h (aplana_bosque (ConsB a b))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana_arbol (map_arbol a h) = map h (aplana_arbol a)&lt;br /&gt;
     ∧ aplana_bosque (map_bosque b h) = map h (aplana_bosque b)&amp;quot;&lt;br /&gt;
by (induct_tac a and b) auto&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=DAO2011_(Demostraci%C3%B3n_asistida_por_ordenador)&amp;diff=61</id>
		<title>DAO2011 (Demostración asistida por ordenador)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=DAO2011_(Demostraci%C3%B3n_asistida_por_ordenador)&amp;diff=61"/>
		<updated>2012-01-31T15:27:17Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Razonamiento automático (2011-12) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Demostración asistida por ordenador ==&lt;br /&gt;
Este curso es una introducción a la demostración asistida por ordenador usando el sistema [http://www.cl.cam.ac.uk/research/hvg/Isabelle Isabelle/HOL/Isar]). Los objetivos del curso son:&lt;br /&gt;
* desarrollar la capacidad de razonamiento lógico,&lt;br /&gt;
* conocer formalismos de representación del conocimiento matemático,&lt;br /&gt;
* saber usar sistemas de razonamiento y&lt;br /&gt;
* desarrollar teorías matemáticas en sistemas de demostración automática. &lt;br /&gt;
&lt;br /&gt;
Administrativamente, es un [http://www.cfp.us.es/web/ficha_avanzada.asp?id_titulo=846&amp;amp;tipo=FE&amp;amp;basica=1&amp;amp;curso=2010 curso de formación especializada] del [http://www.cfp.us.es/ Centro de Formación Permanente de la Universidad de Sevilla].&lt;br /&gt;
&lt;br /&gt;
== Material para el curso ==&lt;br /&gt;
* [[Temas]]: Teorías de los temas.&lt;br /&gt;
* [[Ejercicios]]: Relaciones de ejercicios.&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao/doc.html Documentación]: Enlaces con documentación.&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao/sistemas.html Sistemas]: Sistemas utilizados.&lt;br /&gt;
* [http://www.glc.us.es/~jalonso/vestigium/tag/dao2011/ Diario]: Descripción diaria de las clases.&lt;br /&gt;
&lt;br /&gt;
== Razonamiento automático (2011-12) ==&lt;br /&gt;
* [[Tema 6: Isabelle como un lenguaje funcional]].&lt;br /&gt;
* [[Tema 7: El lenguaje de demostración Isar]].&lt;br /&gt;
* [[Tema 8: Distinción de casos e inducción]].&lt;br /&gt;
* [[Tema 9: Patrones de demostración]].&lt;br /&gt;
* [[Tema 10: Heurísticas para la inducción y recursión general]].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_9:_Patrones_de_demostraci%C3%B3n&amp;diff=60</id>
		<title>Tema 9: Patrones de demostración</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_9:_Patrones_de_demostraci%C3%B3n&amp;diff=60"/>
		<updated>2012-01-31T13:07:23Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; header {* Tema 9: Patrones de demostración *}  theory Tema_9 imports Main begin  section {* Demostraciones por casos *}   text {*   Nota. [Regla de elimina...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 9: Patrones de demostración *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_9&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Demostraciones por casos *} &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. [Regla de eliminación de la disyunción]&lt;br /&gt;
  · disjE: ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R&lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de demostración por casos]&lt;br /&gt;
     P ∨ Q ⟹ Q ∨ P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma disj_conmutativa: &amp;quot;P ∨ Q ⟹ Q ∨ P&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  assume &amp;quot;P ∨ Q&amp;quot; &lt;br /&gt;
  thus &amp;quot;Q ∨ P&amp;quot; &lt;br /&gt;
  proof (rule disjE) &lt;br /&gt;
    assume P &lt;br /&gt;
    thus ?thesis  by (rule disjI2)&lt;br /&gt;
  next&lt;br /&gt;
    assume Q &lt;br /&gt;
    thus ?thesis by (rule disjI1) &lt;br /&gt;
  qed &lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. El lema anterior puede demostrarse automáticamente como se&lt;br /&gt;
  muestra a continuación. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma disj_conmutativa_auto: &amp;quot;P ∨ Q ⟹ Q ∨ P&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
section {* Negación *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Reglas de la negación:&lt;br /&gt;
  · notI: (P ⟹ False) ⟹ ¬P&lt;br /&gt;
  · notE: ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de demostración con negaciones]&lt;br /&gt;
  Si x\&amp;lt;^bsup&amp;gt;2\&amp;lt;^esup&amp;gt;+y=13 e y ≠ 4, entonces x ≠ 3.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes x :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;x * x + y = 13&amp;quot; &lt;br /&gt;
      and 2: &amp;quot;y ≠ 4&amp;quot;&lt;br /&gt;
  shows &amp;quot;x ≠ 3&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume &amp;quot;x = 3&amp;quot;&lt;br /&gt;
  with 1 have &amp;quot;y = 4&amp;quot; by simp&lt;br /&gt;
  with 2 show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La demostración puede hacerse automáticamente como se muestra a&lt;br /&gt;
  continuación. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes x :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;x * x + y = 13&amp;quot; &lt;br /&gt;
      and 2: &amp;quot;y ≠ 4&amp;quot;&lt;br /&gt;
  shows &amp;quot;x ≠ 3&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume &amp;quot;x = 3&amp;quot;&lt;br /&gt;
  with 1 2 show &amp;quot;False&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El lema anterior puede demostrarse más automáticamente como se muestra a&lt;br /&gt;
  continuación. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes x :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;x * x + y = 13&amp;quot; &lt;br /&gt;
      and 2: &amp;quot;y ≠ 4&amp;quot;&lt;br /&gt;
  shows &amp;quot;x ≠ 3&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
section {* Contradicciones *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Regla de contradicción:&lt;br /&gt;
  · FalseE: False ⟹ P&lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de uso de la regla de contradicción]&lt;br /&gt;
  Si 1=2, entonces 3=7.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;1 = (2::nat)&amp;quot;&lt;br /&gt;
  shows &amp;quot;3 = (7::nat)&amp;quot;&lt;br /&gt;
proof - &lt;br /&gt;
  have &amp;quot;False&amp;quot; using assms by simp&lt;br /&gt;
  thus &amp;quot;3 = (7::nat)&amp;quot; by (rule FalseE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El lema puede demostrarse automáticamente, como sigue.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;1 = (2::nat)&amp;quot;&lt;br /&gt;
  shows &amp;quot;3 = (7::nat)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Ejemplo de demostración por casos y contradicción]&lt;br /&gt;
     ¬P, P ∨ Q ⊢ Q&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma disjCE:&lt;br /&gt;
  assumes &amp;quot;¬P&amp;quot; and &amp;quot;P ∨ Q&amp;quot;&lt;br /&gt;
  shows &amp;quot;Q&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;Q&amp;quot; using `¬P` by contradiction&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;Q&amp;quot;&lt;br /&gt;
  thus &amp;quot;Q&amp;quot; by assumption&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Equivalencias *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Reglas de equivalencia:&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;
&lt;br /&gt;
  Lema. [Ejemplo de introducción de equivalencia]&lt;br /&gt;
  La fórmula &lt;br /&gt;
     (R ⟶ C) ∧ (S ⟶ C))&lt;br /&gt;
  es equivalente a &lt;br /&gt;
     R ∨ S ⟶ C&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;((R ⟶ C) ∧ (S ⟶ C)) = (R ∨ S ⟶ C)&amp;quot;&lt;br /&gt;
proof (rule iffI)&lt;br /&gt;
  assume &amp;quot;(R ⟶ C) ∧ (S ⟶ C)&amp;quot;&lt;br /&gt;
  thus &amp;quot;R ∨ S ⟶ C&amp;quot; by blast&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;R ∨ S ⟶ C&amp;quot;&lt;br /&gt;
  thus &amp;quot;(R ⟶ C) ∧ (S ⟶ C)&amp;quot; by blast&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  El método &amp;quot;blast&amp;quot;:&lt;br /&gt;
  En la demostración anterior es la primera vez que se usa el método de&lt;br /&gt;
  razonamiento automático &amp;quot;blast&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Nota. El lema anterior puede demostrarse automáticamente como se&lt;br /&gt;
  muestra a continuación.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;((R ⟶ C) ∧ (S ⟶ C)) = (R ∨ S ⟶ C)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Ejemplo de eliminación de equivalencia]&lt;br /&gt;
  · A ⟷ B, A ⊢ B&lt;br /&gt;
  · A ⟷ B, B ⊢ A&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma assumes &amp;quot;A = B&amp;quot; and &amp;quot;A&amp;quot; shows &amp;quot;B&amp;quot;&lt;br /&gt;
using assms &lt;br /&gt;
by (rule iffD1)&lt;br /&gt;
&lt;br /&gt;
lemma assumes &amp;quot;A = B&amp;quot; and &amp;quot;B&amp;quot; shows &amp;quot;A&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (rule iffD2)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=DAO2011_(Demostraci%C3%B3n_asistida_por_ordenador)&amp;diff=59</id>
		<title>DAO2011 (Demostración asistida por ordenador)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=DAO2011_(Demostraci%C3%B3n_asistida_por_ordenador)&amp;diff=59"/>
		<updated>2012-01-31T13:06:29Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Razonamiento automático (2011-12) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Demostración asistida por ordenador ==&lt;br /&gt;
Este curso es una introducción a la demostración asistida por ordenador usando el sistema [http://www.cl.cam.ac.uk/research/hvg/Isabelle Isabelle/HOL/Isar]). Los objetivos del curso son:&lt;br /&gt;
* desarrollar la capacidad de razonamiento lógico,&lt;br /&gt;
* conocer formalismos de representación del conocimiento matemático,&lt;br /&gt;
* saber usar sistemas de razonamiento y&lt;br /&gt;
* desarrollar teorías matemáticas en sistemas de demostración automática. &lt;br /&gt;
&lt;br /&gt;
Administrativamente, es un [http://www.cfp.us.es/web/ficha_avanzada.asp?id_titulo=846&amp;amp;tipo=FE&amp;amp;basica=1&amp;amp;curso=2010 curso de formación especializada] del [http://www.cfp.us.es/ Centro de Formación Permanente de la Universidad de Sevilla].&lt;br /&gt;
&lt;br /&gt;
== Material para el curso ==&lt;br /&gt;
* [[Temas]]: Teorías de los temas.&lt;br /&gt;
* [[Ejercicios]]: Relaciones de ejercicios.&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao/doc.html Documentación]: Enlaces con documentación.&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao/sistemas.html Sistemas]: Sistemas utilizados.&lt;br /&gt;
* [http://www.glc.us.es/~jalonso/vestigium/tag/dao2011/ Diario]: Descripción diaria de las clases.&lt;br /&gt;
&lt;br /&gt;
== Razonamiento automático (2011-12) ==&lt;br /&gt;
* [[Tema 6: Isabelle como un lenguaje funcional]].&lt;br /&gt;
* [[Tema 7: El lenguaje de demostración Isar]].&lt;br /&gt;
* [[Tema 8: Distinción de casos e inducción]].&lt;br /&gt;
* [[Tema 9: Patrones de demostración]].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_8:_Distinci%C3%B3n_de_casos_e_inducci%C3%B3n&amp;diff=58</id>
		<title>Tema 8: Distinción de casos e inducción</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_8:_Distinci%C3%B3n_de_casos_e_inducci%C3%B3n&amp;diff=58"/>
		<updated>2012-01-31T12:48:28Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 8: Distinción de casos e inducción *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_8&lt;br /&gt;
imports Main Parity&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Razonamiento por distinción de casos *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Distinción de casos booleanos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Demostración por distinción de casos booleanos]&lt;br /&gt;
     ¬A ∨ A&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;¬A ∨ A&amp;quot; &lt;br /&gt;
proof cases&lt;br /&gt;
  assume &amp;quot;A&amp;quot; thus ?thesis ..&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;¬A&amp;quot; thus ?thesis ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Demostración por distinción de casos booleanos nominados]&lt;br /&gt;
     ¬A ∨ A&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;¬A ∨ A&amp;quot; &lt;br /&gt;
proof (cases &amp;quot;A&amp;quot;)&lt;br /&gt;
  case True thus ?thesis ..&lt;br /&gt;
next&lt;br /&gt;
  case False thus ?thesis .. &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El método &amp;quot;cases&amp;quot; sobre una fórmula:&lt;br /&gt;
  · El método (cases F) es una abreviatura de la aplicación de la regla&lt;br /&gt;
       ⟦F ⟹ Q; ¬F ⟹ Q⟧ ⟹ Q  &lt;br /&gt;
  · La expresión &amp;quot;case True&amp;quot; es una abreviatura de F.&lt;br /&gt;
  · La expresión &amp;quot;case False&amp;quot; es una abreviatura de ¬F.&lt;br /&gt;
  · Ventajas de &amp;quot;cases&amp;quot; con nombre: &lt;br /&gt;
    · reduce la escritura de la fórmula y&lt;br /&gt;
    · es independiente del orden de los casos.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Distinción de casos sobre otros tipos de datos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Distinción de casos sobre listas]&lt;br /&gt;
  La longitud del resto de una lista es la longitud de la lista menos 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length(tl xs) = length xs - 1&amp;quot; &lt;br /&gt;
proof (cases xs)&lt;br /&gt;
  case Nil thus ?thesis by simp&lt;br /&gt;
next&lt;br /&gt;
  case Cons thus ?thesis by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Distinción de casos sobre listas:&lt;br /&gt;
  · El método de distinción de casos se activa con (cases xs) donde xs&lt;br /&gt;
    es del tipo lista. &lt;br /&gt;
  · &amp;quot;case Nil&amp;quot; es una abreviatura de &lt;br /&gt;
       &amp;quot;assume Nil: xs =[]&amp;quot;.&lt;br /&gt;
  · &amp;quot;case Cons&amp;quot; es una abreviatura de &lt;br /&gt;
       &amp;quot;fix ? ?? assume Cons: xs = ? # ??&amp;quot;&lt;br /&gt;
    donde ? y ?? son variables anónimas. &lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de análisis de casos]&lt;br /&gt;
  El resultado de eliminar los n+1 primeros elementos de xs es el mismo&lt;br /&gt;
  que eliminar los n primeros elementos del resto de xs.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;drop (n + 1) xs = drop n (tl xs)&amp;quot;&lt;br /&gt;
proof (cases xs)&lt;br /&gt;
  case Nil thus &amp;quot;drop (n + 1) xs = drop n (tl xs)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  case Cons thus &amp;quot;drop (n + 1) xs = drop n (tl xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La función drop está definida en la teoría List de forma que&lt;br /&gt;
  (drop n xs) la lista obtenida eliminando en xs} los n primeros&lt;br /&gt;
  elementos. Su definición es la siguiente  &lt;br /&gt;
     primrec drop:: &amp;quot;nat =&amp;gt; &amp;#039;a list =&amp;gt; &amp;#039;a list&amp;quot; where&lt;br /&gt;
     drop_Nil:  &amp;quot;drop n [] = []&amp;quot; |&lt;br /&gt;
     drop_Cons: &amp;quot;drop n (x#xs) = (case n of &lt;br /&gt;
                                    0 =&amp;gt; x#xs | &lt;br /&gt;
                                    Suc(m) =&amp;gt; drop m xs)&amp;quot;&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Inducción matemática *}&lt;br /&gt;
thm nat.induct&lt;br /&gt;
text {*&lt;br /&gt;
  [Principio de inducción matemática]&lt;br /&gt;
  Para demostrar una propiedad P para todos los números naturales basta&lt;br /&gt;
  probar que el 0 tiene la propiedad P y que si n tiene la propiedad P,&lt;br /&gt;
  entonces n+1 también la tiene. &lt;br /&gt;
     ⟦P 0; ⋀n. P n ⟹ P (Suc n)⟧ ⟹ P m&lt;br /&gt;
  &lt;br /&gt;
  Ejemplo de demostración por inducción: Usaremos el principio de&lt;br /&gt;
  inducción matemática para demostrar que &lt;br /&gt;
     1 + 3 + ... + (2n-1) = n^2&lt;br /&gt;
&lt;br /&gt;
  Definición. [Suma de los primeros impares] &lt;br /&gt;
  (suma_impares n) la suma de los n números impares.    &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec suma_impares :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
&amp;quot;suma_impares 0 = 0&amp;quot; |&lt;br /&gt;
&amp;quot;suma_impares (Suc n) = (2*(Suc n) - 1) + suma_impares n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Ejemplo de suma de impares]&lt;br /&gt;
  La suma de los 3 primeros números impares es 9.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares 2 = 4&amp;quot;&lt;br /&gt;
by (simp add: suma_impares_def)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La suma de los 3 primero número impares se puede calcular mediante &amp;quot;value&amp;quot;. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;suma_impares 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Ejemplo de demostración por inducción matemática]&lt;br /&gt;
  La suma de los n primeros números impares es n^2.&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática: Por inducción en n.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot;&lt;br /&gt;
by (induct n) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En la demostración &amp;quot;by (induct n) simp_all&amp;quot; se aplica inducción en n y&lt;br /&gt;
  los dos casos se prueban por simplificación.  &lt;br /&gt;
  &lt;br /&gt;
  Demostración del lema anterior usando patrones.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot; (is &amp;quot;?P n&amp;quot;)&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;?P 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n assume &amp;quot;?P n&amp;quot;&lt;br /&gt;
  thus &amp;quot;?P (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Patrones: Cualquier fórmula seguida de (is patrón) equipara el patrón&lt;br /&gt;
  con la fórmula.&lt;br /&gt;
&lt;br /&gt;
  Demostración del lema anterior con patrones y razonamiento ecuacional.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot; (is &amp;quot;?P n&amp;quot;)&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;?P 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n assume HI: &amp;quot;?P n&amp;quot;&lt;br /&gt;
  have &amp;quot;suma_impares (Suc n) = (2 * (Suc n) - 1) + suma_impares n&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (2 * (Suc n) - 1) + n * n&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;… = n * n + 2 * n + 1&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostración del lema anterior por inducción y razonamiento ecuacional.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;suma_impares 0 = 0 * 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n assume HI: &amp;quot;suma_impares n = n * n&amp;quot;&lt;br /&gt;
  have &amp;quot;suma_impares (Suc n) = (2 * (Suc n) - 1) + suma_impares n&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (2 * (Suc n) - 1) + n * n&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;… = n * n + 2 * n + 1&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;suma_impares (Suc n) = (Suc n) * (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición. [Números pares]&lt;br /&gt;
  Un número natural n es par si existe un natural m tal que n=m+m. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition par ::  &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;par n ≡ ∃m. n=m+m&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Ejemplo de inducción y existenciales]&lt;br /&gt;
  Para todo número natural n, se verifica que n*(n+1) par.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  shows &amp;quot;par (n*(n+1))&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;par (0*(0+1))&amp;quot; by (simp add:par_def)&lt;br /&gt;
next&lt;br /&gt;
  fix n assume &amp;quot;par (n*(n+1))&amp;quot;&lt;br /&gt;
  hence &amp;quot;∃m. n*(n+1) = m+m&amp;quot; by (simp add:par_def)&lt;br /&gt;
  then obtain m where m: &amp;quot;n*(n+1) = m+m&amp;quot; by (rule exE)&lt;br /&gt;
  hence &amp;quot;(Suc n)*((Suc n)+1) = (m+n+1)+(m+n+1)&amp;quot; by auto&lt;br /&gt;
  hence &amp;quot;∃m. (Suc n)*((Suc n)+1) = m+m&amp;quot; by (rule exI)&lt;br /&gt;
  thus &amp;quot;par ((Suc n)*((Suc n)+1))&amp;quot; by (simp add:par_def)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En Isabelle puede demostrarse de manera más simple un lema equivalente usando&lt;br /&gt;
  en lugar de la función &amp;quot;par&amp;quot; la función &amp;quot;even&amp;quot; definida en la teoría Parity.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  shows &amp;quot;even (n*(n+1))&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Para completar la demostración basta demostrar la equivalencia de las&lt;br /&gt;
  funciones &amp;quot;par&amp;quot; y &amp;quot;even&amp;quot;. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  shows &amp;quot;par n = even n&amp;quot;&lt;br /&gt;
proof - &lt;br /&gt;
  have &amp;quot;par n = (∃m. n = m+m)&amp;quot; by (simp add:par_def)&lt;br /&gt;
  thus &amp;quot;par n = even n&amp;quot; by presburger&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En la demostración anterior hemos usado la táctica &amp;quot;presburger&amp;quot; que&lt;br /&gt;
  corresponde a la aritmética de Presburger.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Inducción estructural *}&lt;br /&gt;
&lt;br /&gt;
thm list.induct&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Inducción estructural]&lt;br /&gt;
  · En Isabelle puede hacerse inducción estructural sobre cualquier tipo&lt;br /&gt;
    recursivo.&lt;br /&gt;
  · La inducción matemática es la inducción estructural sobre el tipo de&lt;br /&gt;
    los naturales.&lt;br /&gt;
  · El esquema de inducción estructural sobre listas es&lt;br /&gt;
    · list.induct: ⟦P []; ⋀x ys. P ys ⟹ P (x # ys)⟧ ⟹ P zs&lt;br /&gt;
  · Para demostrar una propiedad para todas las listas basta demostrar&lt;br /&gt;
    que la lista vacía tiene la propiedad y que al añadir un elemento a una&lt;br /&gt;
    lista que tiene la propiedad se obtiene una lista que también tiene la&lt;br /&gt;
    propiedad. &lt;br /&gt;
&lt;br /&gt;
  Concatenación de listas:&lt;br /&gt;
  En la teoría List.thy está definida la concatenación de listas (que&lt;br /&gt;
  se representa por @) como sigue&lt;br /&gt;
    primrec&lt;br /&gt;
      append_Nil:  &amp;quot;[]@ys = ys&amp;quot;&lt;br /&gt;
      append_Cons: &amp;quot;(x#xs)@ys = x#(xs@ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de inducción sobre listas]&lt;br /&gt;
  La concatenación de listas es asociativa.&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática del lema.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma conc_asociativa_1: &amp;quot;xs @ (ys @ zs) = (xs @ ys) @ zs&amp;quot;&lt;br /&gt;
by (induct xs) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostración estructurada del lema anterior.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma conc_asociativa: &amp;quot;xs @ (ys @ zs) = (xs @ ys) @ zs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;[] @ (ys @ zs) = ([] @ ys) @ zs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;[] @ (ys @ zs) = ys @ zs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = ([] @ ys) @ zs&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;xs @ (ys @ zs) = (xs @ ys) @ zs&amp;quot;&lt;br /&gt;
  show &amp;quot;(x#xs) @ (ys @ zs) = ((x#xs) @ ys) @ zs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;(x#xs) @ (ys @ zs) = x#(xs @ (ys @ zs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = x#((xs @ ys) @ zs)&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;… = (x#(xs @ ys)) @ zs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = ((x#xs) @ ys) @ zs&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [Árboles binarios]&lt;br /&gt;
  Definir un tipo de dato para los árboles binarios.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = Hoja &amp;quot;&amp;#039;a&amp;quot; &lt;br /&gt;
                  | Nodo &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;
text {* &lt;br /&gt;
  Ejercicio. [Imagen especular]&lt;br /&gt;
  Definir la función &amp;quot;espejo&amp;quot; que aplicada a un árbol devuelve su imagen&lt;br /&gt;
  especular.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;espejo (Hoja a) = (Hoja a)&amp;quot;&lt;br /&gt;
| &amp;quot;espejo (Nodo f x y) = (Nodo f (espejo y) (espejo x))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [La imagen especular es involutiva]&lt;br /&gt;
  Demostrar que la función &amp;quot;espejo&amp;quot; involutiva; es decir, para cualquier&lt;br /&gt;
  árbol t, se tiene que &lt;br /&gt;
     espejo (espejo(t)) = t.&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática del lema.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma espejo_involutiva_1: &amp;quot;espejo(espejo(t)) = t&amp;quot;&lt;br /&gt;
by (induct t) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostración estructurada del lema.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma espejo_involutiva: &amp;quot;espejo(espejo(t)) = t&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof (induct t)&lt;br /&gt;
  fix x :: &amp;#039;a show &amp;quot;?P (Hoja x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix t1 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h1: &amp;quot;?P t1&amp;quot;&lt;br /&gt;
  fix t2 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h2: &amp;quot;?P t2&amp;quot;&lt;br /&gt;
  fix x :: &amp;#039;a&lt;br /&gt;
  show &amp;quot;?P (Nodo x t1 t2)&amp;quot; &lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;espejo(espejo(Nodo x t1 t2)) = espejo(Nodo x (espejo t2) (espejo t1))&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = Nodo x (espejo (espejo t1)) (espejo (espejo t2))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = Nodo x t1 t2&amp;quot; using h1 h2 by simp &lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [Aplanamiento de árboles]&lt;br /&gt;
  Definir la función &amp;quot;aplana&amp;quot; que aplane los árboles recorriéndolos en&lt;br /&gt;
  orden infijo.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec aplana :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;aplana (Hoja a) = [a]&amp;quot;&lt;br /&gt;
| &amp;quot;aplana (Nodo x t1 t2) = (aplana t1)@[x]@(aplana t2)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [Aplanamiento de la imagen especular] Demostrar que&lt;br /&gt;
     aplana (espejo t) = rev (aplana t)&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática del lema.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (espejo t) = rev (aplana t)&amp;quot;&lt;br /&gt;
by (induct t) auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Demostración estructurada del lema anterior.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (espejo t) = rev (aplana t)&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof (induct t)&lt;br /&gt;
  fix x :: &amp;#039;a &lt;br /&gt;
  show &amp;quot;?P (Hoja x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix t1 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h1: &amp;quot;?P t1&amp;quot;&lt;br /&gt;
  fix t2 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h2: &amp;quot;?P t2&amp;quot;&lt;br /&gt;
  fix x :: &amp;#039;a&lt;br /&gt;
  show &amp;quot;?P (Nodo x t1 t2)&amp;quot; &lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;aplana (espejo (Nodo x t1 t2)) = &lt;br /&gt;
          aplana (Nodo x (espejo t2) (espejo t1))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (aplana(espejo t2))@[x]@(aplana(espejo t1))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (rev(aplana t2))@[x]@(rev(aplana t1))&amp;quot; using h1 h2 by simp&lt;br /&gt;
    also have &amp;quot;… = rev((aplana t1)@[x]@(aplana t2))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev(aplana (Nodo x t1 t2))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_8:_Distinci%C3%B3n_de_casos_e_inducci%C3%B3n&amp;diff=57</id>
		<title>Tema 8: Distinción de casos e inducción</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_8:_Distinci%C3%B3n_de_casos_e_inducci%C3%B3n&amp;diff=57"/>
		<updated>2012-01-31T12:43:08Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 8: Distinción de casos e inducción *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_8&lt;br /&gt;
imports Main Parity&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Razonamiento por distinción de casos *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Distinción de casos booleanos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Demostración por distinción de casos booleanos]&lt;br /&gt;
     ¬A ∨ A&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;¬A ∨ A&amp;quot; &lt;br /&gt;
proof cases&lt;br /&gt;
  assume &amp;quot;A&amp;quot; thus ?thesis ..&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;¬A&amp;quot; thus ?thesis ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Demostración por distinción de casos booleanos nominados]&lt;br /&gt;
     ¬A ∨ A&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;¬A ∨ A&amp;quot; &lt;br /&gt;
proof (cases &amp;quot;A&amp;quot;)&lt;br /&gt;
  case True thus ?thesis ..&lt;br /&gt;
next&lt;br /&gt;
  case False thus ?thesis .. &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El método &amp;quot;cases&amp;quot; sobre una fórmula:&lt;br /&gt;
  · El método (cases F) es una abreviatura de la aplicación de la regla&lt;br /&gt;
       ⟦F ⟹ Q; ¬F ⟹ Q⟧ ⟹ Q  &lt;br /&gt;
  · La expresión &amp;quot;case True&amp;quot; es una abreviatura de F.&lt;br /&gt;
  · La expresión &amp;quot;case False&amp;quot; es una abreviatura de ¬F.&lt;br /&gt;
  · Ventajas de &amp;quot;cases&amp;quot; con nombre: &lt;br /&gt;
    · reduce la escritura de la fórmula y&lt;br /&gt;
    · es independiente del orden de los casos.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Distinción de casos sobre otros tipos de datos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Distinción de casos sobre listas]&lt;br /&gt;
  La longitud del resto de una lista es la longitud de la lista menos 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length(tl xs) = length xs - 1&amp;quot; &lt;br /&gt;
proof (cases xs)&lt;br /&gt;
  case Nil thus ?thesis by simp&lt;br /&gt;
next&lt;br /&gt;
  case Cons thus ?thesis by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Distinción de casos sobre listas:&lt;br /&gt;
  · El método de distinción de casos se activa con (cases xs) donde xs&lt;br /&gt;
    es del tipo lista. &lt;br /&gt;
  · &amp;quot;case Nil&amp;quot; es una abreviatura de &lt;br /&gt;
       &amp;quot;assume Nil: xs =[]&amp;quot;.&lt;br /&gt;
  · &amp;quot;case Cons&amp;quot; es una abreviatura de &lt;br /&gt;
       &amp;quot;fix ? ?? assume Cons: xs = ? # ??&amp;quot;&lt;br /&gt;
    donde ? y ?? son variables anónimas. &lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de análisis de casos]&lt;br /&gt;
  El resultado de eliminar los n+1 primeros elementos de xs es el mismo&lt;br /&gt;
  que eliminar los n primeros elementos del resto de xs.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;drop (n + 1) xs = drop n (tl xs)&amp;quot;&lt;br /&gt;
proof (cases xs)&lt;br /&gt;
  case Nil thus &amp;quot;drop (n + 1) xs = drop n (tl xs)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  case Cons thus &amp;quot;drop (n + 1) xs = drop n (tl xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La función drop está definida en la teoría List de forma que&lt;br /&gt;
  (drop n xs) la lista obtenida eliminando en xs} los n primeros&lt;br /&gt;
  elementos. Su definición es la siguiente  &lt;br /&gt;
     primrec drop:: &amp;quot;nat =&amp;gt; &amp;#039;a list =&amp;gt; &amp;#039;a list&amp;quot; where&lt;br /&gt;
     drop_Nil:  &amp;quot;drop n [] = []&amp;quot; |&lt;br /&gt;
     drop_Cons: &amp;quot;drop n (x#xs) = (case n of &lt;br /&gt;
                                    0 =&amp;gt; x#xs | &lt;br /&gt;
                                    Suc(m) =&amp;gt; drop m xs)&amp;quot;&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Inducción matemática *}&lt;br /&gt;
thm nat.induct&lt;br /&gt;
text {*&lt;br /&gt;
  [Principio de inducción matemática]&lt;br /&gt;
  Para demostrar una propiedad P para todos los números naturales basta&lt;br /&gt;
  probar que el 0 tiene la propiedad P y que si n tiene la propiedad P,&lt;br /&gt;
  entonces n+1 también la tiene. &lt;br /&gt;
     ⟦P 0; ⋀n. P n ⟹ P (Suc n)⟧ ⟹ P m&lt;br /&gt;
  &lt;br /&gt;
  Ejemplo de demostración por inducción: Usaremos el principio de&lt;br /&gt;
  inducción matemática para demostrar que &lt;br /&gt;
     1 + 3 + ... + (2n-1) = n^2&lt;br /&gt;
&lt;br /&gt;
  Definición. [Suma de los primeros impares] &lt;br /&gt;
  (suma_impares n) la suma de los n números impares.    &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec suma_impares :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
&amp;quot;suma_impares 0 = 0&amp;quot; |&lt;br /&gt;
&amp;quot;suma_impares (Suc n) = (2*(Suc n) - 1) + suma_impares n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Ejemplo de suma de impares]&lt;br /&gt;
  La suma de los 3 primeros números impares es 9.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares 2 = 4&amp;quot;&lt;br /&gt;
by (simp add: suma_impares_def)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La suma de los 3 primero número impares se puede calcular mediante&lt;br /&gt;
  &amp;quot;value&amp;quot;. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;suma_impares 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Ejemplo de demostración por inducción matemática]&lt;br /&gt;
  La suma de los n primeros números impares es n^2.&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática: Por inducción en n.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot;&lt;br /&gt;
by (induct n) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En la demostración &amp;quot;by (induct n) simp_all&amp;quot; se aplica inducción en n y&lt;br /&gt;
  los dos casos se prueban por simplificación.  &lt;br /&gt;
  &lt;br /&gt;
  Demostración del lema anterior usando patrones.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot; (is &amp;quot;?P n&amp;quot;)&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;?P 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n assume &amp;quot;?P n&amp;quot;&lt;br /&gt;
  thus &amp;quot;?P (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Patrones: Cualquier fórmula seguida de (is patrón) equipara el patrón&lt;br /&gt;
  con la fórmula.&lt;br /&gt;
&lt;br /&gt;
  Demostración del lema anterior con patrones y razonamiento ecuacional.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot; (is &amp;quot;?P n&amp;quot;)&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;?P 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n assume HI: &amp;quot;?P n&amp;quot;&lt;br /&gt;
  have &amp;quot;suma_impares (Suc n) = (2 * (Suc n) - 1) + suma_impares n&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (2 * (Suc n) - 1) + n * n&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;… = n * n + 2 * n + 1&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostración del lema anterior por inducción y razonamiento ecuacional.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;suma_impares 0 = 0 * 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n assume HI: &amp;quot;suma_impares n = n * n&amp;quot;&lt;br /&gt;
  have &amp;quot;suma_impares (Suc n) = (2 * (Suc n) - 1) + suma_impares n&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (2 * (Suc n) - 1) + n * n&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;… = n * n + 2 * n + 1&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;suma_impares (Suc n) = (Suc n) * (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición. [Números pares]&lt;br /&gt;
  Un número natural n es par si existe un natural m tal que n=m+m. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition par ::  &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;par n ≡ ∃m. n=m+m&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Ejemplo de inducción y existenciales]&lt;br /&gt;
  Para todo número natural n, se verifica que n*(n+1) par.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  shows &amp;quot;par (n*(n+1))&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;par (0*(0+1))&amp;quot; by (simp add:par_def)&lt;br /&gt;
next&lt;br /&gt;
  fix n assume &amp;quot;par (n*(n+1))&amp;quot;&lt;br /&gt;
  hence &amp;quot;∃m. n*(n+1) = m+m&amp;quot; by (simp add:par_def)&lt;br /&gt;
  then obtain m where m: &amp;quot;n*(n+1) = m+m&amp;quot; by (rule exE)&lt;br /&gt;
  hence &amp;quot;(Suc n)*((Suc n)+1) = (m+n+1)+(m+n+1)&amp;quot; by auto&lt;br /&gt;
  hence &amp;quot;∃m. (Suc n)*((Suc n)+1) = m+m&amp;quot; by (rule exI)&lt;br /&gt;
  thus &amp;quot;par ((Suc n)*((Suc n)+1))&amp;quot; by (simp add:par_def)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En Isabelle puede demostrarse de manera más simple un lema equivalente usando&lt;br /&gt;
  en lugar de la función &amp;quot;par&amp;quot; la función &amp;quot;even&amp;quot; definida en la teoría Parity.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  shows &amp;quot;even (n*(n+1))&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Para completar la demostración basta demostrar la equivalencia de las&lt;br /&gt;
  funciones &amp;quot;par&amp;quot; y &amp;quot;even&amp;quot;. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  shows &amp;quot;par n = even n&amp;quot;&lt;br /&gt;
proof - &lt;br /&gt;
  have &amp;quot;par n = (∃m. n = m+m)&amp;quot; by (simp add:par_def)&lt;br /&gt;
  thus &amp;quot;par n = even n&amp;quot; by presburger&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En la demostración anterior hemos usado la táctica &amp;quot;presburger&amp;quot; que&lt;br /&gt;
  corresponde a la aritmética de Presburger.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Inducción estructural *}&lt;br /&gt;
&lt;br /&gt;
thm list.induct&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Inducción estructural]&lt;br /&gt;
  · En Isabelle puede hacerse inducción estructural sobre cualquier tipo&lt;br /&gt;
    recursivo.&lt;br /&gt;
  · La inducción matemática es la inducción estructural sobre el tipo de&lt;br /&gt;
    los naturales.&lt;br /&gt;
  · El esquema de inducción estructural sobre listas es&lt;br /&gt;
    · list.induct: ⟦P []; ⋀x ys. P ys ⟹ P (x # ys)⟧ ⟹ P zs&lt;br /&gt;
  · Para demostrar una propiedad para todas las listas basta demostrar&lt;br /&gt;
    que la lista vacía tiene la propiedad y que al añadir un elemento a una&lt;br /&gt;
    lista que tiene la propiedad se obtiene una lista que también tiene la&lt;br /&gt;
    propiedad. &lt;br /&gt;
&lt;br /&gt;
  Concatenación de listas:&lt;br /&gt;
  En la teoría List.thy está definida la concatenación de listas (que&lt;br /&gt;
  se representa por @) como sigue&lt;br /&gt;
    primrec&lt;br /&gt;
      append_Nil:  &amp;quot;[]@ys = ys&amp;quot;&lt;br /&gt;
      append_Cons: &amp;quot;(x#xs)@ys = x#(xs@ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de inducción sobre listas]&lt;br /&gt;
  La concatenación de listas es asociativa.&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática del lema.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma conc_asociativa_1: &amp;quot;xs @ (ys @ zs) = (xs @ ys) @ zs&amp;quot;&lt;br /&gt;
by (induct xs) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostración estructurada del lema anterior.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma conc_asociativa: &amp;quot;xs @ (ys @ zs) = (xs @ ys) @ zs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;[] @ (ys @ zs) = ([] @ ys) @ zs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;[] @ (ys @ zs) = ys @ zs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = ([] @ ys) @ zs&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;xs @ (ys @ zs) = (xs @ ys) @ zs&amp;quot;&lt;br /&gt;
  show &amp;quot;(x#xs) @ (ys @ zs) = ((x#xs) @ ys) @ zs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;(x#xs) @ (ys @ zs) = x#(xs @ (ys @ zs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = x#((xs @ ys) @ zs)&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;… = (x#(xs @ ys)) @ zs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = ((x#xs) @ ys) @ zs&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [Árboles binarios]&lt;br /&gt;
  Definir un tipo de dato para los árboles binarios.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = Hoja &amp;quot;&amp;#039;a&amp;quot; &lt;br /&gt;
                  | Nodo &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;
text {* &lt;br /&gt;
  Ejercicio. [Imagen especular]&lt;br /&gt;
  Definir la función &amp;quot;espejo&amp;quot; que aplicada a un árbol devuelve su imagen&lt;br /&gt;
  especular.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;espejo (Hoja a) = (Hoja a)&amp;quot;&lt;br /&gt;
| &amp;quot;espejo (Nodo f x y) = (Nodo f (espejo y) (espejo x))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [La imagen especular es involutiva] \label{espInv}&lt;br /&gt;
    Demostrar que la función @{term &amp;quot;espejo&amp;quot;} es involutiva; es decir, para&lt;br /&gt;
    cualquier árbol @{term &amp;quot;t&amp;quot;}, &lt;br /&gt;
    \newline \hspace*{1cm}&lt;br /&gt;
    @{term &amp;quot;espejo(espejo(t))=t&amp;quot;}.&lt;br /&gt;
  \end{ejercicio}&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
    Demostración automática de \ref{espInv}.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma espejo_involutiva_1: &amp;quot;espejo(espejo(t)) = t&amp;quot;&lt;br /&gt;
by (induct t) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  &lt;br /&gt;
    Demostración estructurada de \ref{espInv}.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma espejo_involutiva: &amp;quot;espejo(espejo(t)) = t&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof (induct t)&lt;br /&gt;
  fix x :: &amp;#039;a show &amp;quot;?P (Hoja x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix t1 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h1: &amp;quot;?P t1&amp;quot;&lt;br /&gt;
  fix t2 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h2: &amp;quot;?P t2&amp;quot;&lt;br /&gt;
  fix x :: &amp;#039;a&lt;br /&gt;
  show &amp;quot;?P (Nodo x t1 t2)&amp;quot; &lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;espejo(espejo(Nodo x t1 t2)) = espejo(Nodo x (espejo t2) (espejo t1))&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = Nodo x (espejo (espejo t1)) (espejo (espejo t2))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = Nodo x t1 t2&amp;quot; using h1 h2 by simp &lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [Aplanamiento de árboles]&lt;br /&gt;
    Definir la función @{term &amp;quot;aplana&amp;quot;} que aplane los árboles recorriéndolos en&lt;br /&gt;
    orden infijo. &lt;br /&gt;
  \end{ejercicio}&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec aplana :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;aplana (Hoja a) = [a]&amp;quot;&lt;br /&gt;
| &amp;quot;aplana (Nodo x t1 t2) = (aplana t1)@[x]@(aplana t2)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [Aplanamiento de la imagen especular]&lt;br /&gt;
     aplana (espejo t) = rev (aplana t)&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática del lema.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (espejo t) = rev (aplana t)&amp;quot;&lt;br /&gt;
by (induct t) auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Demostración estructurada del lema anterior.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (espejo t) = rev (aplana t)&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof (induct t)&lt;br /&gt;
  fix x :: &amp;#039;a &lt;br /&gt;
  show &amp;quot;?P (Hoja x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix t1 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h1: &amp;quot;?P t1&amp;quot;&lt;br /&gt;
  fix t2 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h2: &amp;quot;?P t2&amp;quot;&lt;br /&gt;
  fix x :: &amp;#039;a&lt;br /&gt;
  show &amp;quot;?P (Nodo x t1 t2)&amp;quot; &lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;aplana (espejo (Nodo x t1 t2)) = &lt;br /&gt;
          aplana (Nodo x (espejo t2) (espejo t1))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (aplana(espejo t2))@[x]@(aplana(espejo t1))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (rev(aplana t2))@[x]@(rev(aplana t1))&amp;quot; using h1 h2 by simp&lt;br /&gt;
    also have &amp;quot;… = rev((aplana t1)@[x]@(aplana t2))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev(aplana (Nodo x t1 t2))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_8:_Distinci%C3%B3n_de_casos_e_inducci%C3%B3n&amp;diff=56</id>
		<title>Tema 8: Distinción de casos e inducción</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_8:_Distinci%C3%B3n_de_casos_e_inducci%C3%B3n&amp;diff=56"/>
		<updated>2012-01-31T11:12:55Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 8: Distinción de casos e inducción *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_8&lt;br /&gt;
imports Main Parity&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Razonamiento por distinción de casos *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Distinción de casos booleanos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Demostración por distinción de casos booleanos]&lt;br /&gt;
     ¬A ∨ A&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;¬A ∨ A&amp;quot; &lt;br /&gt;
proof cases&lt;br /&gt;
  assume &amp;quot;A&amp;quot; thus ?thesis ..&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;¬A&amp;quot; thus ?thesis ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Demostración por distinción de casos booleanos nominados]&lt;br /&gt;
     ¬A ∨ A&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;¬A ∨ A&amp;quot; &lt;br /&gt;
proof (cases &amp;quot;A&amp;quot;)&lt;br /&gt;
  case True thus ?thesis ..&lt;br /&gt;
next&lt;br /&gt;
  case False thus ?thesis .. &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El método &amp;quot;cases&amp;quot; sobre una fórmula:&lt;br /&gt;
  · El método (cases F) es una abreviatura de la aplicación de la regla&lt;br /&gt;
       ⟦F ⟹ Q; ¬F ⟹ Q⟧ ⟹ Q  &lt;br /&gt;
  · La expresión &amp;quot;case True&amp;quot; es una abreviatura de F.&lt;br /&gt;
  · La expresión &amp;quot;case False&amp;quot; es una abreviatura de ¬F.&lt;br /&gt;
  · Ventajas de &amp;quot;cases&amp;quot; con nombre: &lt;br /&gt;
    · reduce la escritura de la fórmula y&lt;br /&gt;
    · es independiente del orden de los casos.&lt;br /&gt;
  \end{nota} &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Distinción de casos sobre otros tipos de datos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Distinción de casos sobre listas]&lt;br /&gt;
  La longitud del resto de una lista es la longitud de la lista menos 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length(tl xs) = length xs - 1&amp;quot; &lt;br /&gt;
proof (cases xs)&lt;br /&gt;
  case Nil thus ?thesis by simp&lt;br /&gt;
next&lt;br /&gt;
  case Cons thus ?thesis by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Distinción de casos sobre listas:&lt;br /&gt;
  · El método de distinción de casos se activa con (cases xs) donde xs&lt;br /&gt;
    es del tipo lista. &lt;br /&gt;
  · &amp;quot;case Nil&amp;quot; es una abreviatura de &lt;br /&gt;
       &amp;quot;assume Nil: xs =[]&amp;quot;.&lt;br /&gt;
  · &amp;quot;case Cons&amp;quot; es una abreviatura de &lt;br /&gt;
       &amp;quot;fix ? ?? assume Cons: xs = ? # ??&amp;quot;&lt;br /&gt;
    donde ? y ?? son variables anónimas. &lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de análisis de casos]&lt;br /&gt;
  El resultado de eliminar los n+1 primeros elementos de xs es el mismo&lt;br /&gt;
  que eliminar los n primeros elementos del resto de xs.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;drop (n + 1) xs = drop n (tl xs)&amp;quot;&lt;br /&gt;
proof (cases xs)&lt;br /&gt;
  case Nil thus &amp;quot;drop (n + 1) xs = drop n (tl xs)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  case Cons thus &amp;quot;drop (n + 1) xs = drop n (tl xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La función drop está definida en la teoría List de forma que&lt;br /&gt;
  (drop n xs) la lista obtenida eliminando en xs} los n primeros&lt;br /&gt;
  elementos. Su definición es la siguiente  &lt;br /&gt;
     primrec drop:: &amp;quot;nat =&amp;gt; &amp;#039;a list =&amp;gt; &amp;#039;a list&amp;quot; where&lt;br /&gt;
     drop_Nil:  &amp;quot;drop n [] = []&amp;quot; |&lt;br /&gt;
     drop_Cons: &amp;quot;drop n (x#xs) = (case n of &lt;br /&gt;
                                    0 =&amp;gt; x#xs | &lt;br /&gt;
                                    Suc(m) =&amp;gt; drop m xs)&amp;quot;&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Inducción matemática *}&lt;br /&gt;
thm nat.induct&lt;br /&gt;
text {*&lt;br /&gt;
  [Principio de inducción matemática]&lt;br /&gt;
  Para demostrar una propiedad P para todos los números naturales basta&lt;br /&gt;
  probar que el 0 tiene la propiedad P y que si n tiene la propiedad P,&lt;br /&gt;
  entonces n+1 también la tiene. &lt;br /&gt;
     ⟦P 0; ⋀n. P n ⟹ P (Suc n)⟧ ⟹ P m&lt;br /&gt;
  &lt;br /&gt;
  Ejemplo de demostración por inducción: Usaremos el principio de&lt;br /&gt;
  inducción matemática para demostrar que &lt;br /&gt;
     1 + 3 + ... + (2n-1) = n^2&lt;br /&gt;
&lt;br /&gt;
  Definición. [Suma de los primeros impares] &lt;br /&gt;
  (suma_impares n) la suma de los n números impares.    &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec suma_impares :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
&amp;quot;suma_impares 0 = 0&amp;quot; |&lt;br /&gt;
&amp;quot;suma_impares (Suc n) = (2*(Suc n) - 1) + suma_impares n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Ejemplo de suma de impares]&lt;br /&gt;
  La suma de los 3 primeros números impares es 9.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares 2 = 4&amp;quot;&lt;br /&gt;
by (simp add: suma_impares_def)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La suma de los 3 primero número impares se puede calcular mediante&lt;br /&gt;
  &amp;quot;value&amp;quot;. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;suma_impares 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Ejemplo de demostración por inducción matemática]&lt;br /&gt;
  La suma de los n primeros números impares es n^2.&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática: Por inducción en n.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot;&lt;br /&gt;
by (induct n) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En la demostración &amp;quot;by (induct n) simp_all&amp;quot; se aplica inducción en n y&lt;br /&gt;
  los dos casos se prueban por simplificación.  &lt;br /&gt;
  &lt;br /&gt;
  Demostración del lema anterior usando patrones.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot; (is &amp;quot;?P n&amp;quot;)&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;?P 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n assume &amp;quot;?P n&amp;quot;&lt;br /&gt;
  thus &amp;quot;?P (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Patrones: Cualquier fórmula seguida de (is patrón) equipara el patrón&lt;br /&gt;
  con la fórmula.&lt;br /&gt;
&lt;br /&gt;
  Demostración del lema anterior con patrones y razonamiento ecuacional.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot; (is &amp;quot;?P n&amp;quot;)&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;?P 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n assume HI: &amp;quot;?P n&amp;quot;&lt;br /&gt;
  have &amp;quot;suma_impares (Suc n) = (2 * (Suc n) - 1) + suma_impares n&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (2 * (Suc n) - 1) + n * n&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;… = n * n + 2 * n + 1&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostración del lema anterior por inducción y razonamiento ecuacional.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;suma_impares 0 = 0 * 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n assume HI: &amp;quot;suma_impares n = n * n&amp;quot;&lt;br /&gt;
  have &amp;quot;suma_impares (Suc n) = (2 * (Suc n) - 1) + suma_impares n&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (2 * (Suc n) - 1) + n * n&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;… = n * n + 2 * n + 1&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;suma_impares (Suc n) = (Suc n) * (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición. [Números pares]&lt;br /&gt;
  Un número natural n es par si existe un natural m tal que n=m+m. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition par ::  &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;par n ≡ ∃m. n=m+m&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Ejemplo de inducción y existenciales]&lt;br /&gt;
  Para todo número natural n, se verifica que n*(n+1) par.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  shows &amp;quot;par (n*(n+1))&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;par (0*(0+1))&amp;quot; by (simp add:par_def)&lt;br /&gt;
next&lt;br /&gt;
  fix n assume &amp;quot;par (n*(n+1))&amp;quot;&lt;br /&gt;
  hence &amp;quot;∃m. n*(n+1) = m+m&amp;quot; by (simp add:par_def)&lt;br /&gt;
  then obtain m where m: &amp;quot;n*(n+1) = m+m&amp;quot; by (rule exE)&lt;br /&gt;
  hence &amp;quot;(Suc n)*((Suc n)+1) = (m+n+1)+(m+n+1)&amp;quot; by auto&lt;br /&gt;
  hence &amp;quot;∃m. (Suc n)*((Suc n)+1) = m+m&amp;quot; by (rule exI)&lt;br /&gt;
  thus &amp;quot;par ((Suc n)*((Suc n)+1))&amp;quot; by (simp add:par_def)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En Isabelle puede demostrarse de manera más simple un lema equivalente usando&lt;br /&gt;
  en lugar de la función &amp;quot;par&amp;quot; la función &amp;quot;even&amp;quot; definida en la teoría Parity.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  shows &amp;quot;even (n*(n+1))&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Para completar la demostración basta demostrar la equivalencia de las&lt;br /&gt;
  funciones &amp;quot;par&amp;quot; y &amp;quot;even&amp;quot;. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  shows &amp;quot;par n = even n&amp;quot;&lt;br /&gt;
proof - &lt;br /&gt;
  have &amp;quot;par n = (∃m. n = m+m)&amp;quot; by (simp add:par_def)&lt;br /&gt;
  thus &amp;quot;par n = even n&amp;quot; by presburger&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En la demostración anterior hemos usado la táctica &amp;quot;presburger&amp;quot; que&lt;br /&gt;
  corresponde a la aritmética de Presburger.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Inducción estructural *}&lt;br /&gt;
&lt;br /&gt;
thm list.induct&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Inducción estructural]&lt;br /&gt;
  · En Isabelle puede hacerse inducción estructural sobre cualquier tipo&lt;br /&gt;
    recursivo.&lt;br /&gt;
  · La inducción matemática es la inducción estructural sobre el tipo de&lt;br /&gt;
    los naturales.&lt;br /&gt;
  · El esquema de inducción estructural sobre listas es&lt;br /&gt;
    · list.induct: ⟦P []; ⋀x ys. P ys ⟹ P (x # ys)⟧ ⟹ P zs&lt;br /&gt;
  · Para demostrar una propiedad para todas las listas basta demostrar&lt;br /&gt;
    que la lista vacía tiene la propiedad y que al añadir un elemento a una&lt;br /&gt;
    lista que tiene la propiedad se obtiene una lista que también tiene la&lt;br /&gt;
    propiedad. &lt;br /&gt;
&lt;br /&gt;
  Concatenación de listas:&lt;br /&gt;
  En la teoría List.thy está definida la concatenación de listas (que&lt;br /&gt;
  se representa por @) como sigue&lt;br /&gt;
    primrec&lt;br /&gt;
      append_Nil:  &amp;quot;[]@ys = ys&amp;quot;&lt;br /&gt;
      append_Cons: &amp;quot;(x#xs)@ys = x#(xs@ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de inducción sobre listas]&lt;br /&gt;
  La concatenación de listas es asociativa.&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática del lema.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma conc_asociativa_1: &amp;quot;xs @ (ys @ zs) = (xs @ ys) @ zs&amp;quot;&lt;br /&gt;
by (induct xs) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostración estructurada del lema anterior.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma conc_asociativa: &amp;quot;xs @ (ys @ zs) = (xs @ ys) @ zs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;[] @ (ys @ zs) = ([] @ ys) @ zs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;[] @ (ys @ zs) = ys @ zs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = ([] @ ys) @ zs&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;xs @ (ys @ zs) = (xs @ ys) @ zs&amp;quot;&lt;br /&gt;
  show &amp;quot;(x#xs) @ (ys @ zs) = ((x#xs) @ ys) @ zs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;(x#xs) @ (ys @ zs) = x#(xs @ (ys @ zs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = x#((xs @ ys) @ zs)&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;… = (x#(xs @ ys)) @ zs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = ((x#xs) @ ys) @ zs&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [Árboles binarios]&lt;br /&gt;
  Definir un tipo de dato para los árboles binarios.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = Hoja &amp;quot;&amp;#039;a&amp;quot; &lt;br /&gt;
                  | Nodo &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;
text {* &lt;br /&gt;
  Ejercicio. [Imagen especular]&lt;br /&gt;
  Definir la función &amp;quot;espejo&amp;quot; que aplicada a un árbol devuelve su imagen&lt;br /&gt;
  especular.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;espejo (Hoja a) = (Hoja a)&amp;quot;&lt;br /&gt;
| &amp;quot;espejo (Nodo f x y) = (Nodo f (espejo y) (espejo x))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [La imagen especular es involutiva] \label{espInv}&lt;br /&gt;
    Demostrar que la función @{term &amp;quot;espejo&amp;quot;} es involutiva; es decir, para&lt;br /&gt;
    cualquier árbol @{term &amp;quot;t&amp;quot;}, &lt;br /&gt;
    \newline \hspace*{1cm}&lt;br /&gt;
    @{term &amp;quot;espejo(espejo(t))=t&amp;quot;}.&lt;br /&gt;
  \end{ejercicio}&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
    Demostración automática de \ref{espInv}.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma espejo_involutiva_1: &amp;quot;espejo(espejo(t)) = t&amp;quot;&lt;br /&gt;
by (induct t) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  &lt;br /&gt;
    Demostración estructurada de \ref{espInv}.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma espejo_involutiva: &amp;quot;espejo(espejo(t)) = t&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof (induct t)&lt;br /&gt;
  fix x :: &amp;#039;a show &amp;quot;?P (Hoja x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix t1 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h1: &amp;quot;?P t1&amp;quot;&lt;br /&gt;
  fix t2 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h2: &amp;quot;?P t2&amp;quot;&lt;br /&gt;
  fix x :: &amp;#039;a&lt;br /&gt;
  show &amp;quot;?P (Nodo x t1 t2)&amp;quot; &lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;espejo(espejo(Nodo x t1 t2)) = espejo(Nodo x (espejo t2) (espejo t1))&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = Nodo x (espejo (espejo t1)) (espejo (espejo t2))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = Nodo x t1 t2&amp;quot; using h1 h2 by simp &lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [Aplanamiento de árboles]&lt;br /&gt;
    Definir la función @{term &amp;quot;aplana&amp;quot;} que aplane los árboles recorriéndolos en&lt;br /&gt;
    orden infijo. &lt;br /&gt;
  \end{ejercicio}&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec aplana :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;aplana (Hoja a) = [a]&amp;quot;&lt;br /&gt;
| &amp;quot;aplana (Nodo x t1 t2) = (aplana t1)@[x]@(aplana t2)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [Aplanamiento de la imagen especular]&lt;br /&gt;
     aplana (espejo t) = rev (aplana t)&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática del lema.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (espejo t) = rev (aplana t)&amp;quot;&lt;br /&gt;
by (induct t) auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Demostración estructurada del lema anterior.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (espejo t) = rev (aplana t)&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof (induct t)&lt;br /&gt;
  fix x :: &amp;#039;a &lt;br /&gt;
  show &amp;quot;?P (Hoja x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix t1 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h1: &amp;quot;?P t1&amp;quot;&lt;br /&gt;
  fix t2 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h2: &amp;quot;?P t2&amp;quot;&lt;br /&gt;
  fix x :: &amp;#039;a&lt;br /&gt;
  show &amp;quot;?P (Nodo x t1 t2)&amp;quot; &lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;aplana (espejo (Nodo x t1 t2)) = &lt;br /&gt;
          aplana (Nodo x (espejo t2) (espejo t1))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (aplana(espejo t2))@[x]@(aplana(espejo t1))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (rev(aplana t2))@[x]@(rev(aplana t1))&amp;quot; using h1 h2 by simp&lt;br /&gt;
    also have &amp;quot;… = rev((aplana t1)@[x]@(aplana t2))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev(aplana (Nodo x t1 t2))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_8:_Distinci%C3%B3n_de_casos_e_inducci%C3%B3n&amp;diff=55</id>
		<title>Tema 8: Distinción de casos e inducción</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_8:_Distinci%C3%B3n_de_casos_e_inducci%C3%B3n&amp;diff=55"/>
		<updated>2012-01-31T11:11:20Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; header {* Tema 8: Distinción de casos e inducción *}  theory Tema_8 imports Main Parity begin  section {* Razonamiento por distinción de casos *}  subsec...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 8: Distinción de casos e inducción *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_8&lt;br /&gt;
imports Main Parity&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Razonamiento por distinción de casos *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Distinción de casos booleanos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Demostración por distinción de casos booleanos]&lt;br /&gt;
     ¬A ∨ A&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;¬A ∨ A&amp;quot; &lt;br /&gt;
proof cases&lt;br /&gt;
  assume &amp;quot;A&amp;quot; thus ?thesis ..&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;¬A&amp;quot; thus ?thesis ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Demostración por distinción de casos booleanos nominados]&lt;br /&gt;
     ¬A ∨ A&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;¬A ∨ A&amp;quot; &lt;br /&gt;
proof (cases &amp;quot;A&amp;quot;)&lt;br /&gt;
  case True thus ?thesis ..&lt;br /&gt;
next&lt;br /&gt;
  case False thus ?thesis .. &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El método &amp;quot;cases&amp;quot; sobre una fórmula:&lt;br /&gt;
  · El método (cases F) es una abreviatura de la aplicación de la regla&lt;br /&gt;
       ⟦F ⟹ Q; ¬F ⟹ Q⟧ ⟹ Q  &lt;br /&gt;
  · La expresión &amp;quot;case True&amp;quot; es una abreviatura de F.&lt;br /&gt;
  · La expresión &amp;quot;case False&amp;quot; es una abreviatura de ¬F.&lt;br /&gt;
  · Ventajas de &amp;quot;cases&amp;quot; con nombre: &lt;br /&gt;
    · reduce la escritura de la fórmula y&lt;br /&gt;
    · es independiente del orden de los casos.&lt;br /&gt;
  \end{nota} &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Distinción de casos sobre otros tipos de datos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Distinción de casos sobre listas]&lt;br /&gt;
  La longitud del resto de una lista es la longitud de la lista menos 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length(tl xs) = length xs - 1&amp;quot; &lt;br /&gt;
proof (cases xs)&lt;br /&gt;
  case Nil thus ?thesis by simp&lt;br /&gt;
next&lt;br /&gt;
  case Cons thus ?thesis by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Distinción de casos sobre listas:&lt;br /&gt;
  · El método de distinción de casos se activa con (cases xs) donde xs&lt;br /&gt;
    es del tipo lista. &lt;br /&gt;
  · &amp;quot;case Nil&amp;quot; es una abreviatura de &lt;br /&gt;
       &amp;quot;assume Nil: xs =[]&amp;quot;.&lt;br /&gt;
  · &amp;quot;case Cons&amp;quot; es una abreviatura de &lt;br /&gt;
       &amp;quot;fix ? ?? assume Cons: xs = ? # ??&amp;quot;&lt;br /&gt;
    donde ? y ?? son variables anónimas. &lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de análisis de casos]&lt;br /&gt;
  El resultado de eliminar los n+1 primeros elementos de xs es el mismo&lt;br /&gt;
  que eliminar los n primeros elementos del resto de xs.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;drop (n + 1) xs = drop n (tl xs)&amp;quot;&lt;br /&gt;
proof (cases xs)&lt;br /&gt;
  case Nil thus &amp;quot;drop (n + 1) xs = drop n (tl xs)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  case Cons thus &amp;quot;drop (n + 1) xs = drop n (tl xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La función drop está definida en la teoría List de forma que&lt;br /&gt;
  (drop n xs) la lista obtenida eliminando en xs} los n primeros&lt;br /&gt;
  elementos. Su definición es la siguiente  &lt;br /&gt;
     primrec drop:: &amp;quot;nat =&amp;gt; &amp;#039;a list =&amp;gt; &amp;#039;a list&amp;quot; where&lt;br /&gt;
     drop_Nil:  &amp;quot;drop n [] = []&amp;quot; |&lt;br /&gt;
     drop_Cons: &amp;quot;drop n (x#xs) = (case n of &lt;br /&gt;
                                    0 =&amp;gt; x#xs | &lt;br /&gt;
                                    Suc(m) =&amp;gt; drop m xs)&amp;quot;&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Inducción matemática *}&lt;br /&gt;
thm nat.induct&lt;br /&gt;
text {*&lt;br /&gt;
  [Principio de inducción matemática]&lt;br /&gt;
  Para demostrar una propiedad P para todos los números naturales basta&lt;br /&gt;
  probar que el 0 tiene la propiedad P y que si n tiene la propiedad P,&lt;br /&gt;
  entonces n+1 también la tiene. &lt;br /&gt;
     ⟦P 0; ⋀n. P n ⟹ P (Suc n)⟧ ⟹ P m&lt;br /&gt;
  &lt;br /&gt;
  Ejemplo de demostración por inducción: Usaremos el principio de&lt;br /&gt;
  inducción matemática para demostrar que &lt;br /&gt;
     1 + 3 + ... + (2n-1) = n^2&lt;br /&gt;
&lt;br /&gt;
  Definición. [Suma de los primeros impares] &lt;br /&gt;
  (suma_impares n) la suma de los n números impares.    &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec suma_impares :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
&amp;quot;suma_impares 0 = 0&amp;quot; |&lt;br /&gt;
&amp;quot;suma_impares (Suc n) = (2*(Suc n) - 1) + suma_impares n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Ejemplo de suma de impares]&lt;br /&gt;
  La suma de los 3 primeros números impares es 9.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares 2 = 4&amp;quot;&lt;br /&gt;
by (simp add: suma_impares_def)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
    La suma de los 3 primero número impares se puede calcular mediante&lt;br /&gt;
    &amp;quot;value&amp;quot;. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;suma_impares 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Ejemplo de demostración por inducción matemática]&lt;br /&gt;
  La suma de los n primeros números impares es n^2.&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática: Por inducción en n.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot;&lt;br /&gt;
by (induct n) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En la demostración &amp;quot;by (induct n) simp_all&amp;quot; se aplica inducción en n y&lt;br /&gt;
  los dos casos se prueban por simplificación.  &lt;br /&gt;
  &lt;br /&gt;
  Demostración del lema anterior usando patrones.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot; (is &amp;quot;?P n&amp;quot;)&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;?P 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n assume &amp;quot;?P n&amp;quot;&lt;br /&gt;
  thus &amp;quot;?P (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Patrones: Cualquier fórmula seguida de (is patrón) equipara el patrón&lt;br /&gt;
  con la fórmula.&lt;br /&gt;
&lt;br /&gt;
  Demostración del lema anterior con patrones y razonamiento ecuacional.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot; (is &amp;quot;?P n&amp;quot;)&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;?P 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n assume HI: &amp;quot;?P n&amp;quot;&lt;br /&gt;
  have &amp;quot;suma_impares (Suc n) = (2 * (Suc n) - 1) + suma_impares n&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (2 * (Suc n) - 1) + n * n&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;… = n * n + 2 * n + 1&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostración del lema anterior por inducción y razonamiento ecuacional.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma_impares n = n * n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;suma_impares 0 = 0 * 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n assume HI: &amp;quot;suma_impares n = n * n&amp;quot;&lt;br /&gt;
  have &amp;quot;suma_impares (Suc n) = (2 * (Suc n) - 1) + suma_impares n&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (2 * (Suc n) - 1) + n * n&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;… = n * n + 2 * n + 1&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;suma_impares (Suc n) = (Suc n) * (Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición. [Números pares]&lt;br /&gt;
  Un número natural n es par si existe un natural m tal que n=m+m. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition par ::  &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;par n ≡ ∃m. n=m+m&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Ejemplo de inducción y existenciales]&lt;br /&gt;
  Para todo número natural n, se verifica que n*(n+1) par.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  shows &amp;quot;par (n*(n+1))&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;par (0*(0+1))&amp;quot; by (simp add:par_def)&lt;br /&gt;
next&lt;br /&gt;
  fix n assume &amp;quot;par (n*(n+1))&amp;quot;&lt;br /&gt;
  hence &amp;quot;∃m. n*(n+1) = m+m&amp;quot; by (simp add:par_def)&lt;br /&gt;
  then obtain m where m: &amp;quot;n*(n+1) = m+m&amp;quot; by (rule exE)&lt;br /&gt;
  hence &amp;quot;(Suc n)*((Suc n)+1) = (m+n+1)+(m+n+1)&amp;quot; by auto&lt;br /&gt;
  hence &amp;quot;∃m. (Suc n)*((Suc n)+1) = m+m&amp;quot; by (rule exI)&lt;br /&gt;
  thus &amp;quot;par ((Suc n)*((Suc n)+1))&amp;quot; by (simp add:par_def)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En Isabelle puede demostrarse de manera más simple un lema equivalente usando&lt;br /&gt;
  en lugar de la función &amp;quot;par&amp;quot; la función &amp;quot;even&amp;quot; definida en la teoría Parity.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  shows &amp;quot;even (n*(n+1))&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Para completar la demostración basta demostrar la equivalencia de las&lt;br /&gt;
  funciones &amp;quot;par&amp;quot; y &amp;quot;even&amp;quot;. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  shows &amp;quot;par n = even n&amp;quot;&lt;br /&gt;
proof - &lt;br /&gt;
  have &amp;quot;par n = (∃m. n = m+m)&amp;quot; by (simp add:par_def)&lt;br /&gt;
  thus &amp;quot;par n = even n&amp;quot; by presburger&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En la demostración anterior hemos usado la táctica &amp;quot;presburger&amp;quot; que&lt;br /&gt;
  corresponde a la aritmética de Presburger.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Inducción estructural *}&lt;br /&gt;
&lt;br /&gt;
thm list.induct&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Inducción estructural]&lt;br /&gt;
  · En Isabelle puede hacerse inducción estructural sobre cualquier tipo&lt;br /&gt;
    recursivo.&lt;br /&gt;
  · La inducción matemática es la inducción estructural sobre el tipo de&lt;br /&gt;
    los naturales.&lt;br /&gt;
  · El esquema de inducción estructural sobre listas es&lt;br /&gt;
    · list.induct: ⟦P []; ⋀x ys. P ys ⟹ P (x # ys)⟧ ⟹ P zs&lt;br /&gt;
  · Para demostrar una propiedad para todas las listas basta demostrar&lt;br /&gt;
    que la lista vacía tiene la propiedad y que al añadir un elemento a una&lt;br /&gt;
    lista que tiene la propiedad se obtiene una lista que también tiene la&lt;br /&gt;
    propiedad. &lt;br /&gt;
&lt;br /&gt;
  Concatenación de listas:&lt;br /&gt;
  En la teoría List.thy está definida la concatenación de listas (que&lt;br /&gt;
  se representa por @) como sigue&lt;br /&gt;
    primrec&lt;br /&gt;
      append_Nil:  &amp;quot;[]@ys = ys&amp;quot;&lt;br /&gt;
      append_Cons: &amp;quot;(x#xs)@ys = x#(xs@ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de inducción sobre listas]&lt;br /&gt;
  La concatenación de listas es asociativa.&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática del lema.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma conc_asociativa_1: &amp;quot;xs @ (ys @ zs) = (xs @ ys) @ zs&amp;quot;&lt;br /&gt;
by (induct xs) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostración estructurada del lema anterior.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma conc_asociativa: &amp;quot;xs @ (ys @ zs) = (xs @ ys) @ zs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;[] @ (ys @ zs) = ([] @ ys) @ zs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;[] @ (ys @ zs) = ys @ zs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = ([] @ ys) @ zs&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;xs @ (ys @ zs) = (xs @ ys) @ zs&amp;quot;&lt;br /&gt;
  show &amp;quot;(x#xs) @ (ys @ zs) = ((x#xs) @ ys) @ zs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;(x#xs) @ (ys @ zs) = x#(xs @ (ys @ zs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = x#((xs @ ys) @ zs)&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;… = (x#(xs @ ys)) @ zs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = ((x#xs) @ ys) @ zs&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [Árboles binarios]&lt;br /&gt;
  Definir un tipo de dato para los árboles binarios.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = Hoja &amp;quot;&amp;#039;a&amp;quot; &lt;br /&gt;
                  | Nodo &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;
text {* &lt;br /&gt;
  Ejercicio. [Imagen especular]&lt;br /&gt;
  Definir la función &amp;quot;espejo&amp;quot; que aplicada a un árbol devuelve su imagen&lt;br /&gt;
  especular.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;espejo (Hoja a) = (Hoja a)&amp;quot;&lt;br /&gt;
| &amp;quot;espejo (Nodo f x y) = (Nodo f (espejo y) (espejo x))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [La imagen especular es involutiva] \label{espInv}&lt;br /&gt;
    Demostrar que la función @{term &amp;quot;espejo&amp;quot;} es involutiva; es decir, para&lt;br /&gt;
    cualquier árbol @{term &amp;quot;t&amp;quot;}, &lt;br /&gt;
    \newline \hspace*{1cm}&lt;br /&gt;
    @{term &amp;quot;espejo(espejo(t))=t&amp;quot;}.&lt;br /&gt;
  \end{ejercicio}&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
    Demostración automática de \ref{espInv}.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma espejo_involutiva_1: &amp;quot;espejo(espejo(t)) = t&amp;quot;&lt;br /&gt;
by (induct t) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  &lt;br /&gt;
    Demostración estructurada de \ref{espInv}.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma espejo_involutiva: &amp;quot;espejo(espejo(t)) = t&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof (induct t)&lt;br /&gt;
  fix x :: &amp;#039;a show &amp;quot;?P (Hoja x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix t1 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h1: &amp;quot;?P t1&amp;quot;&lt;br /&gt;
  fix t2 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h2: &amp;quot;?P t2&amp;quot;&lt;br /&gt;
  fix x :: &amp;#039;a&lt;br /&gt;
  show &amp;quot;?P (Nodo x t1 t2)&amp;quot; &lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;espejo(espejo(Nodo x t1 t2)) = espejo(Nodo x (espejo t2) (espejo t1))&amp;quot;&lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = Nodo x (espejo (espejo t1)) (espejo (espejo t2))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = Nodo x t1 t2&amp;quot; using h1 h2 by simp &lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [Aplanamiento de árboles]&lt;br /&gt;
    Definir la función @{term &amp;quot;aplana&amp;quot;} que aplane los árboles recorriéndolos en&lt;br /&gt;
    orden infijo. &lt;br /&gt;
  \end{ejercicio}&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec aplana :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;aplana (Hoja a) = [a]&amp;quot;&lt;br /&gt;
| &amp;quot;aplana (Nodo x t1 t2) = (aplana t1)@[x]@(aplana t2)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio. [Aplanamiento de la imagen especular]&lt;br /&gt;
     aplana (espejo t) = rev (aplana t)&lt;br /&gt;
  &lt;br /&gt;
  Demostración automática del lema.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (espejo t) = rev (aplana t)&amp;quot;&lt;br /&gt;
by (induct t) auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Demostración estructurada del lema anterior.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;aplana (espejo t) = rev (aplana t)&amp;quot; (is &amp;quot;?P t&amp;quot;)&lt;br /&gt;
proof (induct t)&lt;br /&gt;
  fix x :: &amp;#039;a &lt;br /&gt;
  show &amp;quot;?P (Hoja x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix t1 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h1: &amp;quot;?P t1&amp;quot;&lt;br /&gt;
  fix t2 :: &amp;quot;&amp;#039;a arbol&amp;quot; assume h2: &amp;quot;?P t2&amp;quot;&lt;br /&gt;
  fix x :: &amp;#039;a&lt;br /&gt;
  show &amp;quot;?P (Nodo x t1 t2)&amp;quot; &lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;aplana (espejo (Nodo x t1 t2)) = &lt;br /&gt;
          aplana (Nodo x (espejo t2) (espejo t1))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (aplana(espejo t2))@[x]@(aplana(espejo t1))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (rev(aplana t2))@[x]@(rev(aplana t1))&amp;quot; using h1 h2 by simp&lt;br /&gt;
    also have &amp;quot;… = rev((aplana t1)@[x]@(aplana t2))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev(aplana (Nodo x t1 t2))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=DAO2011_(Demostraci%C3%B3n_asistida_por_ordenador)&amp;diff=54</id>
		<title>DAO2011 (Demostración asistida por ordenador)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=DAO2011_(Demostraci%C3%B3n_asistida_por_ordenador)&amp;diff=54"/>
		<updated>2012-01-31T11:10:11Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Razonamiento automático (2011-12) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Demostración asistida por ordenador ==&lt;br /&gt;
Este curso es una introducción a la demostración asistida por ordenador usando el sistema [http://www.cl.cam.ac.uk/research/hvg/Isabelle Isabelle/HOL/Isar]). Los objetivos del curso son:&lt;br /&gt;
* desarrollar la capacidad de razonamiento lógico,&lt;br /&gt;
* conocer formalismos de representación del conocimiento matemático,&lt;br /&gt;
* saber usar sistemas de razonamiento y&lt;br /&gt;
* desarrollar teorías matemáticas en sistemas de demostración automática. &lt;br /&gt;
&lt;br /&gt;
Administrativamente, es un [http://www.cfp.us.es/web/ficha_avanzada.asp?id_titulo=846&amp;amp;tipo=FE&amp;amp;basica=1&amp;amp;curso=2010 curso de formación especializada] del [http://www.cfp.us.es/ Centro de Formación Permanente de la Universidad de Sevilla].&lt;br /&gt;
&lt;br /&gt;
== Material para el curso ==&lt;br /&gt;
* [[Temas]]: Teorías de los temas.&lt;br /&gt;
* [[Ejercicios]]: Relaciones de ejercicios.&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao/doc.html Documentación]: Enlaces con documentación.&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao/sistemas.html Sistemas]: Sistemas utilizados.&lt;br /&gt;
* [http://www.glc.us.es/~jalonso/vestigium/tag/dao2011/ Diario]: Descripción diaria de las clases.&lt;br /&gt;
&lt;br /&gt;
== Razonamiento automático (2011-12) ==&lt;br /&gt;
* [[Tema 6: Isabelle como un lenguaje funcional]].&lt;br /&gt;
* [[Tema 7: El lenguaje de demostración Isar]].&lt;br /&gt;
* [[Tema 8: Distinción de casos e inducción]].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_7:_El_lenguaje_de_demostraci%C3%B3n_Isar&amp;diff=53</id>
		<title>Tema 7: El lenguaje de demostración Isar</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_7:_El_lenguaje_de_demostraci%C3%B3n_Isar&amp;diff=53"/>
		<updated>2012-01-31T09:45:30Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; header {* El lenguaje de demostración Isar *}  theory Tema_7 imports Main begin  text {*   Este tema describe los elementos básicos del lenguaje de demost...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* El lenguaje de demostración Isar *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_7&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Este tema describe los elementos básicos del lenguaje de demostración&lt;br /&gt;
  Isar (Intelligible semi-automated reasoning).&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Panorama de la sintaxis (simplificada) de Isar *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Representación de lemas (y teoremas)&lt;br /&gt;
  · Un lema (o teorema) comienza con una etiqueta seguida por algunas&lt;br /&gt;
    premisas y una conclusión.&lt;br /&gt;
  · Las premisas se introducen con la palabra &amp;quot;assumes&amp;quot; y se separan&lt;br /&gt;
    con &amp;quot;and&amp;quot;.&lt;br /&gt;
  · Cada premisa puede etiquetarse para referenciarse en la demostración.&lt;br /&gt;
  · La conclusión se introduce con la palabra &amp;quot;shows&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Gramática (simplificada) de las demostraciones en Isar&lt;br /&gt;
  &amp;lt;demostración&amp;gt; ::= proof &amp;lt;método&amp;gt; &amp;lt;declaración&amp;gt;* qed&lt;br /&gt;
                   | by &amp;lt;método&amp;gt;&lt;br /&gt;
  &amp;lt;declaración&amp;gt;  ::= fix &amp;lt;variable&amp;gt;+ &lt;br /&gt;
                   | assume &amp;lt;proposición&amp;gt;+&lt;br /&gt;
                   | (from &amp;lt;hecho&amp;gt;+)? have &amp;lt;proposición&amp;gt;+ &amp;lt;demostración&amp;gt;&lt;br /&gt;
                   | (from &amp;lt;hecho&amp;gt;+)? show &amp;lt;proposición&amp;gt;+ &amp;lt;demostración&amp;gt;&lt;br /&gt;
  &amp;lt;proposición&amp;gt;  ::= (&amp;lt;etiqueta&amp;gt;:)? &amp;lt;cadena&amp;gt;&lt;br /&gt;
  hecho          ::= &amp;lt;etiqueta&amp;gt;&lt;br /&gt;
  método         ::= -&lt;br /&gt;
                   | this&lt;br /&gt;
                   | rule &amp;lt;hecho&amp;gt;&lt;br /&gt;
                   | simp &lt;br /&gt;
                   | blast&lt;br /&gt;
                   | auto&lt;br /&gt;
                   | induct &amp;lt;variable&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  La declaración &amp;quot;show&amp;quot; demuestra la conclusión de la demostración&lt;br /&gt;
  mientras que la declaración &amp;quot;have&amp;quot; demuestra un resultado intermedio.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Razonamiento proposicional *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Regla de introducción de la conjunción:&lt;br /&gt;
  · conjI: ⟦P; Q⟧ ⟹ P ∧ Q&lt;br /&gt;
&lt;br /&gt;
  Nota: Se puede consultar mediante&lt;br /&gt;
     thm conjI     &lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de introducción de conjunción con razonamiento progresivo] &lt;br /&gt;
    P, Q ⊢ P ∧ (Q ∧ P)  &lt;br /&gt;
&lt;br /&gt;
  Demostración. Estamos suponiendo&lt;br /&gt;
     P                                     (1)&lt;br /&gt;
  y&lt;br /&gt;
     Q                                     (2)&lt;br /&gt;
  De (2) y (1), por introducción de la conjunción, se tiene&lt;br /&gt;
     Q ∧ P                                 (3)&lt;br /&gt;
  De (1) y (3), por introducción de la conjunción, se tiene&lt;br /&gt;
     P ∧ (Q ∧ P)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma conj2: &lt;br /&gt;
  assumes 1: P and 2: &amp;quot;Q&amp;quot; &lt;br /&gt;
  shows &amp;quot;P ∧ (Q ∧ P)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  from 2 1 have 3: &amp;quot;Q ∧ P&amp;quot; by (rule conjI)&lt;br /&gt;
  from 1 3 show &amp;quot;P ∧ (Q ∧ P)&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Razonamiento progresivo y regresivo en Isabelle:&lt;br /&gt;
  · Isabelle soporta razonamiento progresivo. La anterior demostración&lt;br /&gt;
    es una muestra. &lt;br /&gt;
  · Isabelle soporta razonamiento regresivo. La siguiente demostración&lt;br /&gt;
    es una muestra. &lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de introducción de la conjunción con razonamiento regresivo] &lt;br /&gt;
     P, Q ⊢ P ∧ (Q ∧ P)&lt;br /&gt;
&lt;br /&gt;
  Demostración. Estamos suponiendo&lt;br /&gt;
     P                                    (1)&lt;br /&gt;
  y&lt;br /&gt;
     Q                                    (2)&lt;br /&gt;
&lt;br /&gt;
  Para demostrar el lema, por introducción de la conjunción, basta probar&lt;br /&gt;
     P&lt;br /&gt;
  y&lt;br /&gt;
     Q ∧ P                                (3)&lt;br /&gt;
&lt;br /&gt;
  La condición &amp;#039;P&amp;#039; se tiene por la hipótesis (1). Para demostrar&lt;br /&gt;
  la condición (3), por introducción de la conjunción, basta probar&lt;br /&gt;
     Q                                     &lt;br /&gt;
  y&lt;br /&gt;
     P&lt;br /&gt;
  La condición &amp;#039;Q&amp;#039; se tiene por la hipótesis (2) y la condición &amp;#039;P&amp;#039; se&lt;br /&gt;
  tiene por la hipótesis (1).&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;P&amp;quot; and 2: &amp;quot;Q&amp;quot; &lt;br /&gt;
  shows &amp;quot;P ∧ (Q ∧ P)&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  from 1 show &amp;quot;P&amp;quot; by this&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;Q ∧ P&amp;quot;&lt;br /&gt;
  proof (rule conjI)&lt;br /&gt;
    from 2 show &amp;quot;Q&amp;quot; by this&lt;br /&gt;
  next&lt;br /&gt;
    from 1 show &amp;quot;P&amp;quot; by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  El método &amp;quot;this&amp;quot; demuestra el objetivo usando el hecho actual; es&lt;br /&gt;
  decir, el de la cláusula &amp;quot;from&amp;quot;.  &lt;br /&gt;
&lt;br /&gt;
  Reglas de eliminación de la conjunción:&lt;br /&gt;
  · conjunct1: P ∧ Q ⟹ P&lt;br /&gt;
  · conjunct2: P ∧ Q ⟹ P&lt;br /&gt;
&lt;br /&gt;
  Regla de introducción de la implicación:&lt;br /&gt;
  · impI: (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de razonamiento híbrido]&lt;br /&gt;
  Sean a y b dos números naturales. Si 0 &amp;lt; a y a &amp;lt; b, entonces a*a &amp;lt; b*b.    &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  fixes a b :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  shows &amp;quot;0 &amp;lt; a ∧ a &amp;lt; b ⟶ a * a &amp;lt; b * b&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume x: &amp;quot;0 &amp;lt; a ∧ a &amp;lt; b&amp;quot;&lt;br /&gt;
  from x have za: &amp;quot;0 &amp;lt; a&amp;quot; by (rule conjunct1)&lt;br /&gt;
  from x have ab: &amp;quot;a &amp;lt; b&amp;quot; by (rule conjunct2)&lt;br /&gt;
  from za ab have aa: &amp;quot;a*a &amp;lt; a*b&amp;quot; by simp&lt;br /&gt;
  from ab have bb: &amp;quot;a*b &amp;lt; b*b&amp;quot; by simp&lt;br /&gt;
  from aa bb show &amp;quot;a*a &amp;lt; b*b&amp;quot; by arith&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Modus ponens:&lt;br /&gt;
  · mp: ⟦P ⟶ Q; P⟧ ⟹ Q&lt;br /&gt;
&lt;br /&gt;
  Reglas de introducción de la disyunción:&lt;br /&gt;
  · disjI1: P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2: Q ⟹ P ∨ Q&lt;br /&gt;
&lt;br /&gt;
  Regla de eliminación de la disyunción:&lt;br /&gt;
  . disjE: ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R&lt;br /&gt;
&lt;br /&gt;
  Lema. [Razonamiento por casos] &lt;br /&gt;
     A ∨ B, A ⟶ C, B ⟶ C ⊢ C&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes ab: &amp;quot;A ∨ B&amp;quot; and ac: &amp;quot;A ⟶ C&amp;quot; and bc: &amp;quot;B ⟶ C&amp;quot;&lt;br /&gt;
  shows &amp;quot;C&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  note ab&lt;br /&gt;
  moreover { &lt;br /&gt;
    assume a: &amp;quot;A&amp;quot; &lt;br /&gt;
    from ac a have &amp;quot;C&amp;quot; by (rule mp) } &lt;br /&gt;
  moreover { &lt;br /&gt;
    assume b: &amp;quot;B&amp;quot; &lt;br /&gt;
    from bc b have &amp;quot;C&amp;quot; by (rule mp) }&lt;br /&gt;
  ultimately show &amp;quot;C&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Resumen de reglas proposicionales:&lt;br /&gt;
  · TrueI:         True&lt;br /&gt;
  · FalseE:        False ⟹ P&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;
  · 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;
  · notI:          (P ⟹ False) ⟹ ¬P&lt;br /&gt;
  · notE:          ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  · impI:          (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
  · impE:          ⟦P ⟶ Q; P; Q ⟹ R⟧ ⟹ R&lt;br /&gt;
  · mp:            ⟦P ⟶ Q; P⟧ ⟹ Q&lt;br /&gt;
  · iff:           (P ⟶ Q) ⟶ (Q ⟶ P) ⟶ P = Q&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;
  · ccontr:        (¬P ⟹ False) ⟹ P&lt;br /&gt;
  · classical:     (¬P ⟹ P) ⟹ P      &amp;amp;&amp;amp; @{thm classical } \\&lt;br /&gt;
  · exlude_middle: ¬P ∨ P&lt;br /&gt;
  · disjCI:        (¬Q ⟹ P) ⟹ P ∨ Q&lt;br /&gt;
  · impCE:         ⟦P ⟶ Q; ¬P ⟹ R; Q ⟹ R⟧ ⟹ R&lt;br /&gt;
  · iffCE:         ⟦P = Q; ⟦P; Q⟧ ⟹ R; ⟦¬P; ¬Q⟧ ⟹ R⟧ ⟹ R&lt;br /&gt;
  · notnotD:       ¬¬P ⟹ P&lt;br /&gt;
  · swap:          ⟦¬P; ¬R ⟹ P⟧ ⟹ R&lt;br /&gt;
&lt;br /&gt;
  Referencia de reglas de inferencia: Más información sobre las reglas&lt;br /&gt;
  de inferencia se encuentra en la sección  2.2 de &amp;quot;Isabelle&amp;#039;s Logics:&lt;br /&gt;
  HOL&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Atajos de Isar *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Isar tiene muchos atajos, como los siguientes:&lt;br /&gt;
  this        | éste           | el hecho probado en la declaración anterior&lt;br /&gt;
  then        | entonces       | from this&lt;br /&gt;
  hence       | por lo tanto   | then have&lt;br /&gt;
  thus        | de esta manera | then show&lt;br /&gt;
  with hecho+ | con            | from hecho+ and this&lt;br /&gt;
  .           | por ésto       | by this&lt;br /&gt;
  ..          | trivialmente   | by regla (Isabelle adivina la regla)&lt;br /&gt;
&lt;br /&gt;
  Razonamiento acumulativo:&lt;br /&gt;
  Una sucesión de hechos que se van a usar como premisa en una declaración&lt;br /&gt;
  puede agruparse usando &amp;quot;moreover&amp;quot; (además) y usarse en la declaración&lt;br /&gt;
  usando &amp;quot;ultimately&amp;quot; (finalmente). &lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo de uso de atajos y razonamiento acumulativo]&lt;br /&gt;
     A ∧ B ⊢ B ∧ A.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;A ∧ B ⟶ B ∧ A&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume ab: &amp;quot;A ∧ B&amp;quot;&lt;br /&gt;
  hence &amp;quot;B&amp;quot; by (rule conjunct2)&lt;br /&gt;
  moreover from ab have &amp;quot;A&amp;quot; ..&lt;br /&gt;
  ultimately show &amp;quot;B ∧ A&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Cuantificadores universal y existencial *}&lt;br /&gt;
&lt;br /&gt;
thm allE&lt;br /&gt;
text {* &lt;br /&gt;
  Reglas del cuantificador universal:&lt;br /&gt;
  · allI: (⋀x. P x) ⟹ ∀x. P x&lt;br /&gt;
  · allE: ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  En la regla allI la nueva variable se introduce mediante la palabra &amp;quot;fix&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo con  cuantificadores universales]&lt;br /&gt;
     ∀x. P ⟶ Q x ⊢ P ⟶ (∀x. Q x)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  assumes a: &amp;quot;∀ x. P ⟶ Q x&amp;quot;&lt;br /&gt;
  shows &amp;quot;P ⟶ (∀ x. Q x)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume p: &amp;quot;P&amp;quot;&lt;br /&gt;
  show &amp;quot;∀ x. Q x&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
    fix y&lt;br /&gt;
    from a have pq: &amp;quot;P ⟶ Q y&amp;quot; by (rule allE)&lt;br /&gt;
    from pq p show &amp;quot;Q y&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Reglas del cuantificador existencial:&lt;br /&gt;
  · exI: P x ⟹ ∃x. P x&lt;br /&gt;
  · exE: ⟦∃x. P x; ⋀x. P x ⟹ Q⟧ ⟹ Q&lt;br /&gt;
  En la regla exE la nueva variable se introduce mediante la declaración &lt;br /&gt;
  &amp;quot;obtain ... where ... by (rule exE)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
  Lema. [Ejemplo con cuantificador existencial y demostración progresiva]&lt;br /&gt;
     ∃x. P ∧ Q(x) ⊢ P ∧ (∃x. Q(x))&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  assumes e: &amp;quot;∃ x. P ∧ Q(x)&amp;quot;&lt;br /&gt;
  shows &amp;quot;P ∧ (∃ x. Q(x))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  from e obtain y where f: &amp;quot;P ∧ Q(y)&amp;quot; by (rule exE) &lt;br /&gt;
  from f have p: &amp;quot;P&amp;quot; by (rule conjunct1)&lt;br /&gt;
  from f have q: &amp;quot;Q(y)&amp;quot; by (rule conjunct2)&lt;br /&gt;
  from q have eq: &amp;quot;∃ x. Q(x)&amp;quot; by (rule exI)&lt;br /&gt;
  from p eq show &amp;quot;P ∧ (∃ x. Q(x))&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Ejemplo con cuantificador existencial y demostración automática] &lt;br /&gt;
     ∃x. P ∧ Q(x) ⊢ P ∧ (∃x. Q(x))&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  assumes e: &amp;quot;∃ x. P ∧ Q(x)&amp;quot;&lt;br /&gt;
  shows &amp;quot;P ∧ (∃ x. Q(x))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  from e obtain y where f: &amp;quot;P ∧ Q(y)&amp;quot; ..&lt;br /&gt;
  from f have p: &amp;quot;P&amp;quot; ..&lt;br /&gt;
  from f have q: &amp;quot;Q(y)&amp;quot; ..&lt;br /&gt;
  from q have eq: &amp;quot;∃x. Q(x)&amp;quot; ..&lt;br /&gt;
  from p eq show &amp;quot;P ∧ (∃x. Q(x))&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Ejemplo con cuantificador existencial y demostración regresiva]&lt;br /&gt;
     ∃x. P ∧ Q(x) ⊢ P ∧ (∃x. Q(x))&amp;quot;&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  assumes e: &amp;quot;∃x. P ∧ Q(x)&amp;quot;&lt;br /&gt;
  shows &amp;quot;P ∧ (∃x. Q(x))&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &amp;quot;P&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
    from e obtain y where p: &amp;quot;P ∧ Q(y)&amp;quot; by (rule exE)&lt;br /&gt;
    from p show &amp;quot;P&amp;quot; by (rule conjunct1)&lt;br /&gt;
    qed&lt;br /&gt;
  show &amp;quot;∃x. Q(x)&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
    from e obtain y where p: &amp;quot;P ∧ Q(y)&amp;quot; by (rule exE)&lt;br /&gt;
    from p have q: &amp;quot;Q(y)&amp;quot; by (rule conjunct2)&lt;br /&gt;
    from q show &amp;quot;∃x. Q(x)&amp;quot; by (rule exI)&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición. [Ejemplo de definición existencial]&lt;br /&gt;
  El número natural x divide al número natural y si existe un natural k&lt;br /&gt;
  tal que k×x = y. Se representa por x | y. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition divide :: &amp;quot;nat ⇒ nat ⇒ bool&amp;quot; (&amp;quot;_ | _&amp;quot; [80,80] 80) where&lt;br /&gt;
  &amp;quot;x | y ≡ ∃k. k*x = y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo de activación automática de regla de simplificación:&lt;br /&gt;
  La definición de divide se añade a las reglas de simplificación. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
declare divide_def[simp]&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema. [Transitividad de la divisibilidad]&lt;br /&gt;
  Sean a, b y c números naturales. Si b es divisible por a y c es&lt;br /&gt;
  divisible por b, entonces c es divisible por a. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma divide_trans: &lt;br /&gt;
  fixes a b c :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  assumes ab: &amp;quot;a | b&amp;quot; and bc: &amp;quot;b | c&amp;quot;&lt;br /&gt;
  shows &amp;quot;a | c&amp;quot;&lt;br /&gt;
proof simp&lt;br /&gt;
  from ab obtain m where m: &amp;quot;m*a = b&amp;quot; by auto&lt;br /&gt;
  from bc obtain n where n: &amp;quot;n*b = c&amp;quot; by auto&lt;br /&gt;
  from m n have &amp;quot;m*n*a = c&amp;quot; by auto&lt;br /&gt;
  thus &amp;quot;∃k. k*a = c&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Método auto: En el lema anterior es la primera vez que se usa el&lt;br /&gt;
  método automático &amp;quot;auto&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Lema. [CNS de divisibilidad]&lt;br /&gt;
  Sean a y b dos números naturales. Entonces a es divisible por b syss&lt;br /&gt;
  el resto de dividir a entre b es cero.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma CNS_divisibilidad: &lt;br /&gt;
  &amp;quot;(a | b) = (b mod a = 0)&amp;quot; &lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
section {* Razonamiento ecuacional *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Elementos para el razonamiento ecuacional:&lt;br /&gt;
  El razonamiento ecuacional se realiza de manera más concisa usando la&lt;br /&gt;
  combinación de &amp;quot;also&amp;quot; (además) y &amp;quot;finally&amp;quot; (finalmente).&lt;br /&gt;
  &lt;br /&gt;
  Lema. [Ejemplo de razonamiento ecuacional]&lt;br /&gt;
  Si a=b, b=c y c=d, entonces a=d.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;a = b&amp;quot; and 2: &amp;quot;b = c&amp;quot; and 3: &amp;quot;c = d&amp;quot;&lt;br /&gt;
  shows &amp;quot;a = d&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;a = b&amp;quot; by (rule 1)&lt;br /&gt;
  also have &amp;quot;… = c&amp;quot; by (rule 2)&lt;br /&gt;
  also have &amp;quot;… = d&amp;quot; by (rule 3)&lt;br /&gt;
  finally show &amp;quot;a = d&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  El lema anterior puede demostrarse automáticamente con la maza&lt;br /&gt;
  (&amp;quot;sledgehammer&amp;quot;). &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;a = b&amp;quot; and 2: &amp;quot;b = c&amp;quot; and 3: &amp;quot;c = d&amp;quot;&lt;br /&gt;
  shows &amp;quot;a = d&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;a=d&amp;quot; by (metis 1 2 3)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=DAO2011_(Demostraci%C3%B3n_asistida_por_ordenador)&amp;diff=52</id>
		<title>DAO2011 (Demostración asistida por ordenador)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=DAO2011_(Demostraci%C3%B3n_asistida_por_ordenador)&amp;diff=52"/>
		<updated>2012-01-31T09:44:34Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Razonamiento automático (2011-12) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Demostración asistida por ordenador ==&lt;br /&gt;
Este curso es una introducción a la demostración asistida por ordenador usando el sistema [http://www.cl.cam.ac.uk/research/hvg/Isabelle Isabelle/HOL/Isar]). Los objetivos del curso son:&lt;br /&gt;
* desarrollar la capacidad de razonamiento lógico,&lt;br /&gt;
* conocer formalismos de representación del conocimiento matemático,&lt;br /&gt;
* saber usar sistemas de razonamiento y&lt;br /&gt;
* desarrollar teorías matemáticas en sistemas de demostración automática. &lt;br /&gt;
&lt;br /&gt;
Administrativamente, es un [http://www.cfp.us.es/web/ficha_avanzada.asp?id_titulo=846&amp;amp;tipo=FE&amp;amp;basica=1&amp;amp;curso=2010 curso de formación especializada] del [http://www.cfp.us.es/ Centro de Formación Permanente de la Universidad de Sevilla].&lt;br /&gt;
&lt;br /&gt;
== Material para el curso ==&lt;br /&gt;
* [[Temas]]: Teorías de los temas.&lt;br /&gt;
* [[Ejercicios]]: Relaciones de ejercicios.&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao/doc.html Documentación]: Enlaces con documentación.&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao/sistemas.html Sistemas]: Sistemas utilizados.&lt;br /&gt;
* [http://www.glc.us.es/~jalonso/vestigium/tag/dao2011/ Diario]: Descripción diaria de las clases.&lt;br /&gt;
&lt;br /&gt;
== Razonamiento automático (2011-12) ==&lt;br /&gt;
* [[Tema 6: Isabelle como un lenguaje funcional]].&lt;br /&gt;
* [[Tema 7: El lenguaje de demostración Isar]].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_6:_Isabelle_como_un_lenguaje_funcional&amp;diff=51</id>
		<title>Tema 6: Isabelle como un lenguaje funcional</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_6:_Isabelle_como_un_lenguaje_funcional&amp;diff=51"/>
		<updated>2012-01-19T15:00:59Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 6: Isabelle como un lenguaje funcional *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_6&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Introducción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Esta notas son una introducción a la demostración asistida utilizando&lt;br /&gt;
  el sistema Isabelle/HOL/Isar. &lt;br /&gt;
&lt;br /&gt;
  La versión de Isabelle utilizada es la 2011.&lt;br /&gt;
&lt;br /&gt;
  Un lema introduce una proposición seguida de una demostración.&lt;br /&gt;
&lt;br /&gt;
  Isabelle dispone de varios procedimientos automáticos para generar&lt;br /&gt;
  demostraciones, uno de los cuales es el de simplificación (llamado simp).&lt;br /&gt;
&lt;br /&gt;
  El procedimiento simp aplica un conjunto de reglas de reescritura que&lt;br /&gt;
  inicialmente contiene un gran número de reglas relativas a los objetos&lt;br /&gt;
  definidos. &lt;br /&gt;
&lt;br /&gt;
  El ejemplo del lema más trivial es el siguiente&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma elMasTrivial: &amp;quot;True&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En este capítulos se presenta el lenguaje funcional que está incluido en&lt;br /&gt;
  Isabelle. &lt;br /&gt;
&lt;br /&gt;
  El lenguaje funcional es muy parecido al ML estándard.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Números naturales, enteros y booleanos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En Isabelle están definidos los número naturales con la sintaxis de&lt;br /&gt;
  Peano usando dos constructores: &lt;br /&gt;
  · 0 (cero) y &lt;br /&gt;
  · &amp;quot;Suc n&amp;quot; (el sucesor de n). &lt;br /&gt;
  &lt;br /&gt;
  Los números como el 1  son abreviaturas de los correspondientes en la&lt;br /&gt;
  notación de Peano, en este caso &amp;quot;Suc 0&amp;quot;. &lt;br /&gt;
  &lt;br /&gt;
  El tipo de los números naturales es nat. &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de simplificación de números naturales]&lt;br /&gt;
  El siguiente del 0 es el 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;Suc 0 = 1&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En Isabelle están definida la suma y el producto de números naturales:&lt;br /&gt;
  · &amp;quot;x+y&amp;quot; es la suma de x e y &lt;br /&gt;
  · &amp;quot;x*y&amp;quot; es el producto de x e y &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de suma]&lt;br /&gt;
  La suma de los números naturales 1 y 2 es el número natural 3.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;1 + 2 = (3::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  La notación del par de dos puntos se usa para asignar un tipo a un término&lt;br /&gt;
  (por ejemplo, 3::nat significa que se considera que 3 es un número natural).&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de producto]&lt;br /&gt;
  El producto de los números naturales 2 y 3 es el número natural 6.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;2 * 3 = (6::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En Isabelle está definida la división de números naturales: &lt;br /&gt;
  · &amp;quot;n div m&amp;quot; es el cociente entero de n entre &amp;quot;m&amp;quot;&lt;br /&gt;
  · &amp;quot;n mod m&amp;quot; es el resto de dividir &amp;quot;n&amp;quot; entre &amp;quot;m&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de división]&lt;br /&gt;
  La división natural de 7 entre 3 es 2.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;7 div 3 = (2::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de resto]&lt;br /&gt;
  El resto de dividir 7 entre 3 es 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;7 mod 3 = (1::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En Isabelle también están definidos los números enteros. &lt;br /&gt;
&lt;br /&gt;
  El tipo de los enteros se representa por int.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de operación con enteros]&lt;br /&gt;
  La suma de 1 y -2 es el número entero -1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;1 + -2 = (-1::int)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Los numerales están sobrecargados. &lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, el &amp;#039;1&amp;#039; puede ser un natural o un entero, dependiendo del&lt;br /&gt;
  contexto. &lt;br /&gt;
&lt;br /&gt;
  Isabelle resuelve ambigüedades mediante inferencia de tipos.&lt;br /&gt;
&lt;br /&gt;
  A veces, es necesario usar declaraciones de tipo para resolver la ambigüedad.&lt;br /&gt;
&lt;br /&gt;
  En Isabelle están definidos &lt;br /&gt;
  · los valores booleanos  &amp;quot;True, False&amp;quot;, &lt;br /&gt;
  · las conectivas &amp;quot;¬, ∧, ∨, ⟶, ↔&amp;quot; y &lt;br /&gt;
  · los cuantificadores &amp;quot;∀, ∃&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
  El tipo de los booleanos es bool. &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplos de evaluaciones booleanas]&lt;br /&gt;
    · La conjunción de dos fórmulas verdaderas es verdadera.&lt;br /&gt;
    · La conjunción de un fórmula verdadera y una falsa es falsa.&lt;br /&gt;
    · La disyunción de una fórmula verdadera y una falsa es verdadera.&lt;br /&gt;
    · La disyunción de dos fórmulas falsas es falsa.&lt;br /&gt;
    · La negación de una fórmula verdadera es falsa.&lt;br /&gt;
    · Una fórmula falsa implica una fórmula verdadera.&lt;br /&gt;
    · Todo elemento es igual a sí mismo.&lt;br /&gt;
    · Existe un elemento igual a 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;True ∧ True = True&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;True ∧ False = False&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
 &lt;br /&gt;
lemma &amp;quot;True ∨ False = True&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;False ∨ False = False&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;¬ True = (False::bool)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;False ⟶ True&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;∀ x. x = x&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;∃ x. x = 1&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Definiciones no recursivas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición [Ejemplo de definición no recursiva]&lt;br /&gt;
  La disyunción exclusiva de A y B se verifica si una es verdadera y la&lt;br /&gt;
  otra no lo es.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition xor :: &amp;quot;bool ⇒ bool ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;xor A B ≡ (A ∧ ¬ B) ∨ (¬ A ∧ B)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de demostración con definiciones no recursivas]&lt;br /&gt;
  La disyunción exclusiva de dos fórmulas verdaderas es falsa.&lt;br /&gt;
&lt;br /&gt;
  Demostración. Por simplificación, usando la definición de la disyunción&lt;br /&gt;
  exclusiva. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;xor True True = False&amp;quot;&lt;br /&gt;
by (simp  add: xor_def)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Se añade la definición de la disyunción exlusiva al conjunto de reglas de&lt;br /&gt;
  simplificación automáticas.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
declare xor_def[simp]&lt;br /&gt;
&lt;br /&gt;
section {* Definiciones locales *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se puede asignar valores a variables locales mediante &amp;#039;let&amp;#039; y usarlo en las &lt;br /&gt;
  expresiones dentro de &amp;#039;in&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de entorno local]&lt;br /&gt;
  Sea x el número natural 3. Entonces &amp;quot;x × x = 9&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(let x = 3::nat in x * x = 9)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Pares *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Un par se representa escribiendo los elementos entre paréntesis y separados&lt;br /&gt;
  por coma.&lt;br /&gt;
  &lt;br /&gt;
  El tipo de los pares es el producto de los tipos.&lt;br /&gt;
  &lt;br /&gt;
  La función fst devuelve el primer elemento de un par y la snd el segundo.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de uso de pares]&lt;br /&gt;
  Sea p el par de números naturales (2,3). La suma del primer elemento de&lt;br /&gt;
  p y 1 es igual al segundo elemento de p.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;let p = (2,3)::nat × nat in fst p + 1 = snd p&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Listas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Una lista se representa escribiendo los elementos entre corchetes y separados&lt;br /&gt;
  por coma.&lt;br /&gt;
  &lt;br /&gt;
  La lista vacía se representa por [].&lt;br /&gt;
&lt;br /&gt;
  Todos los elementos de una lista tienen que ser del mismo tipo.&lt;br /&gt;
  &lt;br /&gt;
  El tipo de las listas de elementos del tipo a es &amp;quot;a list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  El término a#l representa la lista obtenida añadiendo el elemento a al&lt;br /&gt;
  principio de la lista l.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de construcción de listas]&lt;br /&gt;
  La lista obtenida añadiendo sucesivamente a la lista vacía los elementos 3,&lt;br /&gt;
  2 y 1 es [1,2,3]. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;1#(2#(3#[])) = [1,2,3]&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  (hd l) es el primer elemento de la lista l.&lt;br /&gt;
&lt;br /&gt;
  (tl l) es el resto de la lista l.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de cálculo con listas]&lt;br /&gt;
  Sea l la lista de números naturales [1,2,3]. Entonces, el primero de l es 1 y&lt;br /&gt;
  el resto de l es [2,3].  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;let l = [1,2,3]::(nat list) in hd l = 1 ∧ tl l = [2,3]&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  (length l)es la longitud de la lista l.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de cálculo de longitud]&lt;br /&gt;
  La longitud de la lista [1,2,3] es 3.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length [1,2,3] = 3&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En la sesión 38 de &amp;quot;HOL: The basis of Higher-Order Logic&amp;quot;&lt;br /&gt;
  (en http://isabelle.informatik.tu-muenchen.de/library/HOL/outline.pdf)&lt;br /&gt;
  se encuentran  más definiciones y propiedades de las listas.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Registros *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Un registro es una colección de campos y valores. &lt;br /&gt;
&lt;br /&gt;
  Definición [Ejemplo de definición de registro]&lt;br /&gt;
  Los puntos del plano pueden representarse mediante registros con dos campos,&lt;br /&gt;
  las coordenadas, con valores enteros.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
record punto = &lt;br /&gt;
  coordenada_x :: int&lt;br /&gt;
  coordenada_y :: int&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición [Ejemplo de definición de un registro]&lt;br /&gt;
  El punto pt tiene de coordenadas 3 y 7.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition pt :: punto where&lt;br /&gt;
  &amp;quot;pt ≡ (|coordenada_x = 3, coordenada_y = 7|)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de propiedad de registro]&lt;br /&gt;
  La coordenada x del punto pt es 3.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;coordenada_x pt = 3&amp;quot; &lt;br /&gt;
by (simp add: pt_def)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de actualización de un registro]&lt;br /&gt;
  Sea pt2 el punto obtenido a partir del punto pt cambiando el&lt;br /&gt;
  valor de su coordenada x por 4. Entonces la coordenada x del punto pt2&lt;br /&gt;
  es 4. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;let pt2=pt(|coordenada_x:=4|) in coordenada_x (pt2) = 4&amp;quot; &lt;br /&gt;
by (simp add: pt_def)&lt;br /&gt;
&lt;br /&gt;
section {* Funciones anónimas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En Isabelle pueden definirse funciones anónimas.  &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de uso de funciones anónimas]&lt;br /&gt;
  El valor de la función que a un número le asigna su doble aplicada a 1 es 2.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(λ x. x + x) 1 = (2::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Condicionales *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición [Ejemplo con el condicional if]&lt;br /&gt;
  El valor absoluto del entero x es x, si &amp;quot;x ≥ 0&amp;quot; y es -x en caso&lt;br /&gt;
  contrario.    &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition absoluto :: &amp;quot;int ⇒ int&amp;quot; where&lt;br /&gt;
  &amp;quot;absoluto x ≡ (if x ≥ 0 then x else -x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de simplificación con el condicional if]&lt;br /&gt;
  El valor absoluto de -3 es 3.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;absoluto(-3) = 3&amp;quot;&lt;br /&gt;
by (simp add:absoluto_def) &lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición [Ejemplo con el condicional case]&lt;br /&gt;
  Un número natural n es un sucesor si es de la forma &amp;quot;Suc m&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition es_sucesor :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_sucesor n ≡&lt;br /&gt;
  (case n of &lt;br /&gt;
    0     ⇒ False &lt;br /&gt;
  | Suc m ⇒ True)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de simplificación con el condicional case]&lt;br /&gt;
  El número 3 es sucesor.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;es_sucesor 3&amp;quot;&lt;br /&gt;
by (simp add: es_sucesor_def)&lt;br /&gt;
&lt;br /&gt;
section {* Tipos de datos y recursión primitiva *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición [Ejemplo de definición de tipo de dato recursivo]&lt;br /&gt;
  Una lista de elementos de tipo a es la lista Vacia o se obtiene añadiendo,&lt;br /&gt;
  con ConsLista, un elemento de tipo a a una lista de elementos de tipo a.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a Lista = Vacia | ConsLista &amp;#039;a &amp;quot;&amp;#039;a Lista&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición [Ejemplo de definición primitiva recursiva]&lt;br /&gt;
  (conc xs ys) es la concatenación de las lista xs e ys.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec conc :: &amp;quot;&amp;#039;a Lista ⇒ &amp;#039;a Lista ⇒ &amp;#039;a Lista&amp;quot; where&lt;br /&gt;
  &amp;quot;conc Vacia ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;conc (ConsLista x xs) ys = ConsLista x (conc xs ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de simplificación con tipo de dato recursivo]&lt;br /&gt;
  La concatenación de la lista formada por 1 y 2 con la lista formada por el 3&lt;br /&gt;
  es la lista cuyos elementos son 1,2 y 3.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc (ConsLista 1 (ConsLista 2 Vacia)) (ConsLista 3 Vacia) =&lt;br /&gt;
       (ConsLista 1 (ConsLista 2 (ConsLista 3 Vacia)))&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio [Ejemplo de definición primitiva recursiva sobre los naturales] &lt;br /&gt;
  Definir una función que sume los primeros n números naturales y usarla para&lt;br /&gt;
  comprobar que la suma de los 3 primeros números naturales es 6.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec suma :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma 0 = 0&amp;quot;&lt;br /&gt;
| &amp;quot;suma (Suc m) = (Suc m) + suma m&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma 3 = 6&amp;quot;&lt;br /&gt;
by (simp add: suma_def) &lt;br /&gt;
&lt;br /&gt;
value &amp;quot;suma 3&amp;quot;&lt;br /&gt;
value &amp;quot;2+(3::int)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_6:_Isabelle_como_un_lenguaje_funcional&amp;diff=50</id>
		<title>Tema 6: Isabelle como un lenguaje funcional</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_6:_Isabelle_como_un_lenguaje_funcional&amp;diff=50"/>
		<updated>2012-01-19T14:56:31Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 6: Isabelle como un lenguaje funcional *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_6&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Introducción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Esta notas son una introducción a la demostración asistida utilizando&lt;br /&gt;
  el sistema Isabelle/HOL/Isar. &lt;br /&gt;
&lt;br /&gt;
  La versión de Isabelle utilizada es la 2011.&lt;br /&gt;
&lt;br /&gt;
  Un lema introduce una proposición seguida de una demostración.&lt;br /&gt;
&lt;br /&gt;
  Isabelle dispone de varios procedimientos automáticos para generar&lt;br /&gt;
  demostraciones, uno de los cuales es el de simplificación (llamado simp).&lt;br /&gt;
&lt;br /&gt;
  El procedimiento simp aplica un conjunto de reglas de reescritura que&lt;br /&gt;
  inicialmente contiene un gran número de reglas relativas a los objetos&lt;br /&gt;
  definidos. El ejemplo del lema más trivial es el siguiente *}&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma elMasTrivial: &amp;quot;True&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En este capítulos se presenta el lenguaje funcional que está incluido en&lt;br /&gt;
  Isabelle. &lt;br /&gt;
&lt;br /&gt;
  El lenguaje funcional es muy parecido al ML estándard.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Números naturales, enteros y booleanos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En Isabelle están definidos los número naturales con la sintaxis de&lt;br /&gt;
  Peano usando dos constructores: &lt;br /&gt;
  · 0 (cero) y &lt;br /&gt;
  · &amp;quot;Suc n&amp;quot; (el sucesor de n). &lt;br /&gt;
  &lt;br /&gt;
  Los números como el 1  son abreviaturas de los correspondientes en la&lt;br /&gt;
  notación de Peano, en este caso &amp;quot;Suc 0&amp;quot;. &lt;br /&gt;
  &lt;br /&gt;
  El tipo de los números naturales es nat. &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de simplificación de números naturales]&lt;br /&gt;
  El siguiente del 0 es el 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;Suc 0 = 1&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En Isabelle están definida la suma y el producto de números naturales:&lt;br /&gt;
  · &amp;quot;x+y&amp;quot; es la suma de x e y &lt;br /&gt;
  · &amp;quot;x*y&amp;quot; es el producto de x e y &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de suma]&lt;br /&gt;
  La suma de los números naturales 1 y 2 es el número natural 3.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;1 + 2 = (3::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  La notación del par de dos puntos se usa para asignar un tipo a un término&lt;br /&gt;
  (por ejemplo, 3::nat significa que se considera que 3 es un número natural).&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de producto]&lt;br /&gt;
  El producto de los números naturales 2 y 3 es el número natural 6.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;2 * 3 = (6::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En Isabelle está definida la división de números naturales: &lt;br /&gt;
  · &amp;quot;n div m&amp;quot; es el cociente entero de n entre &amp;quot;m&amp;quot;&lt;br /&gt;
  · &amp;quot;n mod m&amp;quot; es el resto de dividir &amp;quot;n&amp;quot; entre &amp;quot;m&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de división]&lt;br /&gt;
  La división natural de 7 entre 3 es 2.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;7 div 3 = (2::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de resto]&lt;br /&gt;
  El resto de dividir 7 entre 3 es 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;7 mod 3 = (1::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En Isabelle también están definidos los números enteros. &lt;br /&gt;
&lt;br /&gt;
  El tipo de los enteros se representa por int.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de operación con enteros]&lt;br /&gt;
  La suma de 1 y -2 es el número entero -1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;1 + -2 = (-1::int)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Los numerales están sobrecargados. &lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, el &amp;#039;1&amp;#039; puede ser un natural o un entero, dependiendo del&lt;br /&gt;
  contexto. &lt;br /&gt;
&lt;br /&gt;
  Isabelle resuelve ambigüedades mediante inferencia de tipos.&lt;br /&gt;
&lt;br /&gt;
  A veces, es necesario usar declaraciones de tipo para resolver la ambigüedad.&lt;br /&gt;
&lt;br /&gt;
  En Isabelle están definidos &lt;br /&gt;
  · los valores booleanos  &amp;quot;True, False&amp;quot;, &lt;br /&gt;
  · las conectivas &amp;quot;¬, ∧, ∨, ⟶, ↔&amp;quot; y &lt;br /&gt;
  · los cuantificadores &amp;quot;∀, ∃&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
  El tipo de los booleanos es bool. &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplos de evaluaciones booleanas]&lt;br /&gt;
    · La conjunción de dos fórmulas verdaderas es verdadera.&lt;br /&gt;
    · La conjunción de un fórmula verdadera y una falsa es falsa.&lt;br /&gt;
    · La disyunción de una fórmula verdadera y una falsa es verdadera.&lt;br /&gt;
    · La disyunción de dos fórmulas falsas es falsa.&lt;br /&gt;
    · La negación de una fórmula verdadera es falsa.&lt;br /&gt;
    · Una fórmula falsa implica una fórmula verdadera.&lt;br /&gt;
    · Todo elemento es igual a sí mismo.&lt;br /&gt;
    · Existe un elemento igual a 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;True ∧ True = True&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;True ∧ False = False&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
 &lt;br /&gt;
lemma &amp;quot;True ∨ False = True&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;False ∨ False = False&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;¬ True = (False::bool)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;False ⟶ True&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;∀ x. x = x&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;∃ x. x = 1&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Definiciones no recursivas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición [Ejemplo de definición no recursiva]&lt;br /&gt;
  La disyunción exclusiva de A y B se verifica si una es verdadera y la&lt;br /&gt;
  otra no lo es.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition xor :: &amp;quot;bool ⇒ bool ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;xor A B ≡ (A ∧ ¬ B) ∨ (¬ A ∧ B)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de demostración con definiciones no recursivas]&lt;br /&gt;
  La disyunción exclusiva de dos fórmulas verdaderas es falsa.&lt;br /&gt;
&lt;br /&gt;
  Demostración. Por simplificación, usando la definición de la disyunción&lt;br /&gt;
  exclusiva. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;xor True True = False&amp;quot;&lt;br /&gt;
by (simp  add: xor_def)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Se añade la definición de la disyunción exlusiva al conjunto de reglas de&lt;br /&gt;
  simplificación automáticas.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
declare xor_def[simp]&lt;br /&gt;
&lt;br /&gt;
section {* Definiciones locales *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se puede asignar valores a variables locales mediante &amp;#039;let&amp;#039; y usarlo en las &lt;br /&gt;
  expresiones dentro de &amp;#039;in&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de entorno local]&lt;br /&gt;
  Sea x el número natural 3. Entonces &amp;quot;x × x = 9&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(let x = 3::nat in x * x = 9)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Pares *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Un par se representa escribiendo los elementos entre paréntesis y separados&lt;br /&gt;
  por coma.&lt;br /&gt;
  &lt;br /&gt;
  El tipo de los pares es el producto de los tipos.&lt;br /&gt;
  &lt;br /&gt;
  La función fst devuelve el primer elemento de un par y la snd el segundo.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de uso de pares]&lt;br /&gt;
  Sea p el par de números naturales (2,3). La suma del primer elemento de&lt;br /&gt;
  p y 1 es igual al segundo elemento de p.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;let p = (2,3)::nat × nat in fst p + 1 = snd p&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Listas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Una lista se representa escribiendo los elementos entre corchetes y separados&lt;br /&gt;
  por coma.&lt;br /&gt;
  &lt;br /&gt;
  La lista vacía se representa por [].&lt;br /&gt;
&lt;br /&gt;
  Todos los elementos de una lista tienen que ser del mismo tipo.&lt;br /&gt;
  &lt;br /&gt;
  El tipo de las listas de elementos del tipo a es &amp;quot;a list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  El término a#l representa la lista obtenida añadiendo el elemento a al&lt;br /&gt;
  principio de la lista l.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de construcción de listas]&lt;br /&gt;
  La lista obtenida añadiendo sucesivamente a la lista vacía los elementos 3,&lt;br /&gt;
  2 y 1 es [1,2,3]. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;1#(2#(3#[])) = [1,2,3]&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  (hd l) es el primer elemento de la lista l.&lt;br /&gt;
&lt;br /&gt;
  (tl l) es el resto de la lista l.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de cálculo con listas]&lt;br /&gt;
  Sea l la lista de números naturales [1,2,3]. Entonces, el primero de l es 1 y&lt;br /&gt;
  el resto de l es [2,3].  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;let l = [1,2,3]::(nat list) in hd l = 1 ∧ tl l = [2,3]&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  (length l)es la longitud de la lista l.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de cálculo de longitud]&lt;br /&gt;
  La longitud de la lista [1,2,3] es 3.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length [1,2,3] = 3&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En la sesión 38 de &amp;quot;HOL: The basis of Higher-Order Logic&amp;quot;&lt;br /&gt;
  (en http://isabelle.informatik.tu-muenchen.de/library/HOL/outline.pdf)&lt;br /&gt;
  se encuentran  más definiciones y propiedades de las listas.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Registros *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Un registro es una colección de campos y valores. &lt;br /&gt;
&lt;br /&gt;
  Definición [Ejemplo de definición de registro]&lt;br /&gt;
  Los puntos del plano pueden representarse mediante registros con dos campos,&lt;br /&gt;
  las coordenadas, con valores enteros.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
record punto = &lt;br /&gt;
  coordenada_x :: int&lt;br /&gt;
  coordenada_y :: int&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición [Ejemplo de definición de un registro]&lt;br /&gt;
  El punto pt tiene de coordenadas 3 y 7.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition pt :: punto where&lt;br /&gt;
  &amp;quot;pt ≡ (|coordenada_x = 3, coordenada_y = 7|)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de propiedad de registro]&lt;br /&gt;
  La coordenada x del punto pt es 3.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;coordenada_x pt = 3&amp;quot; &lt;br /&gt;
by (simp add: pt_def)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de actualización de un registro]&lt;br /&gt;
  Sea pt2 el punto obtenido a partir del punto pt cambiando el&lt;br /&gt;
  valor de su coordenada x por 4. Entonces la coordenada x del punto pt2&lt;br /&gt;
  es 4. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;let pt2=pt(|coordenada_x:=4|) in coordenada_x (pt2) = 4&amp;quot; &lt;br /&gt;
by (simp add: pt_def)&lt;br /&gt;
&lt;br /&gt;
section {* Funciones anónimas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En Isabelle pueden definirse funciones anónimas.  &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de uso de funciones anónimas]&lt;br /&gt;
  El valor de la función que a un número le asigna su doble aplicada a 1 es 2.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(λ x. x + x) 1 = (2::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Condicionales *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición [Ejemplo con el condicional if]&lt;br /&gt;
  El valor absoluto del entero x es x, si &amp;quot;x ≥ 0&amp;quot; y es -x en caso&lt;br /&gt;
  contrario.    &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition absoluto :: &amp;quot;int ⇒ int&amp;quot; where&lt;br /&gt;
  &amp;quot;absoluto x ≡ (if x ≥ 0 then x else -x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de simplificación con el condicional if]&lt;br /&gt;
  El valor absoluto de -3 es 3.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;absoluto(-3) = 3&amp;quot;&lt;br /&gt;
by (simp add:absoluto_def) &lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición [Ejemplo con el condicional case]&lt;br /&gt;
  Un número natural n es un sucesor si es de la forma &amp;quot;Suc m&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition es_sucesor :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_sucesor n ≡&lt;br /&gt;
  (case n of &lt;br /&gt;
    0     ⇒ False &lt;br /&gt;
  | Suc m ⇒ True)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de simplificación con el condicional case]&lt;br /&gt;
  El número 3 es sucesor.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;es_sucesor 3&amp;quot;&lt;br /&gt;
by (simp add: es_sucesor_def)&lt;br /&gt;
&lt;br /&gt;
section {* Tipos de datos y recursión primitiva *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición [Ejemplo de definición de tipo de dato recursivo]&lt;br /&gt;
  Una lista de elementos de tipo a es la lista Vacia o se obtiene añadiendo,&lt;br /&gt;
  con ConsLista, un elemento de tipo a a una lista de elementos de tipo a.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a Lista = Vacia | ConsLista &amp;#039;a &amp;quot;&amp;#039;a Lista&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición [Ejemplo de definición primitiva recursiva]&lt;br /&gt;
  (conc xs ys) es la concatenación de las lista xs e ys.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec conc :: &amp;quot;&amp;#039;a Lista ⇒ &amp;#039;a Lista ⇒ &amp;#039;a Lista&amp;quot; where&lt;br /&gt;
  &amp;quot;conc Vacia ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;conc (ConsLista x xs) ys = ConsLista x (conc xs ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de simplificación con tipo de dato recursivo]&lt;br /&gt;
  La concatenación de la lista formada por 1 y 2 con la lista formada por el 3&lt;br /&gt;
  es la lista cuyos elementos son 1,2 y 3.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc (ConsLista 1 (ConsLista 2 Vacia)) (ConsLista 3 Vacia) =&lt;br /&gt;
       (ConsLista 1 (ConsLista 2 (ConsLista 3 Vacia)))&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio [Ejemplo de definición primitiva recursiva sobre los naturales] &lt;br /&gt;
  Definir una función que sume los primeros n números naturales y usarla para&lt;br /&gt;
  comprobar que la suma de los 3 primeros números naturales es 6.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec suma :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma 0 = 0&amp;quot;&lt;br /&gt;
| &amp;quot;suma (Suc m) = (Suc m) + suma m&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma 3 = 6&amp;quot;&lt;br /&gt;
by (simp add: suma_def) &lt;br /&gt;
&lt;br /&gt;
value &amp;quot;suma 3&amp;quot;&lt;br /&gt;
value &amp;quot;2+(3::int)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_6:_Isabelle_como_un_lenguaje_funcional&amp;diff=49</id>
		<title>Tema 6: Isabelle como un lenguaje funcional</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_6:_Isabelle_como_un_lenguaje_funcional&amp;diff=49"/>
		<updated>2012-01-19T14:55:27Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 6: Isabelle como un lenguaje funcional *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_6&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Introducción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Esta notas son una introducción a la demostración asistida utilizando&lt;br /&gt;
  el sistema Isabelle/HOL/Isar. &lt;br /&gt;
&lt;br /&gt;
  La versión de Isabelle utilizada es la 2011.&lt;br /&gt;
&lt;br /&gt;
  Un lema introduce una proposición seguida de una demostración.&lt;br /&gt;
&lt;br /&gt;
  Isabelle dispone de varios procedimientos automáticos para generar&lt;br /&gt;
  demostraciones, uno de los cuales es el de simplificación (llamado simp).&lt;br /&gt;
&lt;br /&gt;
  El procedimiento simp aplica un conjunto de reglas de reescritura que&lt;br /&gt;
  inicialmente contiene un gran número de reglas relativas a los objetos&lt;br /&gt;
  definidos. El ejemplo del lema más trivial es el siguiente *}&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma elMasTrivial: &amp;quot;True&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En este capítulos se presenta el lenguaje funcional que está incluido en&lt;br /&gt;
  Isabelle. &lt;br /&gt;
&lt;br /&gt;
  El lenguaje funcional es muy parecido al ML estándard.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Números naturales, enteros y booleanos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En Isabelle están definidos los número naturales con la sintaxis de&lt;br /&gt;
  Peano usando dos constructores: &lt;br /&gt;
  · 0 (cero) y &lt;br /&gt;
  · &amp;quot;Suc n&amp;quot; (el sucesor de n). &lt;br /&gt;
  &lt;br /&gt;
  Los números como el 1  son abreviaturas de los correspondientes en la&lt;br /&gt;
  notación de Peano, en este caso &amp;quot;Suc 0&amp;quot;. &lt;br /&gt;
  &lt;br /&gt;
  El tipo de los números naturales es nat. &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de simplificación de números naturales]&lt;br /&gt;
  El siguiente del 0 es el 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;Suc 0 = 1&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En Isabelle están definida la suma y el producto de números naturales:&lt;br /&gt;
  · &amp;quot;x+y&amp;quot; es la suma de x e y &lt;br /&gt;
  · &amp;quot;x*y&amp;quot; es el producto de x e y &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de suma]&lt;br /&gt;
  La suma de los números naturales 1 y 2 es el número natural 3.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;1 + 2 = (3::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  La notación del par de dos puntos se usa para asignar un tipo a un término&lt;br /&gt;
  (por ejemplo, 3::nat significa que se considera que 3 es un número natural).&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de producto]&lt;br /&gt;
  El producto de los números naturales 2 y 3 es el número natural 6.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;2 * 3 = (6::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En Isabelle está definida la división de números naturales: &lt;br /&gt;
  · &amp;quot;n div m&amp;quot; es el cociente entero de n entre &amp;quot;m&amp;quot;&lt;br /&gt;
  · &amp;quot;n mod m&amp;quot; es el resto de dividir &amp;quot;n&amp;quot; entre &amp;quot;m&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de división]&lt;br /&gt;
  La división natural de 7 entre 3 es 2.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;7 div 3 = (2::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de resto]&lt;br /&gt;
  El resto de dividir 7 entre 3 es 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;7 mod 3 = (1::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En Isabelle también están definidos los números enteros. &lt;br /&gt;
&lt;br /&gt;
  El tipo de los enteros se representa por int.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de operación con enteros]&lt;br /&gt;
  La suma de 1 y -2 es el número entero -1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;1 + -2 = (-1::int)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Los numerales están sobrecargados. &lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, el &amp;#039;1&amp;#039; puede ser un natural o un entero, dependiendo del&lt;br /&gt;
  contexto. &lt;br /&gt;
&lt;br /&gt;
  Isabelle resuelve ambigüedades mediante inferencia de tipos.&lt;br /&gt;
&lt;br /&gt;
  A veces, es necesario usar declaraciones de tipo para resolver la ambigüedad.&lt;br /&gt;
&lt;br /&gt;
  En Isabelle están definidos &lt;br /&gt;
  · los valores booleanos  &amp;quot;True, False&amp;quot;, &lt;br /&gt;
  · las conectivas &amp;quot;\&amp;lt;not&amp;gt;, \&amp;lt;and&amp;gt;, \&amp;lt;or&amp;gt;, \&amp;lt;longrightarrow&amp;gt;, \&amp;lt;leftrightarrow&amp;gt;&amp;quot; y &lt;br /&gt;
  · los cuantificadores &amp;quot;\&amp;lt;forall&amp;gt;, \&amp;lt;exists&amp;gt;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
  El tipo de los booleanos es bool. &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplos de evaluaciones booleanas]&lt;br /&gt;
    · La conjunción de dos fórmulas verdaderas es verdadera.&lt;br /&gt;
    · La conjunción de un fórmula verdadera y una falsa es falsa.&lt;br /&gt;
    · La disyunción de una fórmula verdadera y una falsa es verdadera.&lt;br /&gt;
    · La disyunción de dos fórmulas falsas es falsa.&lt;br /&gt;
    · La negación de una fórmula verdadera es falsa.&lt;br /&gt;
    · Una fórmula falsa implica una fórmula verdadera.&lt;br /&gt;
    · Todo elemento es igual a sí mismo.&lt;br /&gt;
    · Existe un elemento igual a 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;True \&amp;lt;and&amp;gt; True = True&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;True \&amp;lt;and&amp;gt; False = False&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
 &lt;br /&gt;
lemma &amp;quot;True \&amp;lt;or&amp;gt; False = True&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;False \&amp;lt;or&amp;gt; False = False&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;\&amp;lt;not&amp;gt; True = (False::bool)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;False \&amp;lt;longrightarrow&amp;gt; True&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;\&amp;lt;forall&amp;gt; x. x = x&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;\&amp;lt;exists&amp;gt; x. x = 1&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Definiciones no recursivas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición [Ejemplo de definición no recursiva]&lt;br /&gt;
  La disyunción exclusiva de A y B se verifica si una es verdadera y la&lt;br /&gt;
  otra no lo es.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition xor :: &amp;quot;bool \&amp;lt;Rightarrow&amp;gt; bool \&amp;lt;Rightarrow&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;xor A B \&amp;lt;equiv&amp;gt; (A \&amp;lt;and&amp;gt; \&amp;lt;not&amp;gt; B) \&amp;lt;or&amp;gt; (\&amp;lt;not&amp;gt; A \&amp;lt;and&amp;gt; B)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de demostración con definiciones no recursivas]&lt;br /&gt;
  La disyunción exclusiva de dos fórmulas verdaderas es falsa.&lt;br /&gt;
&lt;br /&gt;
  Demostración. Por simplificación, usando la definición de la disyunción&lt;br /&gt;
  exclusiva. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;xor True True = False&amp;quot;&lt;br /&gt;
by (simp  add: xor_def)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Se añade la definición de la disyunción exlusiva al conjunto de reglas de&lt;br /&gt;
  simplificación automáticas.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
declare xor_def[simp]&lt;br /&gt;
&lt;br /&gt;
section {* Definiciones locales *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se puede asignar valores a variables locales mediante &amp;#039;let&amp;#039; y usarlo en las &lt;br /&gt;
  expresiones dentro de &amp;#039;in&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de entorno local]&lt;br /&gt;
  Sea x el número natural 3. Entonces &amp;quot;x \&amp;lt;times&amp;gt; x = 9&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(let x = 3::nat in x * x = 9)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Pares *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Un par se representa escribiendo los elementos entre paréntesis y separados&lt;br /&gt;
  por coma.&lt;br /&gt;
  &lt;br /&gt;
  El tipo de los pares es el producto de los tipos.&lt;br /&gt;
  &lt;br /&gt;
  La función fst devuelve el primer elemento de un par y la snd el segundo.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de uso de pares]&lt;br /&gt;
  Sea p el par de números naturales (2,3). La suma del primer elemento de&lt;br /&gt;
  p y 1 es igual al segundo elemento de p.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;let p = (2,3)::nat \&amp;lt;times&amp;gt; nat in fst p + 1 = snd p&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Listas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Una lista se representa escribiendo los elementos entre corchetes y separados&lt;br /&gt;
  por coma.&lt;br /&gt;
  &lt;br /&gt;
  La lista vacía se representa por [].&lt;br /&gt;
&lt;br /&gt;
  Todos los elementos de una lista tienen que ser del mismo tipo.&lt;br /&gt;
  &lt;br /&gt;
  El tipo de las listas de elementos del tipo a es &amp;quot;a list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  El término a#l representa la lista obtenida añadiendo el elemento a al&lt;br /&gt;
  principio de la lista l.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de construcción de listas]&lt;br /&gt;
  La lista obtenida añadiendo sucesivamente a la lista vacía los elementos 3,&lt;br /&gt;
  2 y 1 es [1,2,3]. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;1#(2#(3#[])) = [1,2,3]&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  (hd l) es el primer elemento de la lista l.&lt;br /&gt;
&lt;br /&gt;
  (tl l) es el resto de la lista l.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de cálculo con listas]&lt;br /&gt;
  Sea l la lista de números naturales [1,2,3]. Entonces, el primero de l es 1 y&lt;br /&gt;
  el resto de l es [2,3].  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;let l = [1,2,3]::(nat list) in hd l = 1 \&amp;lt;and&amp;gt; tl l = [2,3]&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  (length l)es la longitud de la lista l.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de cálculo de longitud]&lt;br /&gt;
  La longitud de la lista [1,2,3] es 3.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length [1,2,3] = 3&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En la sesión 38 de &amp;quot;HOL: The basis of Higher-Order Logic&amp;quot;&lt;br /&gt;
  (en http://isabelle.informatik.tu-muenchen.de/library/HOL/outline.pdf)&lt;br /&gt;
  se encuentran  más definiciones y propiedades de las listas.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Registros *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Un registro es una colección de campos y valores. &lt;br /&gt;
&lt;br /&gt;
  Definición [Ejemplo de definición de registro]&lt;br /&gt;
  Los puntos del plano pueden representarse mediante registros con dos campos,&lt;br /&gt;
  las coordenadas, con valores enteros.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
record punto = &lt;br /&gt;
  coordenada_x :: int&lt;br /&gt;
  coordenada_y :: int&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición [Ejemplo de definición de un registro]&lt;br /&gt;
  El punto pt tiene de coordenadas 3 y 7.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition pt :: punto where&lt;br /&gt;
  &amp;quot;pt \&amp;lt;equiv&amp;gt; \&amp;lt;lparr&amp;gt;coordenada_x = 3, coordenada_y = 7\&amp;lt;rparr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de propiedad de registro]&lt;br /&gt;
  La coordenada x del punto pt es 3.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;coordenada_x pt = 3&amp;quot; &lt;br /&gt;
by (simp add: pt_def)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de actualización de un registro]&lt;br /&gt;
  Sea pt2 el punto obtenido a partir del punto pt cambiando el&lt;br /&gt;
  valor de su coordenada x por 4. Entonces la coordenada x del punto pt2&lt;br /&gt;
  es 4. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;let pt2=pt\&amp;lt;lparr&amp;gt;coordenada_x:=4\&amp;lt;rparr&amp;gt; in coordenada_x (pt2) = 4&amp;quot; &lt;br /&gt;
by (simp add: pt_def)&lt;br /&gt;
&lt;br /&gt;
section {* Funciones anónimas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En Isabelle pueden definirse funciones anónimas.  &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de uso de funciones anónimas]&lt;br /&gt;
  El valor de la función que a un número le asigna su doble aplicada a 1 es 2.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(\&amp;lt;lambda&amp;gt; x. x + x) 1 = (2::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Condicionales *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición [Ejemplo con el condicional if]&lt;br /&gt;
  El valor absoluto del entero x es x, si &amp;quot;x \&amp;lt;ge&amp;gt; 0&amp;quot; y es -x en caso&lt;br /&gt;
  contrario.    &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition absoluto :: &amp;quot;int \&amp;lt;Rightarrow&amp;gt; int&amp;quot; where&lt;br /&gt;
  &amp;quot;absoluto x \&amp;lt;equiv&amp;gt; (if x \&amp;lt;ge&amp;gt; 0 then x else -x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de simplificación con el condicional if]&lt;br /&gt;
  El valor absoluto de -3 es 3.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;absoluto(-3) = 3&amp;quot;&lt;br /&gt;
by (simp add:absoluto_def) &lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición [Ejemplo con el condicional case]&lt;br /&gt;
  Un número natural n es un sucesor si es de la forma &amp;quot;Suc m&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition es_sucesor :: &amp;quot;nat \&amp;lt;Rightarrow&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_sucesor n \&amp;lt;equiv&amp;gt;&lt;br /&gt;
  (case n of &lt;br /&gt;
    0     \&amp;lt;Rightarrow&amp;gt; False &lt;br /&gt;
  | Suc m \&amp;lt;Rightarrow&amp;gt; True)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de simplificación con el condicional case]&lt;br /&gt;
  El número 3 es sucesor.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;es_sucesor 3&amp;quot;&lt;br /&gt;
by (simp add: es_sucesor_def)&lt;br /&gt;
&lt;br /&gt;
section {* Tipos de datos y recursión primitiva *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición [Ejemplo de definición de tipo de dato recursivo]&lt;br /&gt;
  Una lista de elementos de tipo a es la lista Vacia o se obtiene añadiendo,&lt;br /&gt;
  con ConsLista, un elemento de tipo a a una lista de elementos de tipo a.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a Lista = Vacia | ConsLista &amp;#039;a &amp;quot;&amp;#039;a Lista&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición [Ejemplo de definición primitiva recursiva]&lt;br /&gt;
  (conc xs ys) es la concatenación de las lista xs e ys.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec conc :: &amp;quot;&amp;#039;a Lista \&amp;lt;Rightarrow&amp;gt; &amp;#039;a Lista \&amp;lt;Rightarrow&amp;gt; &amp;#039;a Lista&amp;quot; where&lt;br /&gt;
  &amp;quot;conc Vacia ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;conc (ConsLista x xs) ys = ConsLista x (conc xs ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de simplificación con tipo de dato recursivo]&lt;br /&gt;
  La concatenación de la lista formada por 1 y 2 con la lista formada por el 3&lt;br /&gt;
  es la lista cuyos elementos son 1,2 y 3.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc (ConsLista 1 (ConsLista 2 Vacia)) (ConsLista 3 Vacia) =&lt;br /&gt;
       (ConsLista 1 (ConsLista 2 (ConsLista 3 Vacia)))&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio [Ejemplo de definición primitiva recursiva sobre los naturales] &lt;br /&gt;
  Definir una función que sume los primeros n números naturales y usarla para&lt;br /&gt;
  comprobar que la suma de los 3 primeros números naturales es 6.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec suma :: &amp;quot;nat \&amp;lt;Rightarrow&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma 0 = 0&amp;quot;&lt;br /&gt;
| &amp;quot;suma (Suc m) = (Suc m) + suma m&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma 3 = 6&amp;quot;&lt;br /&gt;
by (simp add: suma_def) &lt;br /&gt;
&lt;br /&gt;
value &amp;quot;suma 3&amp;quot;&lt;br /&gt;
value &amp;quot;2+(3::int)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_6:_Isabelle_como_un_lenguaje_funcional&amp;diff=48</id>
		<title>Tema 6: Isabelle como un lenguaje funcional</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_6:_Isabelle_como_un_lenguaje_funcional&amp;diff=48"/>
		<updated>2012-01-19T14:54:42Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt; header {* Tema 6: Isabelle como un lenguaje funcional *}  theory Tema_6 imports Main begin  section {* Introducción *}  text {*   Esta notas son una in...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 6: Isabelle como un lenguaje funcional *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_6&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Introducción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Esta notas son una introducción a la demostración asistida utilizando&lt;br /&gt;
  el sistema Isabelle/HOL/Isar. &lt;br /&gt;
&lt;br /&gt;
  La versión de Isabelle utilizada es la 2011.&lt;br /&gt;
&lt;br /&gt;
  Un lema introduce una proposición seguida de una demostración.&lt;br /&gt;
&lt;br /&gt;
  Isabelle dispone de varios procedimientos automáticos para generar&lt;br /&gt;
  demostraciones, uno de los cuales es el de simplificación (llamado simp).&lt;br /&gt;
&lt;br /&gt;
  El procedimiento simp aplica un conjunto de reglas de reescritura que&lt;br /&gt;
  inicialmente contiene un gran número de reglas relativas a los objetos&lt;br /&gt;
  definidos. El ejemplo del lema más trivial es el siguiente *}&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma elMasTrivial: &amp;quot;True&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En este capítulos se presenta el lenguaje funcional que está incluido en&lt;br /&gt;
  Isabelle. &lt;br /&gt;
&lt;br /&gt;
  El lenguaje funcional es muy parecido al ML estándard.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Números naturales, enteros y booleanos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En Isabelle están definidos los número naturales con la sintaxis de&lt;br /&gt;
  Peano usando dos constructores: &lt;br /&gt;
  · 0 (cero) y &lt;br /&gt;
  · &amp;quot;Suc n&amp;quot; (el sucesor de n). &lt;br /&gt;
  &lt;br /&gt;
  Los números como el 1  son abreviaturas de los correspondientes en la&lt;br /&gt;
  notación de Peano, en este caso &amp;quot;Suc 0&amp;quot;. &lt;br /&gt;
  &lt;br /&gt;
  El tipo de los números naturales es nat. &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de simplificación de números naturales]&lt;br /&gt;
  El siguiente del 0 es el 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;Suc 0 = 1&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En Isabelle están definida la suma y el producto de números naturales:&lt;br /&gt;
  · &amp;quot;x+y&amp;quot; es la suma de x e y &lt;br /&gt;
  · &amp;quot;x*y&amp;quot; es el producto de x e y &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de suma]&lt;br /&gt;
  La suma de los números naturales 1 y 2 es el número natural 3.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;1 + 2 = (3::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  La notación del par de dos puntos se usa para asignar un tipo a un término&lt;br /&gt;
  (por ejemplo, 3::nat significa que se considera que 3 es un número natural).&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de producto]&lt;br /&gt;
  El producto de los números naturales 2 y 3 es el número natural 6.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;2 * 3 = (6::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En Isabelle está definida la división de números naturales: &lt;br /&gt;
  · &amp;quot;n div m&amp;quot; es el cociente entero de n entre &amp;quot;m&amp;quot;&lt;br /&gt;
  · &amp;quot;n mod m&amp;quot; es el resto de dividir &amp;quot;n&amp;quot; entre &amp;quot;m&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de división]&lt;br /&gt;
  La división natural de 7 entre 3 es 2.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;7 div 3 = (2::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de resto]&lt;br /&gt;
  El resto de dividir 7 entre 3 es 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;7 mod 3 = (1::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En Isabelle también están definidos los números enteros. &lt;br /&gt;
&lt;br /&gt;
  El tipo de los enteros se representa por int.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de operación con enteros]&lt;br /&gt;
  La suma de 1 y -2 es el número entero -1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;1 + -2 = (-1::int)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Los numerales están sobrecargados. &lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, el &amp;#039;1&amp;#039; puede ser un natural o un entero, dependiendo del&lt;br /&gt;
  contexto. &lt;br /&gt;
&lt;br /&gt;
  Isabelle resuelve ambigüedades mediante inferencia de tipos.&lt;br /&gt;
&lt;br /&gt;
  A veces, es necesario usar declaraciones de tipo para resolver la ambigüedad.&lt;br /&gt;
&lt;br /&gt;
  En Isabelle están definidos &lt;br /&gt;
  · los valores booleanos  &amp;quot;True, False&amp;quot;, &lt;br /&gt;
  · las conectivas &amp;quot;\&amp;lt;not&amp;gt;, \&amp;lt;and&amp;gt;, \&amp;lt;or&amp;gt;, \&amp;lt;longrightarrow&amp;gt;, \&amp;lt;leftrightarrow&amp;gt;&amp;quot; y &lt;br /&gt;
  · los cuantificadores &amp;quot;\&amp;lt;forall&amp;gt;, \&amp;lt;exists&amp;gt;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
  El tipo de los booleanos es bool. &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplos de evaluaciones booleanas]&lt;br /&gt;
    · La conjunción de dos fórmulas verdaderas es verdadera.&lt;br /&gt;
    · La conjunción de un fórmula verdadera y una falsa es falsa.&lt;br /&gt;
    · La disyunción de una fórmula verdadera y una falsa es verdadera.&lt;br /&gt;
    · La disyunción de dos fórmulas falsas es falsa.&lt;br /&gt;
    · La negación de una fórmula verdadera es falsa.&lt;br /&gt;
    · Una fórmula falsa implica una fórmula verdadera.&lt;br /&gt;
    · Todo elemento es igual a sí mismo.&lt;br /&gt;
    · Existe un elemento igual a 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;True \&amp;lt;and&amp;gt; True = True&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;True \&amp;lt;and&amp;gt; False = False&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
 &lt;br /&gt;
lemma &amp;quot;True \&amp;lt;or&amp;gt; False = True&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;False \&amp;lt;or&amp;gt; False = False&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;\&amp;lt;not&amp;gt; True = (False::bool)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;False \&amp;lt;longrightarrow&amp;gt; True&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;\&amp;lt;forall&amp;gt; x. x = x&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;\&amp;lt;exists&amp;gt; x. x = 1&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Definiciones no recursivas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición [Ejemplo de definición no recursiva]&lt;br /&gt;
  La disyunción exclusiva de A y B se verifica si una es verdadera y la&lt;br /&gt;
  otra no lo es.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition xor :: &amp;quot;bool \&amp;lt;Rightarrow&amp;gt; bool \&amp;lt;Rightarrow&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;xor A B \&amp;lt;equiv&amp;gt; (A \&amp;lt;and&amp;gt; \&amp;lt;not&amp;gt; B) \&amp;lt;or&amp;gt; (\&amp;lt;not&amp;gt; A \&amp;lt;and&amp;gt; B)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de demostración con definiciones no recursivas]&lt;br /&gt;
  La disyunción exclusiva de dos fórmulas verdaderas es falsa.&lt;br /&gt;
&lt;br /&gt;
  Demostración. Por simplificación, usando la definición de la disyunción&lt;br /&gt;
  exclusiva. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;xor True True = False&amp;quot;&lt;br /&gt;
by (simp  add: xor_def)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Se añade la definición de la disyunción exlusiva al conjunto de reglas de&lt;br /&gt;
  simplificación automáticas.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
declare xor_def[simp]&lt;br /&gt;
&lt;br /&gt;
section {* Definiciones locales *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se puede asignar valores a variables locales mediante &amp;#039;let&amp;#039; y usarlo en las &lt;br /&gt;
  expresiones dentro de &amp;#039;in&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de entorno local]&lt;br /&gt;
  Sea x el número natural 3. Entonces &amp;quot;x \&amp;lt;times&amp;gt; x = 9&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(let x = 3::nat in x * x = 9)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Pares *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Un par se representa escribiendo los elementos entre paréntesis y separados&lt;br /&gt;
  por coma.&lt;br /&gt;
  &lt;br /&gt;
  El tipo de los pares es el producto de los tipos.&lt;br /&gt;
  &lt;br /&gt;
  La función fst devuelve el primer elemento de un par y la snd el segundo.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de uso de pares]&lt;br /&gt;
  Sea p el par de números naturales (2,3). La suma del primer elemento de&lt;br /&gt;
  p y 1 es igual al segundo elemento de p.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;let p = (2,3)::nat \&amp;lt;times&amp;gt; nat in fst p + 1 = snd p&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Listas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Una lista se representa escribiendo los elementos entre corchetes y separados&lt;br /&gt;
  por coma.&lt;br /&gt;
  &lt;br /&gt;
  La lista vacía se representa por [].&lt;br /&gt;
&lt;br /&gt;
  Todos los elementos de una lista tienen que ser del mismo tipo.&lt;br /&gt;
  &lt;br /&gt;
  El tipo de las listas de elementos del tipo a es &amp;quot;a list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  El término a#l representa la lista obtenida añadiendo el elemento a al&lt;br /&gt;
  principio de la lista l.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de construcción de listas]&lt;br /&gt;
  La lista obtenida añadiendo sucesivamente a la lista vacía los elementos 3,&lt;br /&gt;
  2 y 1 es [1,2,3]. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;1#(2#(3#[])) = [1,2,3]&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  (hd l) es el primer elemento de la lista l.&lt;br /&gt;
&lt;br /&gt;
  (tl l) es el resto de la lista l.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de cálculo con listas]&lt;br /&gt;
  Sea l la lista de números naturales [1,2,3]. Entonces, el primero de l es 1 y&lt;br /&gt;
  el resto de l es [2,3].  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;let l = [1,2,3]::(nat list) in hd l = 1 \&amp;lt;and&amp;gt; tl l = [2,3]&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  (length l)es la longitud de la lista l.&lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de cálculo de longitud]&lt;br /&gt;
  La longitud de la lista [1,2,3] es 3.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length [1,2,3] = 3&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En la sesión 38 de &amp;quot;HOL: The basis of Higher-Order Logic&amp;quot;&lt;br /&gt;
  (en http://isabelle.informatik.tu-muenchen.de/library/HOL/outline.pdf)&lt;br /&gt;
  se encuentran  más definiciones y propiedades de las listas.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Registros *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Un registro es una colección de campos y valores. &lt;br /&gt;
&lt;br /&gt;
  Definición [Ejemplo de definición de registro]&lt;br /&gt;
  Los puntos del plano pueden representarse mediante registros con dos campos,&lt;br /&gt;
  las coordenadas, con valores enteros.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
record punto = &lt;br /&gt;
  coordenada_x :: int&lt;br /&gt;
  coordenada_y :: int&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición [Ejemplo de definición de un registro]&lt;br /&gt;
  El punto pt tiene de coordenadas 3 y 7.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition pt :: punto where&lt;br /&gt;
  &amp;quot;pt \&amp;lt;equiv&amp;gt; \&amp;lt;lparr&amp;gt;coordenada_x = 3, coordenada_y = 7\&amp;lt;rparr&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de propiedad de registro]&lt;br /&gt;
  La coordenada x del punto pt es 3.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;coordenada_x pt = 3&amp;quot; &lt;br /&gt;
by (simp add: pt_def)&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de actualización de un registro]&lt;br /&gt;
  Sea pt2 el punto obtenido a partir del punto pt cambiando el&lt;br /&gt;
  valor de su coordenada x por 4. Entonces la coordenada x del punto pt2&lt;br /&gt;
  es 4. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;let pt2=pt\&amp;lt;lparr&amp;gt;coordenada_x:=4\&amp;lt;rparr&amp;gt; in coordenada_x (pt2) = 4&amp;quot; &lt;br /&gt;
by (simp add: pt_def)&lt;br /&gt;
&lt;br /&gt;
section {* Funciones anónimas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En Isabelle pueden definirse funciones anónimas.  &lt;br /&gt;
&lt;br /&gt;
  Lema [Ejemplo de uso de funciones anónimas]&lt;br /&gt;
  El valor de la función que a un número le asigna su doble aplicada a 1 es 2.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(\&amp;lt;lambda&amp;gt; x. x + x) 1 = (2::nat)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Condicionales *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición [Ejemplo con el condicional if]&lt;br /&gt;
  El valor absoluto del entero x es x, si &amp;quot;x \&amp;lt;ge&amp;gt; 0&amp;quot; y es -x en caso&lt;br /&gt;
  contrario.    &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition absoluto :: &amp;quot;int \&amp;lt;Rightarrow&amp;gt; int&amp;quot; where&lt;br /&gt;
  &amp;quot;absoluto x \&amp;lt;equiv&amp;gt; (if x \&amp;lt;ge&amp;gt; 0 then x else -x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de simplificación con el condicional if]&lt;br /&gt;
  El valor absoluto de -3 es 3.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;absoluto(-3) = 3&amp;quot;&lt;br /&gt;
by (simp add:absoluto_def) &lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición [Ejemplo con el condicional case]&lt;br /&gt;
  Un número natural n es un sucesor si es de la forma &amp;quot;Suc m&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition es_sucesor :: &amp;quot;nat \&amp;lt;Rightarrow&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_sucesor n \&amp;lt;equiv&amp;gt;&lt;br /&gt;
  (case n of &lt;br /&gt;
    0     \&amp;lt;Rightarrow&amp;gt; False &lt;br /&gt;
  | Suc m \&amp;lt;Rightarrow&amp;gt; True)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de simplificación con el condicional case]&lt;br /&gt;
  El número 3 es sucesor.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;es_sucesor 3&amp;quot;&lt;br /&gt;
by (simp add: es_sucesor_def)&lt;br /&gt;
&lt;br /&gt;
section {* Tipos de datos y recursión primitiva *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición [Ejemplo de definición de tipo de dato recursivo]&lt;br /&gt;
  Una lista de elementos de tipo a es la lista Vacia o se obtiene añadiendo,&lt;br /&gt;
  con ConsLista, un elemento de tipo a a una lista de elementos de tipo a.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a Lista = Vacia | ConsLista &amp;#039;a &amp;quot;&amp;#039;a Lista&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Definición [Ejemplo de definición primitiva recursiva]&lt;br /&gt;
  (conc xs ys) es la concatenación de las lista xs e ys.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec conc :: &amp;quot;&amp;#039;a Lista \&amp;lt;Rightarrow&amp;gt; &amp;#039;a Lista \&amp;lt;Rightarrow&amp;gt; &amp;#039;a Lista&amp;quot; where&lt;br /&gt;
  &amp;quot;conc Vacia ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;conc (ConsLista x xs) ys = ConsLista x (conc xs ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Lema [Ejemplo de simplificación con tipo de dato recursivo]&lt;br /&gt;
  La concatenación de la lista formada por 1 y 2 con la lista formada por el 3&lt;br /&gt;
  es la lista cuyos elementos son 1,2 y 3.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc (ConsLista 1 (ConsLista 2 Vacia)) (ConsLista 3 Vacia) =&lt;br /&gt;
       (ConsLista 1 (ConsLista 2 (ConsLista 3 Vacia)))&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejercicio [Ejemplo de definición primitiva recursiva sobre los naturales] &lt;br /&gt;
  Definir una función que sume los primeros n números naturales y usarla para&lt;br /&gt;
  comprobar que la suma de los 3 primeros números naturales es 6.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
primrec suma :: &amp;quot;nat \&amp;lt;Rightarrow&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma 0 = 0&amp;quot;&lt;br /&gt;
| &amp;quot;suma (Suc m) = (Suc m) + suma m&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;suma 3 = 6&amp;quot;&lt;br /&gt;
by (simp add: suma_def) &lt;br /&gt;
&lt;br /&gt;
value &amp;quot;suma 3&amp;quot;&lt;br /&gt;
value &amp;quot;2+(3::int)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=DAO2011_(Demostraci%C3%B3n_asistida_por_ordenador)&amp;diff=47</id>
		<title>DAO2011 (Demostración asistida por ordenador)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=DAO2011_(Demostraci%C3%B3n_asistida_por_ordenador)&amp;diff=47"/>
		<updated>2012-01-19T14:53:43Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Demostración asistida por ordenador ==&lt;br /&gt;
Este curso es una introducción a la demostración asistida por ordenador usando el sistema [http://www.cl.cam.ac.uk/research/hvg/Isabelle Isabelle/HOL/Isar]). Los objetivos del curso son:&lt;br /&gt;
* desarrollar la capacidad de razonamiento lógico,&lt;br /&gt;
* conocer formalismos de representación del conocimiento matemático,&lt;br /&gt;
* saber usar sistemas de razonamiento y&lt;br /&gt;
* desarrollar teorías matemáticas en sistemas de demostración automática. &lt;br /&gt;
&lt;br /&gt;
Administrativamente, es un [http://www.cfp.us.es/web/ficha_avanzada.asp?id_titulo=846&amp;amp;tipo=FE&amp;amp;basica=1&amp;amp;curso=2010 curso de formación especializada] del [http://www.cfp.us.es/ Centro de Formación Permanente de la Universidad de Sevilla].&lt;br /&gt;
&lt;br /&gt;
== Material para el curso ==&lt;br /&gt;
* [[Temas]]: Teorías de los temas.&lt;br /&gt;
* [[Ejercicios]]: Relaciones de ejercicios.&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao/doc.html Documentación]: Enlaces con documentación.&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao/sistemas.html Sistemas]: Sistemas utilizados.&lt;br /&gt;
* [http://www.glc.us.es/~jalonso/vestigium/tag/dao2011/ Diario]: Descripción diaria de las clases.&lt;br /&gt;
&lt;br /&gt;
== Razonamiento automático (2011-12) ==&lt;br /&gt;
* [[Tema 6: Isabelle como un lenguaje funcional]].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Ejercicios_del_tema_3&amp;diff=38</id>
		<title>Ejercicios del tema 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Ejercicios_del_tema_3&amp;diff=38"/>
		<updated>2011-03-29T11:49:08Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Deducción natural proposicional *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_3_ej&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {* Los ejercicios de esta relación deben de resolverse usando sólo&lt;br /&gt;
  las reglas básicas de la deducción natural proposicional: &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;
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;
lemma ejercicio_1:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5:&lt;br /&gt;
  &amp;quot;p⟶(q⟶r) ⟹ q⟶(p⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6:&lt;br /&gt;
  &amp;quot;p⟶(q⟶r) ⟹ (p⟶q)⟶(p⟶r)&amp;quot;&lt;br /&gt;
oops &lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7:&lt;br /&gt;
  &amp;quot;p ⟹ q⟶p&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_9:&lt;br /&gt;
  &amp;quot;p⟶q ⟹ (q⟶r)⟶(p⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10:&lt;br /&gt;
  &amp;quot;p⟶(q⟶(r⟶s)) ⟹ r⟶(q⟶(p⟶s))&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_12:&lt;br /&gt;
  &amp;quot;(p⟶q)⟶r ⟹ p⟶(q⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13:&lt;br /&gt;
  &amp;quot;⟦p; q⟧ ⟹ p∧q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_14:&lt;br /&gt;
  &amp;quot;p∧q ⟹ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_15:&lt;br /&gt;
  &amp;quot;p∧q ⟹ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16:&lt;br /&gt;
  &amp;quot;p∧(q∧r) ⟹ (p∧q)∧r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_17:&lt;br /&gt;
  &amp;quot;(p∧q)∧r ⟹ p∧(q∧r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18:&lt;br /&gt;
  &amp;quot;p∧q ⟹ p⟶q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_19:&lt;br /&gt;
  &amp;quot;(p⟶q)∧(p⟶r) ⟹ p⟶q∧r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_20:&lt;br /&gt;
  &amp;quot;p⟶q∧r ⟹ (p⟶q)∧(p⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21:&lt;br /&gt;
  &amp;quot;p⟶(q⟶r) ⟹ p∧q⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_22:&lt;br /&gt;
  &amp;quot;p∧q⟶r ⟹ p⟶(q⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_23:&lt;br /&gt;
  &amp;quot;(p⟶q)⟶r ⟹ p∧q⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_24:&lt;br /&gt;
  &amp;quot;p∧(q⟶r) ⟹ (p⟶q)⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_25:&lt;br /&gt;
  &amp;quot;p ⟹ p∨q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_26:&lt;br /&gt;
  &amp;quot;q ⟹ p∨q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_27:&lt;br /&gt;
  &amp;quot;p∨q ⟹ q∨p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_28:&lt;br /&gt;
  &amp;quot;q⟶r ⟹ p∨q⟶p∨r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_29:&lt;br /&gt;
  &amp;quot;p∨p ⟹ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_30:&lt;br /&gt;
  &amp;quot;p ⟹ p∨p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_31:&lt;br /&gt;
  &amp;quot;p∨(q∨r) ⟹ (p∨q)∨r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_32:&lt;br /&gt;
  &amp;quot;(p∨q)∨r ⟹ p∨(q∨r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_33:&lt;br /&gt;
  &amp;quot;p∧(q∨r) ⟹ (p∧q)∨(p∧r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_34:&lt;br /&gt;
  &amp;quot;(p∧q)∨(p∧r) ⟹ p∧(q∨r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_35:&lt;br /&gt;
  &amp;quot;p∨(q∧r) ⟹ (p∨q)∧(p∨r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_36:&lt;br /&gt;
  &amp;quot;(p∨q)∧(p∨r) ⟹ p∨(q∧r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_37:&lt;br /&gt;
  &amp;quot;(p⟶r)∧(q⟶r) ⟹ p∨q⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_38:&lt;br /&gt;
  &amp;quot;p∨q⟶r ⟹ (p⟶r)∧(q⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_39:&lt;br /&gt;
  &amp;quot;p ⟹ ¬¬p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_40:&lt;br /&gt;
  &amp;quot;¬p ⟹ p⟶q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_41:&lt;br /&gt;
  &amp;quot;p⟶q ⟹ ¬q⟶¬p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_42:&lt;br /&gt;
  &amp;quot;⟦p∨q; ¬q⟧ ⟹ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_43:&lt;br /&gt;
  &amp;quot;⟦p∨q; ¬p⟧ ⟹ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_44:&lt;br /&gt;
  &amp;quot;p∨q ⟹ ¬(¬p∧¬q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_45:&lt;br /&gt;
  &amp;quot;p∧q ⟹ ¬(¬p∨¬q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_46:&lt;br /&gt;
  &amp;quot;¬(p∨q) ⟹ ¬p∧¬q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_47:&lt;br /&gt;
  &amp;quot;¬p∧¬q ⟹ ¬(p∨q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_48:&lt;br /&gt;
  &amp;quot;¬p∨¬q ⟹ ¬(p∧q)&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_50:&lt;br /&gt;
  &amp;quot;p∧¬p ⟹ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_51:&lt;br /&gt;
  &amp;quot;¬¬p ⟹ p&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_53:&lt;br /&gt;
  &amp;quot;((p⟶q)⟶p)⟶p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_54:&lt;br /&gt;
  &amp;quot;¬q⟶¬p ⟹ p⟶q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_55:&lt;br /&gt;
  &amp;quot;¬(¬p∧¬q) ⟹ p∨q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_56:&lt;br /&gt;
  &amp;quot;¬(¬p∨¬q) ⟹ p∧q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_57:&lt;br /&gt;
  &amp;quot;¬(p∧q) ⟹ ¬p∨¬q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_58:&amp;quot;(p⟶q)∨(q⟶p)&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>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Ejercicios_del_tema_3&amp;diff=37</id>
		<title>Ejercicios del tema 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Ejercicios_del_tema_3&amp;diff=37"/>
		<updated>2011-03-29T11:48:53Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source language=&amp;quot;isar&amp;quot;&amp;gt; header {* Deducción natural proposicional *}  theory Tema_3_ej imports Main  begin   text {* Los ejercicios de esta relación deben de resolverse usand...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source language=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Deducción natural proposicional *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_3_ej&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {* Los ejercicios de esta relación deben de resolverse usando sólo&lt;br /&gt;
  las reglas básicas de la deducción natural proposicional: &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;
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;
lemma ejercicio_1:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5:&lt;br /&gt;
  &amp;quot;p⟶(q⟶r) ⟹ q⟶(p⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6:&lt;br /&gt;
  &amp;quot;p⟶(q⟶r) ⟹ (p⟶q)⟶(p⟶r)&amp;quot;&lt;br /&gt;
oops &lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7:&lt;br /&gt;
  &amp;quot;p ⟹ q⟶p&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_9:&lt;br /&gt;
  &amp;quot;p⟶q ⟹ (q⟶r)⟶(p⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10:&lt;br /&gt;
  &amp;quot;p⟶(q⟶(r⟶s)) ⟹ r⟶(q⟶(p⟶s))&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_12:&lt;br /&gt;
  &amp;quot;(p⟶q)⟶r ⟹ p⟶(q⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13:&lt;br /&gt;
  &amp;quot;⟦p; q⟧ ⟹ p∧q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_14:&lt;br /&gt;
  &amp;quot;p∧q ⟹ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_15:&lt;br /&gt;
  &amp;quot;p∧q ⟹ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16:&lt;br /&gt;
  &amp;quot;p∧(q∧r) ⟹ (p∧q)∧r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_17:&lt;br /&gt;
  &amp;quot;(p∧q)∧r ⟹ p∧(q∧r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18:&lt;br /&gt;
  &amp;quot;p∧q ⟹ p⟶q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_19:&lt;br /&gt;
  &amp;quot;(p⟶q)∧(p⟶r) ⟹ p⟶q∧r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_20:&lt;br /&gt;
  &amp;quot;p⟶q∧r ⟹ (p⟶q)∧(p⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21:&lt;br /&gt;
  &amp;quot;p⟶(q⟶r) ⟹ p∧q⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_22:&lt;br /&gt;
  &amp;quot;p∧q⟶r ⟹ p⟶(q⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_23:&lt;br /&gt;
  &amp;quot;(p⟶q)⟶r ⟹ p∧q⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_24:&lt;br /&gt;
  &amp;quot;p∧(q⟶r) ⟹ (p⟶q)⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_25:&lt;br /&gt;
  &amp;quot;p ⟹ p∨q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_26:&lt;br /&gt;
  &amp;quot;q ⟹ p∨q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_27:&lt;br /&gt;
  &amp;quot;p∨q ⟹ q∨p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_28:&lt;br /&gt;
  &amp;quot;q⟶r ⟹ p∨q⟶p∨r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_29:&lt;br /&gt;
  &amp;quot;p∨p ⟹ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_30:&lt;br /&gt;
  &amp;quot;p ⟹ p∨p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_31:&lt;br /&gt;
  &amp;quot;p∨(q∨r) ⟹ (p∨q)∨r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_32:&lt;br /&gt;
  &amp;quot;(p∨q)∨r ⟹ p∨(q∨r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_33:&lt;br /&gt;
  &amp;quot;p∧(q∨r) ⟹ (p∧q)∨(p∧r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_34:&lt;br /&gt;
  &amp;quot;(p∧q)∨(p∧r) ⟹ p∧(q∨r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_35:&lt;br /&gt;
  &amp;quot;p∨(q∧r) ⟹ (p∨q)∧(p∨r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_36:&lt;br /&gt;
  &amp;quot;(p∨q)∧(p∨r) ⟹ p∨(q∧r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_37:&lt;br /&gt;
  &amp;quot;(p⟶r)∧(q⟶r) ⟹ p∨q⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_38:&lt;br /&gt;
  &amp;quot;p∨q⟶r ⟹ (p⟶r)∧(q⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_39:&lt;br /&gt;
  &amp;quot;p ⟹ ¬¬p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_40:&lt;br /&gt;
  &amp;quot;¬p ⟹ p⟶q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_41:&lt;br /&gt;
  &amp;quot;p⟶q ⟹ ¬q⟶¬p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_42:&lt;br /&gt;
  &amp;quot;⟦p∨q; ¬q⟧ ⟹ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_43:&lt;br /&gt;
  &amp;quot;⟦p∨q; ¬p⟧ ⟹ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_44:&lt;br /&gt;
  &amp;quot;p∨q ⟹ ¬(¬p∧¬q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_45:&lt;br /&gt;
  &amp;quot;p∧q ⟹ ¬(¬p∨¬q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_46:&lt;br /&gt;
  &amp;quot;¬(p∨q) ⟹ ¬p∧¬q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_47:&lt;br /&gt;
  &amp;quot;¬p∧¬q ⟹ ¬(p∨q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_48:&lt;br /&gt;
  &amp;quot;¬p∨¬q ⟹ ¬(p∧q)&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_50:&lt;br /&gt;
  &amp;quot;p∧¬p ⟹ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_51:&lt;br /&gt;
  &amp;quot;¬¬p ⟹ p&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_53:&lt;br /&gt;
  &amp;quot;((p⟶q)⟶p)⟶p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_54:&lt;br /&gt;
  &amp;quot;¬q⟶¬p ⟹ p⟶q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_55:&lt;br /&gt;
  &amp;quot;¬(¬p∧¬q) ⟹ p∨q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_56:&lt;br /&gt;
  &amp;quot;¬(¬p∨¬q) ⟹ p∧q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_57:&lt;br /&gt;
  &amp;quot;¬(p∧q) ⟹ ¬p∨¬q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_58:&amp;quot;(p⟶q)∨(q⟶p)&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>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_3_ej&amp;diff=36</id>
		<title>Tema 3 ej</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_3_ej&amp;diff=36"/>
		<updated>2011-03-29T11:46:43Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Tema 3 ej» ([edit=sysop] (indefinido) [move=sysop] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Deducción natural proposicional *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_3_ej&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {* Los ejercicios de esta relación deben de resolverse usando sólo&lt;br /&gt;
  las reglas básicas de la deducción natural proposicional: &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;
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;
lemma ejercicio_1:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5:&lt;br /&gt;
  &amp;quot;p⟶(q⟶r) ⟹ q⟶(p⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6:&lt;br /&gt;
  &amp;quot;p⟶(q⟶r) ⟹ (p⟶q)⟶(p⟶r)&amp;quot;&lt;br /&gt;
oops &lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7:&lt;br /&gt;
  &amp;quot;p ⟹ q⟶p&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_9:&lt;br /&gt;
  &amp;quot;p⟶q ⟹ (q⟶r)⟶(p⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10:&lt;br /&gt;
  &amp;quot;p⟶(q⟶(r⟶s)) ⟹ r⟶(q⟶(p⟶s))&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_12:&lt;br /&gt;
  &amp;quot;(p⟶q)⟶r ⟹ p⟶(q⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13:&lt;br /&gt;
  &amp;quot;⟦p; q⟧ ⟹ p∧q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_14:&lt;br /&gt;
  &amp;quot;p∧q ⟹ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_15:&lt;br /&gt;
  &amp;quot;p∧q ⟹ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16:&lt;br /&gt;
  &amp;quot;p∧(q∧r) ⟹ (p∧q)∧r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_17:&lt;br /&gt;
  &amp;quot;(p∧q)∧r ⟹ p∧(q∧r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18:&lt;br /&gt;
  &amp;quot;p∧q ⟹ p⟶q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_19:&lt;br /&gt;
  &amp;quot;(p⟶q)∧(p⟶r) ⟹ p⟶q∧r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_20:&lt;br /&gt;
  &amp;quot;p⟶q∧r ⟹ (p⟶q)∧(p⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21:&lt;br /&gt;
  &amp;quot;p⟶(q⟶r) ⟹ p∧q⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_22:&lt;br /&gt;
  &amp;quot;p∧q⟶r ⟹ p⟶(q⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_23:&lt;br /&gt;
  &amp;quot;(p⟶q)⟶r ⟹ p∧q⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_24:&lt;br /&gt;
  &amp;quot;p∧(q⟶r) ⟹ (p⟶q)⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_25:&lt;br /&gt;
  &amp;quot;p ⟹ p∨q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_26:&lt;br /&gt;
  &amp;quot;q ⟹ p∨q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_27:&lt;br /&gt;
  &amp;quot;p∨q ⟹ q∨p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_28:&lt;br /&gt;
  &amp;quot;q⟶r ⟹ p∨q⟶p∨r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_29:&lt;br /&gt;
  &amp;quot;p∨p ⟹ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_30:&lt;br /&gt;
  &amp;quot;p ⟹ p∨p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_31:&lt;br /&gt;
  &amp;quot;p∨(q∨r) ⟹ (p∨q)∨r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_32:&lt;br /&gt;
  &amp;quot;(p∨q)∨r ⟹ p∨(q∨r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_33:&lt;br /&gt;
  &amp;quot;p∧(q∨r) ⟹ (p∧q)∨(p∧r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_34:&lt;br /&gt;
  &amp;quot;(p∧q)∨(p∧r) ⟹ p∧(q∨r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_35:&lt;br /&gt;
  &amp;quot;p∨(q∧r) ⟹ (p∨q)∧(p∨r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_36:&lt;br /&gt;
  &amp;quot;(p∨q)∧(p∨r) ⟹ p∨(q∧r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_37:&lt;br /&gt;
  &amp;quot;(p⟶r)∧(q⟶r) ⟹ p∨q⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_38:&lt;br /&gt;
  &amp;quot;p∨q⟶r ⟹ (p⟶r)∧(q⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_39:&lt;br /&gt;
  &amp;quot;p ⟹ ¬¬p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_40:&lt;br /&gt;
  &amp;quot;¬p ⟹ p⟶q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_41:&lt;br /&gt;
  &amp;quot;p⟶q ⟹ ¬q⟶¬p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_42:&lt;br /&gt;
  &amp;quot;⟦p∨q; ¬q⟧ ⟹ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_43:&lt;br /&gt;
  &amp;quot;⟦p∨q; ¬p⟧ ⟹ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_44:&lt;br /&gt;
  &amp;quot;p∨q ⟹ ¬(¬p∧¬q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_45:&lt;br /&gt;
  &amp;quot;p∧q ⟹ ¬(¬p∨¬q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_46:&lt;br /&gt;
  &amp;quot;¬(p∨q) ⟹ ¬p∧¬q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_47:&lt;br /&gt;
  &amp;quot;¬p∧¬q ⟹ ¬(p∨q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_48:&lt;br /&gt;
  &amp;quot;¬p∨¬q ⟹ ¬(p∧q)&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_50:&lt;br /&gt;
  &amp;quot;p∧¬p ⟹ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_51:&lt;br /&gt;
  &amp;quot;¬¬p ⟹ p&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_53:&lt;br /&gt;
  &amp;quot;((p⟶q)⟶p)⟶p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_54:&lt;br /&gt;
  &amp;quot;¬q⟶¬p ⟹ p⟶q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_55:&lt;br /&gt;
  &amp;quot;¬(¬p∧¬q) ⟹ p∨q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_56:&lt;br /&gt;
  &amp;quot;¬(¬p∨¬q) ⟹ p∧q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_57:&lt;br /&gt;
  &amp;quot;¬(p∧q) ⟹ ¬p∨¬q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_58:&amp;quot;(p⟶q)∨(q⟶p)&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>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_3_ej&amp;diff=35</id>
		<title>Tema 3 ej</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_3_ej&amp;diff=35"/>
		<updated>2011-03-29T11:46:34Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; header {* Deducción natural proposicional *}  theory Tema_3_ej imports Main  begin   text {* Los ejercicios de esta relación deben de resolverse usando s...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Deducción natural proposicional *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_3_ej&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {* Los ejercicios de esta relación deben de resolverse usando sólo&lt;br /&gt;
  las reglas básicas de la deducción natural proposicional: &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;
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;
lemma ejercicio_1:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_4:&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;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5:&lt;br /&gt;
  &amp;quot;p⟶(q⟶r) ⟹ q⟶(p⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_6:&lt;br /&gt;
  &amp;quot;p⟶(q⟶r) ⟹ (p⟶q)⟶(p⟶r)&amp;quot;&lt;br /&gt;
oops &lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_7:&lt;br /&gt;
  &amp;quot;p ⟹ q⟶p&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_9:&lt;br /&gt;
  &amp;quot;p⟶q ⟹ (q⟶r)⟶(p⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_10:&lt;br /&gt;
  &amp;quot;p⟶(q⟶(r⟶s)) ⟹ r⟶(q⟶(p⟶s))&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_12:&lt;br /&gt;
  &amp;quot;(p⟶q)⟶r ⟹ p⟶(q⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_13:&lt;br /&gt;
  &amp;quot;⟦p; q⟧ ⟹ p∧q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_14:&lt;br /&gt;
  &amp;quot;p∧q ⟹ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_15:&lt;br /&gt;
  &amp;quot;p∧q ⟹ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_16:&lt;br /&gt;
  &amp;quot;p∧(q∧r) ⟹ (p∧q)∧r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_17:&lt;br /&gt;
  &amp;quot;(p∧q)∧r ⟹ p∧(q∧r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_18:&lt;br /&gt;
  &amp;quot;p∧q ⟹ p⟶q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_19:&lt;br /&gt;
  &amp;quot;(p⟶q)∧(p⟶r) ⟹ p⟶q∧r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_20:&lt;br /&gt;
  &amp;quot;p⟶q∧r ⟹ (p⟶q)∧(p⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_21:&lt;br /&gt;
  &amp;quot;p⟶(q⟶r) ⟹ p∧q⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_22:&lt;br /&gt;
  &amp;quot;p∧q⟶r ⟹ p⟶(q⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_23:&lt;br /&gt;
  &amp;quot;(p⟶q)⟶r ⟹ p∧q⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_24:&lt;br /&gt;
  &amp;quot;p∧(q⟶r) ⟹ (p⟶q)⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_25:&lt;br /&gt;
  &amp;quot;p ⟹ p∨q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_26:&lt;br /&gt;
  &amp;quot;q ⟹ p∨q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_27:&lt;br /&gt;
  &amp;quot;p∨q ⟹ q∨p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_28:&lt;br /&gt;
  &amp;quot;q⟶r ⟹ p∨q⟶p∨r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_29:&lt;br /&gt;
  &amp;quot;p∨p ⟹ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_30:&lt;br /&gt;
  &amp;quot;p ⟹ p∨p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_31:&lt;br /&gt;
  &amp;quot;p∨(q∨r) ⟹ (p∨q)∨r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_32:&lt;br /&gt;
  &amp;quot;(p∨q)∨r ⟹ p∨(q∨r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_33:&lt;br /&gt;
  &amp;quot;p∧(q∨r) ⟹ (p∧q)∨(p∧r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_34:&lt;br /&gt;
  &amp;quot;(p∧q)∨(p∧r) ⟹ p∧(q∨r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_35:&lt;br /&gt;
  &amp;quot;p∨(q∧r) ⟹ (p∨q)∧(p∨r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_36:&lt;br /&gt;
  &amp;quot;(p∨q)∧(p∨r) ⟹ p∨(q∧r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_37:&lt;br /&gt;
  &amp;quot;(p⟶r)∧(q⟶r) ⟹ p∨q⟶r&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_38:&lt;br /&gt;
  &amp;quot;p∨q⟶r ⟹ (p⟶r)∧(q⟶r)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_39:&lt;br /&gt;
  &amp;quot;p ⟹ ¬¬p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_40:&lt;br /&gt;
  &amp;quot;¬p ⟹ p⟶q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_41:&lt;br /&gt;
  &amp;quot;p⟶q ⟹ ¬q⟶¬p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_42:&lt;br /&gt;
  &amp;quot;⟦p∨q; ¬q⟧ ⟹ p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_43:&lt;br /&gt;
  &amp;quot;⟦p∨q; ¬p⟧ ⟹ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_44:&lt;br /&gt;
  &amp;quot;p∨q ⟹ ¬(¬p∧¬q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_45:&lt;br /&gt;
  &amp;quot;p∧q ⟹ ¬(¬p∨¬q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_46:&lt;br /&gt;
  &amp;quot;¬(p∨q) ⟹ ¬p∧¬q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_47:&lt;br /&gt;
  &amp;quot;¬p∧¬q ⟹ ¬(p∨q)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_48:&lt;br /&gt;
  &amp;quot;¬p∨¬q ⟹ ¬(p∧q)&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_50:&lt;br /&gt;
  &amp;quot;p∧¬p ⟹ q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_51:&lt;br /&gt;
  &amp;quot;¬¬p ⟹ p&amp;quot;&lt;br /&gt;
oops&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;
lemma ejercicio_53:&lt;br /&gt;
  &amp;quot;((p⟶q)⟶p)⟶p&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_54:&lt;br /&gt;
  &amp;quot;¬q⟶¬p ⟹ p⟶q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_55:&lt;br /&gt;
  &amp;quot;¬(¬p∧¬q) ⟹ p∨q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_56:&lt;br /&gt;
  &amp;quot;¬(¬p∨¬q) ⟹ p∧q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_57:&lt;br /&gt;
  &amp;quot;¬(p∧q) ⟹ ¬p∨¬q&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_58:&amp;quot;(p⟶q)∨(q⟶p)&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>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Ejercicios&amp;diff=34</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Ejercicios&amp;diff=34"/>
		<updated>2011-03-29T11:26:55Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Ejercicios de Demostración asistida por ordenador */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ejercicios de &amp;#039;&amp;#039;Demostración asistida por ordenador&amp;#039;&amp;#039; ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 2:&amp;#039;&amp;#039;&amp;#039; Razonamiento sobre programas ([[Rel_1|Enunciado]] y [[Relación 1|Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 3:&amp;#039;&amp;#039;&amp;#039; Deducción natural proposicional con Isabelle ([[Tema_3_ej|Enunciado]] y [[Ejercicios del tema 3 |Solución colaborativa]]).&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_3:_Deducci%C3%B3n_l%C3%B3gica_proposicional_con_Isabelle&amp;diff=33</id>
		<title>Tema 3: Deducción lógica proposicional con Isabelle</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_3:_Deducci%C3%B3n_l%C3%B3gica_proposicional_con_Isabelle&amp;diff=33"/>
		<updated>2011-03-29T11:24:12Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Tema 3: Deducción lógica proposicional con Isabelle» ([edit=sysop] (indefinido) [move=sysop] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Deducción natural proposicional *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En esta teoría se presentan los ejemplos del tema de deducción natural&lt;br /&gt;
  proposicional siguiendo la presentación de Huth y Ryan en su libro&lt;br /&gt;
  &amp;quot;Logic in Computer Science&amp;quot;&lt;br /&gt;
  http://www.cs.bham.ac.uk/research/projects/lics/ y, más concretamente,&lt;br /&gt;
  a la forma como se explica en la asignatura de &amp;quot;Lógica informática&amp;quot; y&lt;br /&gt;
  que puede verse en  &lt;br /&gt;
  http://www.cs.us.es/~jalonso/cursos/li/temas/tema-2.pdf&lt;br /&gt;
 &lt;br /&gt;
  La página al lado de cada teorema indica la página de las anteriores&lt;br /&gt;
  transparencias donde se encuentra la demostración.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Reglas de la conjunción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de introducción de la conjunción es&lt;br /&gt;
  · conjI:      ⟦P; Q⟧ ⟹ P ∧ Q&lt;br /&gt;
  Las reglas de eliminación de la conjunción son&lt;br /&gt;
  · conjunct1:  P ∧ Q ⟹ P&lt;br /&gt;
  · conjunct2:  P ∧ Q ⟹ Q  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 4&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;p ∧ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;r&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∧ r&amp;quot;     &lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;q ∧ r&amp;quot; using 3 2 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;(p ∧ q) ∧ r&amp;quot; and &lt;br /&gt;
          2: &amp;quot;s ∧ t&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∧ s&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;p ∧ q&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot; using 3 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;s&amp;quot; using 2 by (rule conjunct1)&lt;br /&gt;
  show &amp;quot;q ∧ s&amp;quot; using 4 5 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Reglas de la doble negación *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de eliminación de la doble negación es&lt;br /&gt;
  · notnotD: ¬¬ P ⟹ P&lt;br /&gt;
  Para ajustarnos al tema de LI vamos a introducir la siguiente regla de&lt;br /&gt;
  introducción de la doble negación&lt;br /&gt;
  . notnotI: P ⟹ ¬¬ P&lt;br /&gt;
  que, de momento, no detallamos su demostració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 -- &amp;quot;p. 5&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;p&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;
  have 3: &amp;quot;¬¬p&amp;quot; using 1 by (rule notnotI)&lt;br /&gt;
  have 4: &amp;quot;q ∧ r&amp;quot; using 2 by (rule notnotD)&lt;br /&gt;
  have 5: &amp;quot;r&amp;quot; using 4 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;¬¬p ∧ r&amp;quot; using 3 5 by (rule conjI)&lt;br /&gt;
qed        &lt;br /&gt;
&lt;br /&gt;
section {* Regla de eliminación del condicional *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de eliminación del condicional es la regla del modus ponens&lt;br /&gt;
  · mp: ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 6&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;¬p ∧ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;¬p ∧ q ⟶ r ∨ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;r ∨ ¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;r ∨ ¬p&amp;quot; using 2 1 by (rule mp)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 6&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p ⟶ q&amp;quot; and &lt;br /&gt;
          3: &amp;quot;p ⟶ (q ⟶ r)&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 2 1 by (rule mp)&lt;br /&gt;
  have 5: &amp;quot;q ⟶ r&amp;quot; using 3 1 by (rule mp)&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 5 4 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Regla derivada del modus tollens *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Para ajustarnos al tema de LI vamos a introducir la regla del modus&lt;br /&gt;
  tollens&lt;br /&gt;
  · mt: ⟦F ⟶ G; ¬G⟧ ⟹ ¬F &lt;br /&gt;
  sin, de momento, detallar su demostración.&lt;br /&gt;
*}&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;
lemma -- &amp;quot;p. 7&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p&amp;quot; and &lt;br /&gt;
          3: &amp;quot;¬r&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
  show &amp;quot;¬q&amp;quot; using 4 3 by (rule mt)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 7&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;¬p ⟶ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;¬q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;¬¬p&amp;quot; using 1 2 by (rule mt)&lt;br /&gt;
  show &amp;quot;p&amp;quot; using 3 by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ ¬q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;¬¬q&amp;quot; using 2 by (rule notnotI)&lt;br /&gt;
  show &amp;quot;¬p&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Regla de introducción del condicional *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de introducción del condicional es&lt;br /&gt;
  · impI: (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 8&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 3: &amp;quot;¬q&amp;quot;&lt;br /&gt;
    have &amp;quot;¬p&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
  } thus &amp;quot;¬q ⟶ ¬p&amp;quot; by (rule impI)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 8&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 3: &amp;quot;¬q&amp;quot;&lt;br /&gt;
  show &amp;quot;¬p&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 8&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 3: &amp;quot;¬q&amp;quot;&lt;br /&gt;
  show &amp;quot;¬p&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 9&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;¬q ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ ¬¬q&amp;quot;   &lt;br /&gt;
proof -&lt;br /&gt;
  { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;¬¬p&amp;quot; using 2 by (rule notnotI)&lt;br /&gt;
    have &amp;quot;¬¬q&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
  } thus &amp;quot;p ⟶ ¬¬q&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 9&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;¬q ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ ¬¬q&amp;quot;   &lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;¬¬p&amp;quot; using 2 by (rule notnotI)&lt;br /&gt;
  show &amp;quot;¬¬q&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 9&amp;quot;&lt;br /&gt;
  &amp;quot;p ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 10&amp;quot;&lt;br /&gt;
  &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 1: &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
    { assume 2: &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
      { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
        have 4: &amp;quot;¬¬p&amp;quot; using 3 by (rule notnotI)&lt;br /&gt;
        have 5: &amp;quot;¬¬q&amp;quot; using 2 4 by (rule mt)&lt;br /&gt;
        have 6: &amp;quot;q&amp;quot; using 5 by (rule notnotD)&lt;br /&gt;
        have &amp;quot;r&amp;quot; using 1 6 by (rule mp) &lt;br /&gt;
      } hence &amp;quot;p ⟶ r&amp;quot; by (rule impI)&lt;br /&gt;
    } hence &amp;quot;(¬q ⟶ ¬p) ⟶ p ⟶ r&amp;quot; by (rule impI)&lt;br /&gt;
  } thus &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ p ⟶ r)&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 10&amp;quot;&lt;br /&gt;
  &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  show &amp;quot;(¬q ⟶ ¬p) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume 2: &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
      show &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 4: &amp;quot;¬¬p&amp;quot; using 3 by (rule notnotI)&lt;br /&gt;
          have 5: &amp;quot;¬¬q&amp;quot; using 2 4 by (rule mt)&lt;br /&gt;
          have 6: &amp;quot;q&amp;quot; using 5 by (rule notnotD)&lt;br /&gt;
          show &amp;quot;r&amp;quot; using 1 6 by (rule mp)&lt;br /&gt;
        qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &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 2: &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 3: &amp;quot;q&amp;quot;&lt;br /&gt;
      have 4: &amp;quot;p ∧ q&amp;quot; using 2 3 by (rule conjI)&lt;br /&gt;
      show &amp;quot;r&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &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 2: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot; using 2 by (rule conjunct1)&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 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ r ⟶ q ∧ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ r&amp;quot;&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 1 3 by (rule mp)&lt;br /&gt;
  have 5: &amp;quot;r&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;q ∧ r&amp;quot; using 4 5 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Reglas de la disyunción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Las reglas de la introducción de la disyunción son&lt;br /&gt;
  · disjI1: P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2: Q ⟹ P ∨ Q&lt;br /&gt;
  La regla de elimación de la disyunción es&lt;br /&gt;
  · disjE:  ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 11&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
using 1&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;q ∨ p&amp;quot; using 2 by (rule disjI2) }&lt;br /&gt;
next&lt;br /&gt;
  { assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;q ∨ p&amp;quot; using 3 by (rule disjI1) }&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 12&amp;quot;&lt;br /&gt;
  assumes 1: &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 2: &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  thus &amp;quot;p ∨ r&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
      show &amp;quot;p ∨ r&amp;quot; using 3 by (rule disjI1) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume 4: &amp;quot;q&amp;quot;&lt;br /&gt;
      have 5: &amp;quot;r&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
      show &amp;quot;p ∨ r&amp;quot; using 5 by (rule disjI2) }&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;(p ∨ q) ∨ r&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
using 1&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  { assume 2: &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
    thus &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
      { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
        show &amp;quot;p ∨ (q ∨ r)&amp;quot; using 3 by (rule disjI1) }&lt;br /&gt;
    next&lt;br /&gt;
      { assume 4: &amp;quot;q&amp;quot;&lt;br /&gt;
        have 5: &amp;quot;q ∨ r&amp;quot; using 4 by (rule disjI1)&lt;br /&gt;
        show &amp;quot;p ∨ (q ∨ r)&amp;quot; using 5 by (rule disjI2) }&lt;br /&gt;
    qed }&lt;br /&gt;
next&lt;br /&gt;
  { assume 6: &amp;quot;r&amp;quot;&lt;br /&gt;
    have 7: &amp;quot;q ∨ r&amp;quot; using 6 by (rule disjI2)&lt;br /&gt;
    show &amp;quot;p ∨ (q ∨ r)&amp;quot; using 7 by (rule disjI2) }&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma &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;
  have 2: &amp;quot;p&amp;quot; using 1 ..&lt;br /&gt;
  have &amp;quot;q ∨ r&amp;quot; using 1 ..&lt;br /&gt;
  thus &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
      have &amp;quot;p ∧ q&amp;quot; using 2 3 by (rule conjI)&lt;br /&gt;
      thus &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; by (rule disjI1) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume 4: &amp;quot;r&amp;quot;&lt;br /&gt;
      have &amp;quot;p ∧ r&amp;quot; using 2 4 by (rule conjI)&lt;br /&gt;
      thus &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; by (rule disjI2) }&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
section {* Regla de copia *}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 13&amp;quot;&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ p&amp;quot; &lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;p&amp;quot; using 1 by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 13&amp;quot;&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  thus &amp;quot;q ⟶ p&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Reglas de la negación *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de eliminación de lo falso es&lt;br /&gt;
  · FalseE: False ⟹ P&lt;br /&gt;
  La regla de eliminación de la negación es&lt;br /&gt;
  · notE: ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  La regla de introducción de la negación es&lt;br /&gt;
  · notI: (P ⟹ False) ⟹ ¬P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 15&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;¬p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  note 1&lt;br /&gt;
  thus &amp;quot;q&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume 3: &amp;quot;¬p&amp;quot;&lt;br /&gt;
      show &amp;quot;q&amp;quot; using 3 2 by (rule notE) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume &amp;quot;q&amp;quot;&lt;br /&gt;
      thus &amp;quot;q&amp;quot; by this}&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 16&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p ⟶ ¬q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p&amp;quot;    &lt;br /&gt;
proof (rule notI)&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;¬q&amp;quot; using 2 3 by (rule mp)&lt;br /&gt;
  show False using 5 4 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma  &lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;¬p&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
  show False using 3 2 by (rule notE)&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;p ∧ ¬q ⟶ r&amp;quot; and &lt;br /&gt;
          2: &amp;quot;¬r&amp;quot; and &lt;br /&gt;
          3: &amp;quot;p&amp;quot; &lt;br /&gt;
  shows &amp;quot;q&amp;quot;    &lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬¬q&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume 4: &amp;quot;¬q&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;p ∧ ¬q&amp;quot; using 3 4 by (rule conjI)&lt;br /&gt;
    have 6: &amp;quot;r&amp;quot; using 1 5 by (rule mp)&lt;br /&gt;
    show False using 2 6 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  thus &amp;quot;q&amp;quot; by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p&amp;quot; and &lt;br /&gt;
          3: &amp;quot;¬r&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 4: &amp;quot;q&amp;quot;&lt;br /&gt;
  have 5: &amp;quot;q ⟶ r&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
  have 6: &amp;quot;r&amp;quot; using 5 4 by (rule mp)&lt;br /&gt;
  show False using 3 6 by (rule notE)&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
section {* Reglas del bicondicional *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de introducción del bicondicional es&lt;br /&gt;
  · iffI: ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P = Q&lt;br /&gt;
  Las reglas de eliminación del bicondicional son&lt;br /&gt;
  · iffD1: ⟦Q = P; Q⟧ ⟹ P &lt;br /&gt;
  · iffD2: ⟦P = Q; Q⟧ ⟹ P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 17&amp;quot;&lt;br /&gt;
  &amp;quot;(p ∧ q) = (q ∧ p)&amp;quot;&lt;br /&gt;
proof (rule iffI)&lt;br /&gt;
  { assume 1: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
    have 2: &amp;quot;p&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
    have 3: &amp;quot;q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
    show &amp;quot;q ∧ p&amp;quot; using 3 2 by (rule conjI) }&lt;br /&gt;
next&lt;br /&gt;
  { assume 4: &amp;quot;q ∧ p&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;q&amp;quot; using 4 by (rule conjunct1)&lt;br /&gt;
    have 6: &amp;quot;p&amp;quot; using 4 by (rule conjunct2)&lt;br /&gt;
    show &amp;quot;p ∧ q&amp;quot; using 6 5 by (rule conjI) }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 18&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p = q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p ∨ q&amp;quot;  &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
using 2&lt;br /&gt;
proof (rule disjE)&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 iffD1)&lt;br /&gt;
    show &amp;quot;p ∧ q&amp;quot; using 3 4 by (rule conjI) }&lt;br /&gt;
next&lt;br /&gt;
  { assume 5: &amp;quot;q&amp;quot;&lt;br /&gt;
    have 6: &amp;quot;p&amp;quot; using 1 5 by (rule iffD2)&lt;br /&gt;
    show &amp;quot;p ∧ q&amp;quot; using 6 5 by (rule conjI) }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Reglas derivadas *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Regla del modus tollens *}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 20&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;F ⟶ G&amp;quot; and &lt;br /&gt;
          2: &amp;quot;¬G&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬F&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 3: &amp;quot;F&amp;quot;&lt;br /&gt;
  have 4: &amp;quot;G&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
  show False using 2 4 by (rule notE)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
subsection {* Regla de la introducción de la doble negación *}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 21&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;F&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬¬F&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 2: &amp;quot;¬F&amp;quot;&lt;br /&gt;
  show False using 2 1 by (rule notE)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
subsection {* Regla de reducción al absurdo *}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 22&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;¬F ⟶ False&amp;quot; &lt;br /&gt;
  shows &amp;quot;F&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 2: &amp;quot;¬¬F&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume 3: &amp;quot;¬F&amp;quot;&lt;br /&gt;
    show False using 1 3 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;F&amp;quot; using 2 by (rule notnotD)&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de reducción al absurdo en Isabelle se correponde con la&lt;br /&gt;
  regla de contradicción &lt;br /&gt;
  · ccontr: (¬P ⟹ False) ⟹ P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Ley del tercio excluso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La ley del tercio excluso es &lt;br /&gt;
  · excluded_middle: ¬P ∨ P&lt;br /&gt;
  Puede demostrarse como se muestra a continuación.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 23&amp;quot;&lt;br /&gt;
  &amp;quot;F ∨ ¬F&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume 1: &amp;quot;¬(F ∨ ¬F)&amp;quot;&lt;br /&gt;
  thus False&lt;br /&gt;
  proof (rule notE)&lt;br /&gt;
    show &amp;quot;F ∨ ¬F&amp;quot;&lt;br /&gt;
    proof (rule disjI2)&lt;br /&gt;
      show &amp;quot;¬F&amp;quot;&lt;br /&gt;
      proof (rule notI)&lt;br /&gt;
        assume 2: &amp;quot;F&amp;quot;&lt;br /&gt;
        hence 3: &amp;quot;F ∨ ¬F&amp;quot; by (rule disjI1)&lt;br /&gt;
        show False using 1 3 by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
    &lt;br /&gt;
lemma -- &amp;quot;p. 24&amp;quot;&lt;br /&gt;
  assumes 1: &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; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;¬p ∨ q&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      thus &amp;quot;¬p ∨ q&amp;quot; by (rule disjI1) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;q&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
      thus &amp;quot;¬p ∨ q&amp;quot; by (rule disjI2) }&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_3:_Deducci%C3%B3n_l%C3%B3gica_proposicional_con_Isabelle&amp;diff=32</id>
		<title>Tema 3: Deducción lógica proposicional con Isabelle</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Tema_3:_Deducci%C3%B3n_l%C3%B3gica_proposicional_con_Isabelle&amp;diff=32"/>
		<updated>2011-03-29T11:24:01Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; header {* Deducción natural proposicional *}  theory Tema_3 imports Main  begin  text {*   En esta teoría se presentan los ejemplos del tema de deducción...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Deducción natural proposicional *}&lt;br /&gt;
&lt;br /&gt;
theory Tema_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En esta teoría se presentan los ejemplos del tema de deducción natural&lt;br /&gt;
  proposicional siguiendo la presentación de Huth y Ryan en su libro&lt;br /&gt;
  &amp;quot;Logic in Computer Science&amp;quot;&lt;br /&gt;
  http://www.cs.bham.ac.uk/research/projects/lics/ y, más concretamente,&lt;br /&gt;
  a la forma como se explica en la asignatura de &amp;quot;Lógica informática&amp;quot; y&lt;br /&gt;
  que puede verse en  &lt;br /&gt;
  http://www.cs.us.es/~jalonso/cursos/li/temas/tema-2.pdf&lt;br /&gt;
 &lt;br /&gt;
  La página al lado de cada teorema indica la página de las anteriores&lt;br /&gt;
  transparencias donde se encuentra la demostración.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Reglas de la conjunción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de introducción de la conjunción es&lt;br /&gt;
  · conjI:      ⟦P; Q⟧ ⟹ P ∧ Q&lt;br /&gt;
  Las reglas de eliminación de la conjunción son&lt;br /&gt;
  · conjunct1:  P ∧ Q ⟹ P&lt;br /&gt;
  · conjunct2:  P ∧ Q ⟹ Q  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 4&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;p ∧ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;r&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∧ r&amp;quot;     &lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;q ∧ r&amp;quot; using 3 2 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;(p ∧ q) ∧ r&amp;quot; and &lt;br /&gt;
          2: &amp;quot;s ∧ t&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∧ s&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;p ∧ q&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot; using 3 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;s&amp;quot; using 2 by (rule conjunct1)&lt;br /&gt;
  show &amp;quot;q ∧ s&amp;quot; using 4 5 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Reglas de la doble negación *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de eliminación de la doble negación es&lt;br /&gt;
  · notnotD: ¬¬ P ⟹ P&lt;br /&gt;
  Para ajustarnos al tema de LI vamos a introducir la siguiente regla de&lt;br /&gt;
  introducción de la doble negación&lt;br /&gt;
  . notnotI: P ⟹ ¬¬ P&lt;br /&gt;
  que, de momento, no detallamos su demostració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 -- &amp;quot;p. 5&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;p&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;
  have 3: &amp;quot;¬¬p&amp;quot; using 1 by (rule notnotI)&lt;br /&gt;
  have 4: &amp;quot;q ∧ r&amp;quot; using 2 by (rule notnotD)&lt;br /&gt;
  have 5: &amp;quot;r&amp;quot; using 4 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;¬¬p ∧ r&amp;quot; using 3 5 by (rule conjI)&lt;br /&gt;
qed        &lt;br /&gt;
&lt;br /&gt;
section {* Regla de eliminación del condicional *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de eliminación del condicional es la regla del modus ponens&lt;br /&gt;
  · mp: ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 6&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;¬p ∧ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;¬p ∧ q ⟶ r ∨ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;r ∨ ¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;r ∨ ¬p&amp;quot; using 2 1 by (rule mp)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 6&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p ⟶ q&amp;quot; and &lt;br /&gt;
          3: &amp;quot;p ⟶ (q ⟶ r)&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 2 1 by (rule mp)&lt;br /&gt;
  have 5: &amp;quot;q ⟶ r&amp;quot; using 3 1 by (rule mp)&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 5 4 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Regla derivada del modus tollens *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Para ajustarnos al tema de LI vamos a introducir la regla del modus&lt;br /&gt;
  tollens&lt;br /&gt;
  · mt: ⟦F ⟶ G; ¬G⟧ ⟹ ¬F &lt;br /&gt;
  sin, de momento, detallar su demostración.&lt;br /&gt;
*}&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;
lemma -- &amp;quot;p. 7&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p&amp;quot; and &lt;br /&gt;
          3: &amp;quot;¬r&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
  show &amp;quot;¬q&amp;quot; using 4 3 by (rule mt)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 7&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;¬p ⟶ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;¬q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;¬¬p&amp;quot; using 1 2 by (rule mt)&lt;br /&gt;
  show &amp;quot;p&amp;quot; using 3 by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ ¬q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;¬¬q&amp;quot; using 2 by (rule notnotI)&lt;br /&gt;
  show &amp;quot;¬p&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Regla de introducción del condicional *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de introducción del condicional es&lt;br /&gt;
  · impI: (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 8&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 3: &amp;quot;¬q&amp;quot;&lt;br /&gt;
    have &amp;quot;¬p&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
  } thus &amp;quot;¬q ⟶ ¬p&amp;quot; by (rule impI)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 8&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 3: &amp;quot;¬q&amp;quot;&lt;br /&gt;
  show &amp;quot;¬p&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 8&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 3: &amp;quot;¬q&amp;quot;&lt;br /&gt;
  show &amp;quot;¬p&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 9&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;¬q ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ ¬¬q&amp;quot;   &lt;br /&gt;
proof -&lt;br /&gt;
  { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;¬¬p&amp;quot; using 2 by (rule notnotI)&lt;br /&gt;
    have &amp;quot;¬¬q&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
  } thus &amp;quot;p ⟶ ¬¬q&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 9&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;¬q ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ ¬¬q&amp;quot;   &lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;¬¬p&amp;quot; using 2 by (rule notnotI)&lt;br /&gt;
  show &amp;quot;¬¬q&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 9&amp;quot;&lt;br /&gt;
  &amp;quot;p ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 10&amp;quot;&lt;br /&gt;
  &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 1: &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
    { assume 2: &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
      { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
        have 4: &amp;quot;¬¬p&amp;quot; using 3 by (rule notnotI)&lt;br /&gt;
        have 5: &amp;quot;¬¬q&amp;quot; using 2 4 by (rule mt)&lt;br /&gt;
        have 6: &amp;quot;q&amp;quot; using 5 by (rule notnotD)&lt;br /&gt;
        have &amp;quot;r&amp;quot; using 1 6 by (rule mp) &lt;br /&gt;
      } hence &amp;quot;p ⟶ r&amp;quot; by (rule impI)&lt;br /&gt;
    } hence &amp;quot;(¬q ⟶ ¬p) ⟶ p ⟶ r&amp;quot; by (rule impI)&lt;br /&gt;
  } thus &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ p ⟶ r)&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 10&amp;quot;&lt;br /&gt;
  &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  show &amp;quot;(¬q ⟶ ¬p) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume 2: &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
      show &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 4: &amp;quot;¬¬p&amp;quot; using 3 by (rule notnotI)&lt;br /&gt;
          have 5: &amp;quot;¬¬q&amp;quot; using 2 4 by (rule mt)&lt;br /&gt;
          have 6: &amp;quot;q&amp;quot; using 5 by (rule notnotD)&lt;br /&gt;
          show &amp;quot;r&amp;quot; using 1 6 by (rule mp)&lt;br /&gt;
        qed&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &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 2: &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 3: &amp;quot;q&amp;quot;&lt;br /&gt;
      have 4: &amp;quot;p ∧ q&amp;quot; using 2 3 by (rule conjI)&lt;br /&gt;
      show &amp;quot;r&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &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 2: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot; using 2 by (rule conjunct1)&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 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ r ⟶ q ∧ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ r&amp;quot;&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 1 3 by (rule mp)&lt;br /&gt;
  have 5: &amp;quot;r&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;q ∧ r&amp;quot; using 4 5 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Reglas de la disyunción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Las reglas de la introducción de la disyunción son&lt;br /&gt;
  · disjI1: P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2: Q ⟹ P ∨ Q&lt;br /&gt;
  La regla de elimación de la disyunción es&lt;br /&gt;
  · disjE:  ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 11&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
using 1&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;q ∨ p&amp;quot; using 2 by (rule disjI2) }&lt;br /&gt;
next&lt;br /&gt;
  { assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;q ∨ p&amp;quot; using 3 by (rule disjI1) }&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 12&amp;quot;&lt;br /&gt;
  assumes 1: &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 2: &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  thus &amp;quot;p ∨ r&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
      show &amp;quot;p ∨ r&amp;quot; using 3 by (rule disjI1) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume 4: &amp;quot;q&amp;quot;&lt;br /&gt;
      have 5: &amp;quot;r&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
      show &amp;quot;p ∨ r&amp;quot; using 5 by (rule disjI2) }&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;(p ∨ q) ∨ r&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
using 1&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  { assume 2: &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
    thus &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
      { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
        show &amp;quot;p ∨ (q ∨ r)&amp;quot; using 3 by (rule disjI1) }&lt;br /&gt;
    next&lt;br /&gt;
      { assume 4: &amp;quot;q&amp;quot;&lt;br /&gt;
        have 5: &amp;quot;q ∨ r&amp;quot; using 4 by (rule disjI1)&lt;br /&gt;
        show &amp;quot;p ∨ (q ∨ r)&amp;quot; using 5 by (rule disjI2) }&lt;br /&gt;
    qed }&lt;br /&gt;
next&lt;br /&gt;
  { assume 6: &amp;quot;r&amp;quot;&lt;br /&gt;
    have 7: &amp;quot;q ∨ r&amp;quot; using 6 by (rule disjI2)&lt;br /&gt;
    show &amp;quot;p ∨ (q ∨ r)&amp;quot; using 7 by (rule disjI2) }&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma &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;
  have 2: &amp;quot;p&amp;quot; using 1 ..&lt;br /&gt;
  have &amp;quot;q ∨ r&amp;quot; using 1 ..&lt;br /&gt;
  thus &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
      have &amp;quot;p ∧ q&amp;quot; using 2 3 by (rule conjI)&lt;br /&gt;
      thus &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; by (rule disjI1) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume 4: &amp;quot;r&amp;quot;&lt;br /&gt;
      have &amp;quot;p ∧ r&amp;quot; using 2 4 by (rule conjI)&lt;br /&gt;
      thus &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; by (rule disjI2) }&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
section {* Regla de copia *}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 13&amp;quot;&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ p&amp;quot; &lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;p&amp;quot; using 1 by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 13&amp;quot;&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  thus &amp;quot;q ⟶ p&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Reglas de la negación *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de eliminación de lo falso es&lt;br /&gt;
  · FalseE: False ⟹ P&lt;br /&gt;
  La regla de eliminación de la negación es&lt;br /&gt;
  · notE: ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  La regla de introducción de la negación es&lt;br /&gt;
  · notI: (P ⟹ False) ⟹ ¬P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 15&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;¬p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  note 1&lt;br /&gt;
  thus &amp;quot;q&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume 3: &amp;quot;¬p&amp;quot;&lt;br /&gt;
      show &amp;quot;q&amp;quot; using 3 2 by (rule notE) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume &amp;quot;q&amp;quot;&lt;br /&gt;
      thus &amp;quot;q&amp;quot; by this}&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 16&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p ⟶ ¬q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p&amp;quot;    &lt;br /&gt;
proof (rule notI)&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;¬q&amp;quot; using 2 3 by (rule mp)&lt;br /&gt;
  show False using 5 4 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma  &lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;¬p&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
  show False using 3 2 by (rule notE)&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;p ∧ ¬q ⟶ r&amp;quot; and &lt;br /&gt;
          2: &amp;quot;¬r&amp;quot; and &lt;br /&gt;
          3: &amp;quot;p&amp;quot; &lt;br /&gt;
  shows &amp;quot;q&amp;quot;    &lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬¬q&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume 4: &amp;quot;¬q&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;p ∧ ¬q&amp;quot; using 3 4 by (rule conjI)&lt;br /&gt;
    have 6: &amp;quot;r&amp;quot; using 1 5 by (rule mp)&lt;br /&gt;
    show False using 2 6 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  thus &amp;quot;q&amp;quot; by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p&amp;quot; and &lt;br /&gt;
          3: &amp;quot;¬r&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 4: &amp;quot;q&amp;quot;&lt;br /&gt;
  have 5: &amp;quot;q ⟶ r&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
  have 6: &amp;quot;r&amp;quot; using 5 4 by (rule mp)&lt;br /&gt;
  show False using 3 6 by (rule notE)&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
section {* Reglas del bicondicional *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de introducción del bicondicional es&lt;br /&gt;
  · iffI: ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P = Q&lt;br /&gt;
  Las reglas de eliminación del bicondicional son&lt;br /&gt;
  · iffD1: ⟦Q = P; Q⟧ ⟹ P &lt;br /&gt;
  · iffD2: ⟦P = Q; Q⟧ ⟹ P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 17&amp;quot;&lt;br /&gt;
  &amp;quot;(p ∧ q) = (q ∧ p)&amp;quot;&lt;br /&gt;
proof (rule iffI)&lt;br /&gt;
  { assume 1: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
    have 2: &amp;quot;p&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
    have 3: &amp;quot;q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
    show &amp;quot;q ∧ p&amp;quot; using 3 2 by (rule conjI) }&lt;br /&gt;
next&lt;br /&gt;
  { assume 4: &amp;quot;q ∧ p&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;q&amp;quot; using 4 by (rule conjunct1)&lt;br /&gt;
    have 6: &amp;quot;p&amp;quot; using 4 by (rule conjunct2)&lt;br /&gt;
    show &amp;quot;p ∧ q&amp;quot; using 6 5 by (rule conjI) }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 18&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;p = q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p ∨ q&amp;quot;  &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
using 2&lt;br /&gt;
proof (rule disjE)&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 iffD1)&lt;br /&gt;
    show &amp;quot;p ∧ q&amp;quot; using 3 4 by (rule conjI) }&lt;br /&gt;
next&lt;br /&gt;
  { assume 5: &amp;quot;q&amp;quot;&lt;br /&gt;
    have 6: &amp;quot;p&amp;quot; using 1 5 by (rule iffD2)&lt;br /&gt;
    show &amp;quot;p ∧ q&amp;quot; using 6 5 by (rule conjI) }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Reglas derivadas *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Regla del modus tollens *}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 20&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;F ⟶ G&amp;quot; and &lt;br /&gt;
          2: &amp;quot;¬G&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬F&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 3: &amp;quot;F&amp;quot;&lt;br /&gt;
  have 4: &amp;quot;G&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
  show False using 2 4 by (rule notE)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
subsection {* Regla de la introducción de la doble negación *}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 21&amp;quot;&lt;br /&gt;
  assumes 1: &amp;quot;F&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬¬F&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 2: &amp;quot;¬F&amp;quot;&lt;br /&gt;
  show False using 2 1 by (rule notE)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
subsection {* Regla de reducción al absurdo *}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 22&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;¬F ⟶ False&amp;quot; &lt;br /&gt;
  shows &amp;quot;F&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 2: &amp;quot;¬¬F&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume 3: &amp;quot;¬F&amp;quot;&lt;br /&gt;
    show False using 1 3 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;F&amp;quot; using 2 by (rule notnotD)&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de reducción al absurdo en Isabelle se correponde con la&lt;br /&gt;
  regla de contradicción &lt;br /&gt;
  · ccontr: (¬P ⟹ False) ⟹ P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Ley del tercio excluso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La ley del tercio excluso es &lt;br /&gt;
  · excluded_middle: ¬P ∨ P&lt;br /&gt;
  Puede demostrarse como se muestra a continuación.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma -- &amp;quot;p. 23&amp;quot;&lt;br /&gt;
  &amp;quot;F ∨ ¬F&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume 1: &amp;quot;¬(F ∨ ¬F)&amp;quot;&lt;br /&gt;
  thus False&lt;br /&gt;
  proof (rule notE)&lt;br /&gt;
    show &amp;quot;F ∨ ¬F&amp;quot;&lt;br /&gt;
    proof (rule disjI2)&lt;br /&gt;
      show &amp;quot;¬F&amp;quot;&lt;br /&gt;
      proof (rule notI)&lt;br /&gt;
        assume 2: &amp;quot;F&amp;quot;&lt;br /&gt;
        hence 3: &amp;quot;F ∨ ¬F&amp;quot; by (rule disjI1)&lt;br /&gt;
        show False using 1 3 by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
    &lt;br /&gt;
lemma -- &amp;quot;p. 24&amp;quot;&lt;br /&gt;
  assumes 1: &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; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;¬p ∨ q&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      thus &amp;quot;¬p ∨ q&amp;quot; by (rule disjI1) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;q&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
      thus &amp;quot;¬p ∨ q&amp;quot; by (rule disjI2) }&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Temas&amp;diff=31</id>
		<title>Temas</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Temas&amp;diff=31"/>
		<updated>2011-03-29T11:19:27Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Temas de Demostración asistida por ordenador */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Temas de &amp;#039;&amp;#039;Demostración asistida por ordenador&amp;#039;&amp;#039; ==&lt;br /&gt;
* [[Tema 1: Isabelle como un lenguaje funcional]].&lt;br /&gt;
* [[Tema 2: Razonamiento sobre programas]].&lt;br /&gt;
* [[Tema 3: Deducción lógica proposicional con Isabelle]].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Relaci%C3%B3n_1&amp;diff=28</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Relaci%C3%B3n_1&amp;diff=28"/>
		<updated>2011-03-22T18:34:44Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Razonamiento en Isabelle sobre programas *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_1&lt;br /&gt;
imports Main Efficient_Nat&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     sumaImpares :: &amp;quot;nat ⇒ nat&amp;quot;&lt;br /&gt;
  tal que (sumaImpares n) es la suma de los n primeros números&lt;br /&gt;
  impares. Por ejemplo,&lt;br /&gt;
     sumaImpares 5  =  25&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sumaImpares ::&amp;quot; nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares 0     = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sumaImpares (Suc n) = sumaImpares n + (2*(Suc n) - 1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que &lt;br /&gt;
     sumaImpares n = n*n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot;&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) = sumaPotenciasDeDosMasUno n + 2^(Suc n)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar que &lt;br /&gt;
     sumaPotenciasDeDosMasUno n = 2^(n+1)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(Suc n)&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     copia :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&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 2 = [2,2,2]&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;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot;&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;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. 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;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la función&lt;br /&gt;
    factR :: &amp;quot;nat ⇒ nat&amp;quot;&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;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Se considera la siguiente definición iterativa de la&lt;br /&gt;
  función factorial &lt;br /&gt;
     factI :: Integer -&amp;gt; Integer&lt;br /&gt;
     factI n = factI&amp;#039; n 1&lt;br /&gt;
     &lt;br /&gt;
     factI&amp;#039; :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
     factI&amp;#039; 0     x = x                  -- factI&amp;#039;.1&lt;br /&gt;
     factI&amp;#039; (n+1) x = factI&amp;#039; n (n+1)*x   -- factI&amp;#039;.2&lt;br /&gt;
  Comprobar con QuickCheck que factI y factR son equivalentes sobre los&lt;br /&gt;
  números naturales.&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que, para todo n y todo x, se tiene &lt;br /&gt;
     factI&amp;#039; n x = x * factR n&lt;br /&gt;
  y, como corolario, que&lt;br /&gt;
     factI n = factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Definir, recursivamente y sin usar (@). la función&lt;br /&gt;
     amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&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 [2,5] 3 = [2,5,3]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar que &lt;br /&gt;
     amplia xs y = xs @ [y]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Relaci%C3%B3n_1&amp;diff=27</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Relaci%C3%B3n_1&amp;diff=27"/>
		<updated>2011-03-22T18:33:50Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Razonamiento en Isabelle sobre programas *}&lt;br /&gt;
&lt;br /&gt;
theory Relacion_1&lt;br /&gt;
imports Main Efficient_Nat&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     sumaImpares :: &amp;quot;nat ⇒ nat&amp;quot;&lt;br /&gt;
  tal que (sumaImpares n) es la suma de los n primeros números&lt;br /&gt;
  impares. Por ejemplo,&lt;br /&gt;
     sumaImpares 5  =  25&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sumaImpares ::&amp;quot; nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares 0     = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sumaImpares (Suc n) = sumaImpares n + (2*(Suc n) - 1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que &lt;br /&gt;
     sumaImpares n = n*n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot;&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) = sumaPotenciasDeDosMasUno n + 2^(Suc n)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar que &lt;br /&gt;
     sumaPotenciasDeDosMasUno n = 2^(n+1)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(Suc n)&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     copia :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&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 2 = [2,2,2]&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;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot;&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;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. 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;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la función&lt;br /&gt;
    factR :: &amp;quot;nat ⇒ nat&amp;quot;&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;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Se considera la siguiente definición iterativa de la&lt;br /&gt;
  función factorial &lt;br /&gt;
     factI :: Integer -&amp;gt; Integer&lt;br /&gt;
     factI n = factI&amp;#039; n 1&lt;br /&gt;
     &lt;br /&gt;
     factI&amp;#039; :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
     factI&amp;#039; 0     x = x                  -- factI&amp;#039;.1&lt;br /&gt;
     factI&amp;#039; (n+1) x = factI&amp;#039; n (n+1)*x   -- factI&amp;#039;.2&lt;br /&gt;
  Comprobar con QuickCheck que factI y factR son equivalentes sobre los&lt;br /&gt;
  números naturales.&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que, para todo n y todo x, se tiene &lt;br /&gt;
     factI&amp;#039; n x = x * factR n&lt;br /&gt;
  y, como corolario, que&lt;br /&gt;
     factI n = factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Definir, recursivamente y sin usar (@). la función&lt;br /&gt;
     amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot;&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 [2,5] 3 = [2,5,3]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar que &lt;br /&gt;
     amplia xs y = xs @ [y]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=DAO2011_(Demostraci%C3%B3n_asistida_por_ordenador)&amp;diff=25</id>
		<title>DAO2011 (Demostración asistida por ordenador)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=DAO2011_(Demostraci%C3%B3n_asistida_por_ordenador)&amp;diff=25"/>
		<updated>2011-03-08T16:25:22Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Material para el curso */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Demostración asistida por ordenador ==&lt;br /&gt;
Este curso es una introducción a la demostración asistida por ordenador usando el sistema [http://www.cl.cam.ac.uk/research/hvg/Isabelle Isabelle/HOL/Isar]). Los objetivos del curso son:&lt;br /&gt;
* desarrollar la capacidad de razonamiento lógico,&lt;br /&gt;
* conocer formalismos de representación del conocimiento matemático,&lt;br /&gt;
* saber usar sistemas de razonamiento y&lt;br /&gt;
* desarrollar teorías matemáticas en sistemas de demostración automática. &lt;br /&gt;
&lt;br /&gt;
Administrativamente, es un [http://www.cfp.us.es/web/ficha_avanzada.asp?id_titulo=846&amp;amp;tipo=FE&amp;amp;basica=1&amp;amp;curso=2010 curso de formación especializada] del [http://www.cfp.us.es/ Centro de Formación Permanente de la Universidad de Sevilla].&lt;br /&gt;
&lt;br /&gt;
== Material para el curso ==&lt;br /&gt;
* [[Temas]]: Teorías de los temas.&lt;br /&gt;
* [[Ejercicios]]: Relaciones de ejercicios.&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao/doc.html Documentación]: Enlaces con documentación.&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao/sistemas.html Sistemas]: Sistemas utilizados.&lt;br /&gt;
* [http://www.glc.us.es/~jalonso/vestigium/tag/dao2011/ Diario]: Descripción diaria de las clases.&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Ejercicios&amp;diff=24</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Ejercicios&amp;diff=24"/>
		<updated>2011-03-01T22:07:21Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Ejercicios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ejercicios de &amp;#039;&amp;#039;Demostración asistida por ordenador&amp;#039;&amp;#039; ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1:&amp;#039;&amp;#039;&amp;#039; Razonamiento sobre programas ([[Rel_1|Enunciado]] y [[Relación 1|Solución colaborativa]]).&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Temas&amp;diff=23</id>
		<title>Temas</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Temas&amp;diff=23"/>
		<updated>2011-03-01T22:06:44Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Temas de &amp;#039;&amp;#039;Demostración asistida por ordenador&amp;#039;&amp;#039; ==&lt;br /&gt;
* [[Tema 1: Isabelle como un lenguaje funcional]].&lt;br /&gt;
* [[Tema 2: Razonamiento sobre programas]].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Ejercicios&amp;diff=22</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Ejercicios&amp;diff=22"/>
		<updated>2011-03-01T22:05:58Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Ejercicios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ejercicios ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1:&amp;#039;&amp;#039;&amp;#039; Razonamiento sobre programas ([[Rel_1|Enunciado]] y [[Relación 1|Solución colaborativa]]).&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Temas&amp;diff=21</id>
		<title>Temas</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=Temas&amp;diff=21"/>
		<updated>2011-03-01T22:05:36Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Temas» ([edit=sysop] (indefinido) [move=sysop] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Tema 1: Isabelle como un lenguaje funcional]].&lt;br /&gt;
* [[Tema 2: Razonamiento sobre programas]].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO2011/index.php?title=DAO2011_(Demostraci%C3%B3n_asistida_por_ordenador)&amp;diff=20</id>
		<title>DAO2011 (Demostración asistida por ordenador)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO2011/index.php?title=DAO2011_(Demostraci%C3%B3n_asistida_por_ordenador)&amp;diff=20"/>
		<updated>2011-03-01T22:05:18Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «DAO2011 (Demostración asistida por ordenador)» ([edit=sysop] (indefinido) [move=sysop] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Demostración asistida por ordenador ==&lt;br /&gt;
Este curso es una introducción a la demostración asistida por ordenador usando el sistema [http://www.cl.cam.ac.uk/research/hvg/Isabelle Isabelle/HOL/Isar]). Los objetivos del curso son:&lt;br /&gt;
* desarrollar la capacidad de razonamiento lógico,&lt;br /&gt;
* conocer formalismos de representación del conocimiento matemático,&lt;br /&gt;
* saber usar sistemas de razonamiento y&lt;br /&gt;
* desarrollar teorías matemáticas en sistemas de demostración automática. &lt;br /&gt;
&lt;br /&gt;
Administrativamente, es un [http://www.cfp.us.es/web/ficha_avanzada.asp?id_titulo=846&amp;amp;tipo=FE&amp;amp;basica=1&amp;amp;curso=2010 curso de formación especializada] del [http://www.cfp.us.es/ Centro de Formación Permanente de la Universidad de Sevilla].&lt;br /&gt;
&lt;br /&gt;
== Material para el curso ==&lt;br /&gt;
* [[Temas]]: Teorías de los temas.&lt;br /&gt;
* [[Ejercicios]]: Relaciones de ejercicios.&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao/doc.html Documentación]:Enlaces con documentación.&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao/sistemas.html Sistemas]: Sistemas utilizados.&lt;br /&gt;
* [http://www.glc.us.es/~jalonso/vestigium/tag/dao2011/ Diario]: Descripción diaria de las clases.&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
</feed>