<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/LMF2020/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mjoseh</id>
	<title>Lógica matemática y fundamentos [Curso 2019-20] - Contribuciones del usuario [es]</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/LMF2020/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mjoseh"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php/Especial:Contribuciones/Mjoseh"/>
	<updated>2026-07-17T19:42:02Z</updated>
	<subtitle>Contribuciones del usuario</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Ejercicios&amp;diff=1283</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Ejercicios&amp;diff=1283"/>
		<updated>2021-01-21T10:16:28Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Protegió «Ejercicios» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-19/ejercicios/ejercicios-LMF-2019-20.pdf libro de ejercicios].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]], [[Relación 1 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R1_sol.pdf Una solución]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R2.thy Deducción natural proposicional con Isabelle] ([[R2 |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Rel 2 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R3.thy Deducción natural proposicional con Isabelle (II)] ([[R3 |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Rel 3 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4.thy Sintaxis y semántica de la lógica de primer orden.] ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4_sol.pdf Una solución]).).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R5.thy Deducción natural en lógica de primer orden.] ([[R5 |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Rel 5 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R6.thy Formalización y argumentación con Isabelle/HOL.] ([[R6 |Enunciado]], [[Relación 6 |Solución colaborativa]] , [[Rel 6 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R7.thy Deducción natural,formalización y argumentación en LPO con Isabelle/HOL.] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R8.thy Programación funcional en  Isabelle/HOL.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 8 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 8 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R9.thy Programación funcional en  Isabelle/HOL (II).] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 9 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 9 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1 (24-04-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T1 |Enunciado]], [[T1 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R10.thy Razonamiento sobre programas en Isabelle/HOL.] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 10 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL(II).] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 11 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R12.thy Razonamiento sobre programas en Isabelle/HOL(III).] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 12 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2 (12-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T2 |Enunciado]], [[T2 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R13.thy Recorridos de árboles.] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 13 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R14.thy Una axiomátización de la Geometría.] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 14 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3 (19-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T3 |Enunciado]], [[T3 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R15.thy Definiciones inductivas: clausuras.] ([[R15 |Enunciado]], [[Relación 15 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 15 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4 (26-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T4 |Enunciado]], [[T4 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 5 (02-06-2020)&amp;#039;&amp;#039;&amp;#039;: &lt;br /&gt;
** ([[T5-1 |Enunciado (1)]], [[T5-1 sol |Una solución]]).&lt;br /&gt;
** ([[T5-2 |Enunciado (2)]], [[T5-2 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Trabajo final&amp;#039;&amp;#039;&amp;#039;: ([[TF |Enunciado]], [[TF sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen (2-07-2020)&amp;#039;&amp;#039;&amp;#039;: ([[Examen 1C |Enunciado]], [[Examen 1C sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen (9-09-2020)&amp;#039;&amp;#039;&amp;#039;: ([[Examen 2C |Enunciado]], [[Examen 2C sol |Una solución]]).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Nota&amp;#039;&amp;#039;&amp;#039; Se pueden publicar las soluciones hasta el martes 31 de marzo.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]] y [[Sol 9 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R10.thy Programación funcional en Isabelle (2)] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]  y [[Sol 10 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]  y [[Sol 11 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R12.thy Recorridos de árboles en Isabelle/HOL] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]  y [[Sol 12 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R13.thy Definiciones inductivas: clausuras] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]  y [[Sol 13 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R14.thy Desarrollo de teorías axiomáticas] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]  y [[Sol 14 | una solución]]).&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Ejercicios&amp;diff=1282</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Ejercicios&amp;diff=1282"/>
		<updated>2021-01-21T10:16:14Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-19/ejercicios/ejercicios-LMF-2019-20.pdf libro de ejercicios].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]], [[Relación 1 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R1_sol.pdf Una solución]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R2.thy Deducción natural proposicional con Isabelle] ([[R2 |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Rel 2 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R3.thy Deducción natural proposicional con Isabelle (II)] ([[R3 |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Rel 3 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4.thy Sintaxis y semántica de la lógica de primer orden.] ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4_sol.pdf Una solución]).).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R5.thy Deducción natural en lógica de primer orden.] ([[R5 |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Rel 5 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R6.thy Formalización y argumentación con Isabelle/HOL.] ([[R6 |Enunciado]], [[Relación 6 |Solución colaborativa]] , [[Rel 6 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R7.thy Deducción natural,formalización y argumentación en LPO con Isabelle/HOL.] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R8.thy Programación funcional en  Isabelle/HOL.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 8 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 8 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R9.thy Programación funcional en  Isabelle/HOL (II).] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 9 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 9 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1 (24-04-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T1 |Enunciado]], [[T1 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R10.thy Razonamiento sobre programas en Isabelle/HOL.] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 10 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL(II).] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 11 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R12.thy Razonamiento sobre programas en Isabelle/HOL(III).] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 12 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2 (12-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T2 |Enunciado]], [[T2 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R13.thy Recorridos de árboles.] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 13 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R14.thy Una axiomátización de la Geometría.] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 14 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3 (19-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T3 |Enunciado]], [[T3 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R15.thy Definiciones inductivas: clausuras.] ([[R15 |Enunciado]], [[Relación 15 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 15 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4 (26-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T4 |Enunciado]], [[T4 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 5 (02-06-2020)&amp;#039;&amp;#039;&amp;#039;: &lt;br /&gt;
** ([[T5-1 |Enunciado (1)]], [[T5-1 sol |Una solución]]).&lt;br /&gt;
** ([[T5-2 |Enunciado (2)]], [[T5-2 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Trabajo final&amp;#039;&amp;#039;&amp;#039;: ([[TF |Enunciado]], [[TF sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen (2-07-2020)&amp;#039;&amp;#039;&amp;#039;: ([[Examen 1C |Enunciado]], [[Examen 1C sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen (9-09-2020)&amp;#039;&amp;#039;&amp;#039;: ([[Examen 2C |Enunciado]], [[Examen 2C sol |Una solución]]).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Nota&amp;#039;&amp;#039;&amp;#039; Se pueden publicar las soluciones hasta el martes 31 de marzo.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]] y [[Sol 9 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R10.thy Programación funcional en Isabelle (2)] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]  y [[Sol 10 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]  y [[Sol 11 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R12.thy Recorridos de árboles en Isabelle/HOL] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]  y [[Sol 12 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R13.thy Definiciones inductivas: clausuras] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]  y [[Sol 13 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R14.thy Desarrollo de teorías axiomáticas] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]  y [[Sol 14 | una solución]]).&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Examen_2C_sol&amp;diff=1281</id>
		<title>Examen 2C sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Examen_2C_sol&amp;diff=1281"/>
		<updated>2020-09-10T08:20:02Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Protegió «Examen 2C sol» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
theory examen_9_sep_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 1. (2.5 puntos) Demostrar detalladamente con Isabelle, &lt;br /&gt;
  sin usar métodos automáticos (como simp, auto, ...) sino sólo las &lt;br /&gt;
  reglas básicas, que el siguiente argumento es correcto:&lt;br /&gt;
  Ningún individuo que sea candidato será derrotado si hace una&lt;br /&gt;
  buena campaña. Todo individuo que se postula es un candidato. Cualquier&lt;br /&gt;
  candidato que no sea derrotado, será elegido. Todo individuo que sea&lt;br /&gt;
  elegido hace una buena campaña. Por tanto, todo individuo que se &lt;br /&gt;
  postula será elegido si y sólo si hace una buena campaña. &lt;br /&gt;
&lt;br /&gt;
  Simbología: I(x): x es individuo, C(x): x es candidato,&lt;br /&gt;
              D(x): x es derrotado, B(x): x hace una buena campaña, &lt;br /&gt;
              P(x): x se postula, E(x): x es elegido. &lt;br /&gt;
---------------------------------------------------------------------›&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;∀x. (I(x)∧C(x))∧B(x)⟶¬D(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. I(x)∧P(x) ⟶ C(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. C(x) ∧ ¬D(x) ⟶ E(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. I(x)∧E(x) ⟶ B(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. I(x)∧P(x)⟶(E(x)⟷B(x))&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
  fix a&lt;br /&gt;
  show &amp;quot;I(a)∧P(a) ⟶ (E(a)⟷B(a))&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;I(a)∧P(a)&amp;quot;&lt;br /&gt;
      show &amp;quot;E(a)⟷B(a)&amp;quot;&lt;br /&gt;
        proof&lt;br /&gt;
          assume &amp;quot;E(a)&amp;quot;&lt;br /&gt;
          show  &amp;quot;B(a)&amp;quot;&lt;br /&gt;
             proof -&lt;br /&gt;
              have &amp;quot;I(a)&amp;quot; using ‹I(a)∧P(a)› by (rule conjunct1)&lt;br /&gt;
              then have 1:&amp;quot;I(a)∧E(a)&amp;quot; using ‹E(a)› by (rule conjI)&lt;br /&gt;
              have &amp;quot;I(a)∧E(a) ⟶ B(a)&amp;quot; using assms(4) by (rule allE)&lt;br /&gt;
              then show &amp;quot;B(a)&amp;quot; using 1 by (rule mp)&lt;br /&gt;
             qed  &lt;br /&gt;
        next&lt;br /&gt;
          assume &amp;quot;B(a)&amp;quot;&lt;br /&gt;
          show   &amp;quot;E(a)&amp;quot;&lt;br /&gt;
             proof -&lt;br /&gt;
              have &amp;quot;I(a)∧P(a) ⟶ C(a)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
              then have &amp;quot;C(a)&amp;quot; using   ‹I(a)∧P(a)› by (rule mp)&lt;br /&gt;
              have &amp;quot;I(a)&amp;quot; using  ‹I(a)∧P(a)› by (rule conjunct1)&lt;br /&gt;
              then have &amp;quot;I(a)∧C(a)&amp;quot; using ‹C(a)› by (rule conjI)&lt;br /&gt;
              then have 2:&amp;quot;(I(a)∧C(a))∧B(a)&amp;quot; using ‹B(a)› &lt;br /&gt;
                by (rule conjI)&lt;br /&gt;
              have &amp;quot;(I(a)∧C(a))∧B(a)⟶¬D(a)&amp;quot; using assms(1) &lt;br /&gt;
                by (rule allE)&lt;br /&gt;
              then have &amp;quot;¬D(a)&amp;quot; using 2 by (rule mp)&lt;br /&gt;
              have 3:&amp;quot;C(a) ∧ ¬D(a) ⟶ E(a)&amp;quot; using assms(3) &lt;br /&gt;
                by (rule allE)&lt;br /&gt;
              have &amp;quot;C(a)∧¬D(a)&amp;quot; using ‹C(a)› ‹¬D(a)› by (rule conjI)&lt;br /&gt;
              with 3 show &amp;quot;E(a)&amp;quot; by (rule mp)&lt;br /&gt;
             qed&lt;br /&gt;
        qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed              &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text ‹ -----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. (2.5 puntos) Consideramos la función&lt;br /&gt;
     menores :: int ⇒ int list ⇒ bool&lt;br /&gt;
  tal que (menores a xs) es la lista de los elementos de la lista xs que &lt;br /&gt;
  son menores que a. Por ejemplo,&lt;br /&gt;
     value &amp;quot;menores 2 [3,0,1] = [0,1]&amp;quot;&lt;br /&gt;
     value &amp;quot;menores 2 [3,0,5] = [0]&amp;quot;&lt;br /&gt;
-----------------------------------------------------------------------›&lt;br /&gt;
 &lt;br /&gt;
fun menores :: &amp;quot;int ⇒ int list ⇒ int list&amp;quot; where&lt;br /&gt;
  &amp;quot;menores a []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;menores a (x#xs) = (if x &amp;lt; a then x # (menores a xs)&lt;br /&gt;
                                else (menores a xs))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;menores 2 [3,0,1] = [0,1]&amp;quot;&lt;br /&gt;
value &amp;quot;menores 2 [3,0,5] = [0]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text ‹ -----------------------------------------------------------------&lt;br /&gt;
  Demostrar que la longitud de la lista de elementos menores que uno &lt;br /&gt;
  dado es menor o igual que la longitud de la lista original.&lt;br /&gt;
-----------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración estructurada:›&lt;br /&gt;
&lt;br /&gt;
lemma menores_menor_1:&lt;br /&gt;
  &amp;quot;length (menores x xs) &amp;lt; Suc (length xs)&amp;quot;&lt;br /&gt;
proof(induct xs)&lt;br /&gt;
    show &amp;quot;length (menores x [])&amp;lt;Suc(length [])&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
    fix xs a&lt;br /&gt;
    assume HI: &amp;quot;length (menores x xs) &amp;lt; Suc (length xs)&amp;quot;&lt;br /&gt;
    show &amp;quot;length (menores x (a#xs))&amp;lt; Suc(length (a#xs))&amp;quot;&lt;br /&gt;
    proof(cases &amp;quot;a&amp;lt;x&amp;quot;)&lt;br /&gt;
      case True&lt;br /&gt;
      then have &amp;quot;length (menores x (a#xs)) = length(a#(menores x xs))&amp;quot; &lt;br /&gt;
        by simp&lt;br /&gt;
      also have &amp;quot;... = Suc(length(menores x xs))&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;...&amp;lt; Suc(Suc( length  xs))&amp;quot; using HI by simp&lt;br /&gt;
      also have &amp;quot;... = Suc(length(a#xs))&amp;quot; by simp&lt;br /&gt;
      finally show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
    case False&lt;br /&gt;
    then have &amp;quot;length (menores x (a#xs)) = length(menores x xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... &amp;lt; Suc (length xs)&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... &amp;lt; Suc (length (a#xs))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada:›&lt;br /&gt;
&lt;br /&gt;
lemma menores_menor_detallada:&lt;br /&gt;
  &amp;quot;length (menores x xs) &amp;lt; Suc (length xs)&amp;quot;&lt;br /&gt;
proof(induct xs)&lt;br /&gt;
  show &amp;quot;length (menores x []) &amp;lt; Suc (length [])&amp;quot; &lt;br /&gt;
    by  (simp only: list.size lessI menores.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix xs a&lt;br /&gt;
  assume HI: &amp;quot;length (menores x xs) &amp;lt; Suc (length xs)&amp;quot;&lt;br /&gt;
  show &amp;quot;length (menores x (a#xs))&amp;lt; Suc(length (a#xs))&amp;quot;&lt;br /&gt;
  proof (cases &amp;quot;a&amp;lt;x&amp;quot;)&lt;br /&gt;
    case True&lt;br /&gt;
    then have &amp;quot;menores x (a#xs) = a#(menores x xs)&amp;quot; &lt;br /&gt;
      by (simp only:if_True menores.simps)&lt;br /&gt;
    then have &amp;quot;length (menores x (a#xs)) = length(a#(menores x xs))&amp;quot; &lt;br /&gt;
     by (simp only:)&lt;br /&gt;
    also have &amp;quot;... = Suc(length(menores x xs))&amp;quot; by (simp only:list.size)&lt;br /&gt;
    also have &amp;quot;...&amp;lt; Suc(Suc( length  xs))&amp;quot; using HI by (simp only:)&lt;br /&gt;
    also have &amp;quot;... = Suc(length(a#xs))&amp;quot; by (simp only: list.size)&lt;br /&gt;
    finally show ?thesis by this&lt;br /&gt;
  next&lt;br /&gt;
    case False&lt;br /&gt;
    then have &amp;quot;menores x (a#xs) = menores x xs&amp;quot; &lt;br /&gt;
      by (simp only: if_False menores.simps(2))&lt;br /&gt;
    then have &amp;quot;length (menores x (a#xs)) = length(menores x xs)&amp;quot; &lt;br /&gt;
      by (simp only:)&lt;br /&gt;
    also have &amp;quot;... &amp;lt; Suc (length xs)&amp;quot; using HI by (simp only:)&lt;br /&gt;
    also have &amp;quot;... &amp;lt; Suc (length (a#xs))&amp;quot; by (simp only: list.size)&lt;br /&gt;
    finally show ?thesis by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración aplicativa:›&lt;br /&gt;
&lt;br /&gt;
lemma menores_menor_aplicativa:&lt;br /&gt;
  &amp;quot;length (menores x xs) &amp;lt; Suc (length xs)&amp;quot;&lt;br /&gt;
  apply (induct xs)&lt;br /&gt;
   apply (simp only: list.size lessI menores.simps(1))&lt;br /&gt;
  apply (simp only:menores.simps(2))&lt;br /&gt;
  apply(split if_split)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (rule impI)&lt;br /&gt;
   apply (simp only: list.size)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (simp only: list.size)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración automática:›&lt;br /&gt;
&lt;br /&gt;
lemma menores_menor_auto:&lt;br /&gt;
  &amp;quot;length (menores x xs) &amp;lt; Suc (length xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;length (menores x xs) &amp;lt; 1 + length xs&amp;quot;&lt;br /&gt;
proof(induct xs)&lt;br /&gt;
  show &amp;quot;length (menores x []) &amp;lt; 1 + (length [])&amp;quot; &lt;br /&gt;
    by  (simp only: list.size lessI menores.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix xs a&lt;br /&gt;
  assume HI: &amp;quot;length (menores x xs) &amp;lt; 1 + length xs&amp;quot;&lt;br /&gt;
  show &amp;quot;length (menores x (a#xs)) &amp;lt; 1 + length (a#xs)&amp;quot;&lt;br /&gt;
  proof (cases &amp;quot;a&amp;lt;x&amp;quot;)&lt;br /&gt;
    case True&lt;br /&gt;
    then have &amp;quot;menores x (a#xs) = a#(menores x xs)&amp;quot; &lt;br /&gt;
      by (simp only:if_True menores.simps)&lt;br /&gt;
    then have &amp;quot;length (menores x (a#xs)) = length(a#(menores x xs))&amp;quot; &lt;br /&gt;
     by (simp only:)&lt;br /&gt;
    also have &amp;quot;... = 1 + (length(menores x xs))&amp;quot; by (simp only:list.size)&lt;br /&gt;
    also have &amp;quot;...&amp;lt; 1 + (1 + ( length  xs))&amp;quot; using HI by (simp only:)&lt;br /&gt;
    also have &amp;quot;... = 1 + (length(a#xs))&amp;quot; by (simp only: list.size)&lt;br /&gt;
    finally show ?thesis by this&lt;br /&gt;
  next&lt;br /&gt;
    case False&lt;br /&gt;
    then have &amp;quot;menores x (a#xs) = menores x xs&amp;quot; &lt;br /&gt;
      by (simp only: if_False menores.simps(2))&lt;br /&gt;
    then have &amp;quot;length (menores x (a#xs)) = length(menores x xs)&amp;quot; &lt;br /&gt;
      by (simp only:)&lt;br /&gt;
    also have &amp;quot;... &amp;lt; 1 +  (length xs)&amp;quot; using HI by (simp only:)&lt;br /&gt;
    also have &amp;quot;... &amp;lt; 1 +  (length (a#xs))&amp;quot; by (simp only: list.size)&lt;br /&gt;
    finally show ?thesis by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. (2.5 puntos) Sea G un grupo. Demostrar que si se verifica&lt;br /&gt;
   ∀x y. (((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭), entonces también se verifica&lt;br /&gt;
   ∀x. ∀y. ∀z. x ⋅ y = z ⋅ x ⟶ y = z&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: auto, blast, force,&lt;br /&gt;
  fast, arith o metis &lt;br /&gt;
  ------------------------------------------------------------------ ›&lt;br /&gt;
&lt;br /&gt;
locale grupo =&lt;br /&gt;
  fixes prod :: &amp;quot;[&amp;#039;a, &amp;#039;a] ⇒ &amp;#039;a&amp;quot; (infixl &amp;quot;⋅&amp;quot; 70)&lt;br /&gt;
    and neutro (&amp;quot;𝟭&amp;quot;) &lt;br /&gt;
    and inverso (&amp;quot;_^&amp;quot; [100] 100)&lt;br /&gt;
  assumes asociativa: &amp;quot;(x ⋅ y) ⋅ z = x ⋅ (y ⋅ z)&amp;quot;&lt;br /&gt;
      and neutro_i:   &amp;quot;𝟭 ⋅ x = x&amp;quot;&lt;br /&gt;
      and neutro_d:   &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
      and inverso_d:  &amp;quot;x ⋅ x^ = 𝟭&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Notas sobre notación:&lt;br /&gt;
   * El producto es ⋅ y se escribe con \ cdot (sin espacio entre ellos). &lt;br /&gt;
   * El neutro es 𝟭 y se escribe con \ y one (sin espacio entre ellos).&lt;br /&gt;
   * El inverso de x es x^ y se escribe pulsando 2 veces en ^. *)&lt;br /&gt;
&lt;br /&gt;
context grupo&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  assumes  &amp;quot;((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
  shows &amp;quot;x ⋅ y = z ⋅ x ⟶ y = z&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;x ⋅ y = z ⋅ x&amp;quot;&lt;br /&gt;
  show &amp;quot;y = z&amp;quot;&lt;br /&gt;
  proof-&lt;br /&gt;
    have  2: &amp;quot;x ⋅ y = y ⋅ x&amp;quot;&lt;br /&gt;
    proof-&lt;br /&gt;
      have &amp;quot;x ⋅ y = (x ⋅ y) ⋅ 𝟭&amp;quot; by (simp only:  neutro_d)&lt;br /&gt;
      also have &amp;quot;… =  (x ⋅ y) ⋅ (((y^ ⋅ x^) ⋅ y) ⋅ x)&amp;quot; &lt;br /&gt;
        using assms by (simp only:)&lt;br /&gt;
      also have &amp;quot;… =  (x ⋅ (y ⋅ y^) ⋅ x^) ⋅ y ⋅ x&amp;quot;&lt;br /&gt;
        by (simp only: asociativa)&lt;br /&gt;
      also have &amp;quot;… =  (x ⋅ 𝟭 ⋅ x^) ⋅ y ⋅ x&amp;quot;&lt;br /&gt;
        by (simp only: inverso_d)&lt;br /&gt;
      also have &amp;quot;… =  (x ⋅ x^) ⋅ y ⋅ x&amp;quot;&lt;br /&gt;
        by (simp only: neutro_d)&lt;br /&gt;
      also have &amp;quot;… = 𝟭 ⋅ y ⋅ x&amp;quot;&lt;br /&gt;
        by (simp only: inverso_d)&lt;br /&gt;
      also have &amp;quot;… = y ⋅ x&amp;quot;&lt;br /&gt;
         by (simp only: neutro_i)&lt;br /&gt;
       finally show  &amp;quot;x ⋅ y = y ⋅ x&amp;quot; &lt;br /&gt;
         by this&lt;br /&gt;
     qed&lt;br /&gt;
     have &amp;quot;y ⋅ x = z ⋅ x&amp;quot; using 1 2 by (simp only:)&lt;br /&gt;
     then have &amp;quot;(y ⋅ x) ⋅ x^ = (z ⋅ x) ⋅ x^&amp;quot; by (simp only:)&lt;br /&gt;
     then have &amp;quot;y ⋅ (x ⋅ x^) = z ⋅ (x ⋅ x^)&amp;quot; by (simp only:asociativa)&lt;br /&gt;
     then have &amp;quot;y ⋅ 𝟭 = z ⋅ 𝟭&amp;quot; by (simp only:inverso_d)&lt;br /&gt;
     then show &amp;quot;y = z &amp;quot; by (simp only:neutro_d)&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
 Ejercicio 4. (2.5 puntos) El conjunto de los conjuntos finitos &lt;br /&gt;
 se define inductivamente por&lt;br /&gt;
    inductive_set Finito :: &amp;quot;&amp;#039;a set set&amp;quot;&lt;br /&gt;
      where&lt;br /&gt;
        vacioI:   &amp;quot;{} ∈ Finito&amp;quot; |&lt;br /&gt;
        insertaI: &amp;quot;A ∈ Finito ⟹ insert a A ∈ Finito&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 Demostrar detalladamente que la unión de dos conjuntos finitos es &lt;br /&gt;
 finito; es decir.&lt;br /&gt;
     ⟦ A ∈ Finito; B ∈ Finito ⟧ ⟹ A ∪ B ∈ Finito&lt;br /&gt;
&lt;br /&gt;
 Nota: Los únicos métodos que se pueden usar son induct y &lt;br /&gt;
 (simp only: ...).  &lt;br /&gt;
 ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
inductive_set Finito :: &amp;quot;&amp;#039;a set set&amp;quot;&lt;br /&gt;
  where&lt;br /&gt;
    vacioI:   &amp;quot;{} ∈ Finito&amp;quot; |&lt;br /&gt;
    insertaI: &amp;quot;A ∈ Finito ⟹ insert a A ∈ Finito&amp;quot;&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración declarativa  detallada ›&lt;br /&gt;
lemma &amp;quot;⟦ A ∈ Finito; B ∈ Finito ⟧ ⟹ A ∪ B ∈ Finito&amp;quot;&lt;br /&gt;
proof (induct rule: Finito.induct)&lt;br /&gt;
  assume &amp;quot;B ∈ Finito&amp;quot;&lt;br /&gt;
  then show &amp;quot;{} ∪ B ∈ Finito&amp;quot; by (simp only: Un_empty_left)&lt;br /&gt;
next&lt;br /&gt;
  fix A a&lt;br /&gt;
  assume AF: &amp;quot;A ∈ Finito&amp;quot; and&lt;br /&gt;
         HI: &amp;quot;B ∈ Finito ⟹ A ∪ B ∈ Finito&amp;quot; and&lt;br /&gt;
         BF: &amp;quot;B ∈ Finito&amp;quot;&lt;br /&gt;
  have &amp;quot;A ∪ B ∈ Finito&amp;quot; by (simp only: HI BF)&lt;br /&gt;
  then have &amp;quot;insert a (A ∪ B) ∈ Finito&amp;quot; by (simp only: insertaI)&lt;br /&gt;
  then show &amp;quot;(insert a A) ∪ B ∈ Finito&amp;quot; &lt;br /&gt;
    by (simp only: Set.Un_insert_left)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma &amp;quot;⟦ A ∈ Finito; B ∈ Finito ⟧ ⟹ A ∪ B ∈ Finito&amp;quot;&lt;br /&gt;
proof (induct rule: Finito.induct)&lt;br /&gt;
  assume &amp;quot;B ∈ Finito&amp;quot;&lt;br /&gt;
  then show &amp;quot;{} ∪ B ∈ Finito&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix A a&lt;br /&gt;
  assume &amp;quot;A ∈ Finito&amp;quot; &lt;br /&gt;
         &amp;quot;B ∈ Finito ⟹ A ∪ B ∈ Finito&amp;quot; &lt;br /&gt;
         &amp;quot;B ∈ Finito&amp;quot;&lt;br /&gt;
  then have &amp;quot;A ∪ B ∈ Finito&amp;quot; by simp&lt;br /&gt;
  then show &amp;quot;(insert a A) ∪ B ∈ Finito&amp;quot; by (simp add: insertaI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración aplicativa  detallada ›&lt;br /&gt;
lemma &amp;quot;⟦ A ∈ Finito; B ∈ Finito ⟧ ⟹ A ∪ B ∈ Finito&amp;quot;&lt;br /&gt;
  apply (erule Finito.induct)&lt;br /&gt;
   apply (simp only: Un_empty_left)&lt;br /&gt;
  apply (simp only: Set.Un_insert_left)&lt;br /&gt;
  apply (simp only: insertaI)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración aplicativa estructurada ›&lt;br /&gt;
lemma &amp;quot;⟦ A ∈ Finito; B ∈ Finito ⟧ ⟹ A ∪ B ∈ Finito&amp;quot;&lt;br /&gt;
  apply (erule Finito.induct)&lt;br /&gt;
   apply simp &lt;br /&gt;
  apply (auto intro: insertaI)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma &amp;quot;⟦ A ∈ Finito; B ∈ Finito ⟧ ⟹ A ∪ B ∈ Finito&amp;quot;&lt;br /&gt;
  by (induct rule: Finito.induct)&lt;br /&gt;
     (auto intro: insertaI)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Examen_2C_sol&amp;diff=1280</id>
		<title>Examen 2C sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Examen_2C_sol&amp;diff=1280"/>
		<updated>2020-09-10T08:19:49Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con «&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt; theory examen_9_sep_sol imports Main  begin  lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;   by auto  lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot; by auto  text ‹---…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
theory examen_9_sep_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 1. (2.5 puntos) Demostrar detalladamente con Isabelle, &lt;br /&gt;
  sin usar métodos automáticos (como simp, auto, ...) sino sólo las &lt;br /&gt;
  reglas básicas, que el siguiente argumento es correcto:&lt;br /&gt;
  Ningún individuo que sea candidato será derrotado si hace una&lt;br /&gt;
  buena campaña. Todo individuo que se postula es un candidato. Cualquier&lt;br /&gt;
  candidato que no sea derrotado, será elegido. Todo individuo que sea&lt;br /&gt;
  elegido hace una buena campaña. Por tanto, todo individuo que se &lt;br /&gt;
  postula será elegido si y sólo si hace una buena campaña. &lt;br /&gt;
&lt;br /&gt;
  Simbología: I(x): x es individuo, C(x): x es candidato,&lt;br /&gt;
              D(x): x es derrotado, B(x): x hace una buena campaña, &lt;br /&gt;
              P(x): x se postula, E(x): x es elegido. &lt;br /&gt;
---------------------------------------------------------------------›&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;∀x. (I(x)∧C(x))∧B(x)⟶¬D(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. I(x)∧P(x) ⟶ C(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. C(x) ∧ ¬D(x) ⟶ E(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. I(x)∧E(x) ⟶ B(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. I(x)∧P(x)⟶(E(x)⟷B(x))&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
  fix a&lt;br /&gt;
  show &amp;quot;I(a)∧P(a) ⟶ (E(a)⟷B(a))&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;I(a)∧P(a)&amp;quot;&lt;br /&gt;
      show &amp;quot;E(a)⟷B(a)&amp;quot;&lt;br /&gt;
        proof&lt;br /&gt;
          assume &amp;quot;E(a)&amp;quot;&lt;br /&gt;
          show  &amp;quot;B(a)&amp;quot;&lt;br /&gt;
             proof -&lt;br /&gt;
              have &amp;quot;I(a)&amp;quot; using ‹I(a)∧P(a)› by (rule conjunct1)&lt;br /&gt;
              then have 1:&amp;quot;I(a)∧E(a)&amp;quot; using ‹E(a)› by (rule conjI)&lt;br /&gt;
              have &amp;quot;I(a)∧E(a) ⟶ B(a)&amp;quot; using assms(4) by (rule allE)&lt;br /&gt;
              then show &amp;quot;B(a)&amp;quot; using 1 by (rule mp)&lt;br /&gt;
             qed  &lt;br /&gt;
        next&lt;br /&gt;
          assume &amp;quot;B(a)&amp;quot;&lt;br /&gt;
          show   &amp;quot;E(a)&amp;quot;&lt;br /&gt;
             proof -&lt;br /&gt;
              have &amp;quot;I(a)∧P(a) ⟶ C(a)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
              then have &amp;quot;C(a)&amp;quot; using   ‹I(a)∧P(a)› by (rule mp)&lt;br /&gt;
              have &amp;quot;I(a)&amp;quot; using  ‹I(a)∧P(a)› by (rule conjunct1)&lt;br /&gt;
              then have &amp;quot;I(a)∧C(a)&amp;quot; using ‹C(a)› by (rule conjI)&lt;br /&gt;
              then have 2:&amp;quot;(I(a)∧C(a))∧B(a)&amp;quot; using ‹B(a)› &lt;br /&gt;
                by (rule conjI)&lt;br /&gt;
              have &amp;quot;(I(a)∧C(a))∧B(a)⟶¬D(a)&amp;quot; using assms(1) &lt;br /&gt;
                by (rule allE)&lt;br /&gt;
              then have &amp;quot;¬D(a)&amp;quot; using 2 by (rule mp)&lt;br /&gt;
              have 3:&amp;quot;C(a) ∧ ¬D(a) ⟶ E(a)&amp;quot; using assms(3) &lt;br /&gt;
                by (rule allE)&lt;br /&gt;
              have &amp;quot;C(a)∧¬D(a)&amp;quot; using ‹C(a)› ‹¬D(a)› by (rule conjI)&lt;br /&gt;
              with 3 show &amp;quot;E(a)&amp;quot; by (rule mp)&lt;br /&gt;
             qed&lt;br /&gt;
        qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed              &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text ‹ -----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. (2.5 puntos) Consideramos la función&lt;br /&gt;
     menores :: int ⇒ int list ⇒ bool&lt;br /&gt;
  tal que (menores a xs) es la lista de los elementos de la lista xs que &lt;br /&gt;
  son menores que a. Por ejemplo,&lt;br /&gt;
     value &amp;quot;menores 2 [3,0,1] = [0,1]&amp;quot;&lt;br /&gt;
     value &amp;quot;menores 2 [3,0,5] = [0]&amp;quot;&lt;br /&gt;
-----------------------------------------------------------------------›&lt;br /&gt;
 &lt;br /&gt;
fun menores :: &amp;quot;int ⇒ int list ⇒ int list&amp;quot; where&lt;br /&gt;
  &amp;quot;menores a []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;menores a (x#xs) = (if x &amp;lt; a then x # (menores a xs)&lt;br /&gt;
                                else (menores a xs))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;menores 2 [3,0,1] = [0,1]&amp;quot;&lt;br /&gt;
value &amp;quot;menores 2 [3,0,5] = [0]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text ‹ -----------------------------------------------------------------&lt;br /&gt;
  Demostrar que la longitud de la lista de elementos menores que uno &lt;br /&gt;
  dado es menor o igual que la longitud de la lista original.&lt;br /&gt;
-----------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración estructurada:›&lt;br /&gt;
&lt;br /&gt;
lemma menores_menor_1:&lt;br /&gt;
  &amp;quot;length (menores x xs) &amp;lt; Suc (length xs)&amp;quot;&lt;br /&gt;
proof(induct xs)&lt;br /&gt;
    show &amp;quot;length (menores x [])&amp;lt;Suc(length [])&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
    fix xs a&lt;br /&gt;
    assume HI: &amp;quot;length (menores x xs) &amp;lt; Suc (length xs)&amp;quot;&lt;br /&gt;
    show &amp;quot;length (menores x (a#xs))&amp;lt; Suc(length (a#xs))&amp;quot;&lt;br /&gt;
    proof(cases &amp;quot;a&amp;lt;x&amp;quot;)&lt;br /&gt;
      case True&lt;br /&gt;
      then have &amp;quot;length (menores x (a#xs)) = length(a#(menores x xs))&amp;quot; &lt;br /&gt;
        by simp&lt;br /&gt;
      also have &amp;quot;... = Suc(length(menores x xs))&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;...&amp;lt; Suc(Suc( length  xs))&amp;quot; using HI by simp&lt;br /&gt;
      also have &amp;quot;... = Suc(length(a#xs))&amp;quot; by simp&lt;br /&gt;
      finally show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
    case False&lt;br /&gt;
    then have &amp;quot;length (menores x (a#xs)) = length(menores x xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... &amp;lt; Suc (length xs)&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;... &amp;lt; Suc (length (a#xs))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada:›&lt;br /&gt;
&lt;br /&gt;
lemma menores_menor_detallada:&lt;br /&gt;
  &amp;quot;length (menores x xs) &amp;lt; Suc (length xs)&amp;quot;&lt;br /&gt;
proof(induct xs)&lt;br /&gt;
  show &amp;quot;length (menores x []) &amp;lt; Suc (length [])&amp;quot; &lt;br /&gt;
    by  (simp only: list.size lessI menores.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix xs a&lt;br /&gt;
  assume HI: &amp;quot;length (menores x xs) &amp;lt; Suc (length xs)&amp;quot;&lt;br /&gt;
  show &amp;quot;length (menores x (a#xs))&amp;lt; Suc(length (a#xs))&amp;quot;&lt;br /&gt;
  proof (cases &amp;quot;a&amp;lt;x&amp;quot;)&lt;br /&gt;
    case True&lt;br /&gt;
    then have &amp;quot;menores x (a#xs) = a#(menores x xs)&amp;quot; &lt;br /&gt;
      by (simp only:if_True menores.simps)&lt;br /&gt;
    then have &amp;quot;length (menores x (a#xs)) = length(a#(menores x xs))&amp;quot; &lt;br /&gt;
     by (simp only:)&lt;br /&gt;
    also have &amp;quot;... = Suc(length(menores x xs))&amp;quot; by (simp only:list.size)&lt;br /&gt;
    also have &amp;quot;...&amp;lt; Suc(Suc( length  xs))&amp;quot; using HI by (simp only:)&lt;br /&gt;
    also have &amp;quot;... = Suc(length(a#xs))&amp;quot; by (simp only: list.size)&lt;br /&gt;
    finally show ?thesis by this&lt;br /&gt;
  next&lt;br /&gt;
    case False&lt;br /&gt;
    then have &amp;quot;menores x (a#xs) = menores x xs&amp;quot; &lt;br /&gt;
      by (simp only: if_False menores.simps(2))&lt;br /&gt;
    then have &amp;quot;length (menores x (a#xs)) = length(menores x xs)&amp;quot; &lt;br /&gt;
      by (simp only:)&lt;br /&gt;
    also have &amp;quot;... &amp;lt; Suc (length xs)&amp;quot; using HI by (simp only:)&lt;br /&gt;
    also have &amp;quot;... &amp;lt; Suc (length (a#xs))&amp;quot; by (simp only: list.size)&lt;br /&gt;
    finally show ?thesis by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración aplicativa:›&lt;br /&gt;
&lt;br /&gt;
lemma menores_menor_aplicativa:&lt;br /&gt;
  &amp;quot;length (menores x xs) &amp;lt; Suc (length xs)&amp;quot;&lt;br /&gt;
  apply (induct xs)&lt;br /&gt;
   apply (simp only: list.size lessI menores.simps(1))&lt;br /&gt;
  apply (simp only:menores.simps(2))&lt;br /&gt;
  apply(split if_split)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (rule impI)&lt;br /&gt;
   apply (simp only: list.size)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (simp only: list.size)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración automática:›&lt;br /&gt;
&lt;br /&gt;
lemma menores_menor_auto:&lt;br /&gt;
  &amp;quot;length (menores x xs) &amp;lt; Suc (length xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;length (menores x xs) &amp;lt; 1 + length xs&amp;quot;&lt;br /&gt;
proof(induct xs)&lt;br /&gt;
  show &amp;quot;length (menores x []) &amp;lt; 1 + (length [])&amp;quot; &lt;br /&gt;
    by  (simp only: list.size lessI menores.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix xs a&lt;br /&gt;
  assume HI: &amp;quot;length (menores x xs) &amp;lt; 1 + length xs&amp;quot;&lt;br /&gt;
  show &amp;quot;length (menores x (a#xs)) &amp;lt; 1 + length (a#xs)&amp;quot;&lt;br /&gt;
  proof (cases &amp;quot;a&amp;lt;x&amp;quot;)&lt;br /&gt;
    case True&lt;br /&gt;
    then have &amp;quot;menores x (a#xs) = a#(menores x xs)&amp;quot; &lt;br /&gt;
      by (simp only:if_True menores.simps)&lt;br /&gt;
    then have &amp;quot;length (menores x (a#xs)) = length(a#(menores x xs))&amp;quot; &lt;br /&gt;
     by (simp only:)&lt;br /&gt;
    also have &amp;quot;... = 1 + (length(menores x xs))&amp;quot; by (simp only:list.size)&lt;br /&gt;
    also have &amp;quot;...&amp;lt; 1 + (1 + ( length  xs))&amp;quot; using HI by (simp only:)&lt;br /&gt;
    also have &amp;quot;... = 1 + (length(a#xs))&amp;quot; by (simp only: list.size)&lt;br /&gt;
    finally show ?thesis by this&lt;br /&gt;
  next&lt;br /&gt;
    case False&lt;br /&gt;
    then have &amp;quot;menores x (a#xs) = menores x xs&amp;quot; &lt;br /&gt;
      by (simp only: if_False menores.simps(2))&lt;br /&gt;
    then have &amp;quot;length (menores x (a#xs)) = length(menores x xs)&amp;quot; &lt;br /&gt;
      by (simp only:)&lt;br /&gt;
    also have &amp;quot;... &amp;lt; 1 +  (length xs)&amp;quot; using HI by (simp only:)&lt;br /&gt;
    also have &amp;quot;... &amp;lt; 1 +  (length (a#xs))&amp;quot; by (simp only: list.size)&lt;br /&gt;
    finally show ?thesis by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. (2.5 puntos) Sea G un grupo. Demostrar que si se verifica&lt;br /&gt;
   ∀x y. (((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭), entonces también se verifica&lt;br /&gt;
   ∀x. ∀y. ∀z. x ⋅ y = z ⋅ x ⟶ y = z&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: auto, blast, force,&lt;br /&gt;
  fast, arith o metis &lt;br /&gt;
  ------------------------------------------------------------------ ›&lt;br /&gt;
&lt;br /&gt;
locale grupo =&lt;br /&gt;
  fixes prod :: &amp;quot;[&amp;#039;a, &amp;#039;a] ⇒ &amp;#039;a&amp;quot; (infixl &amp;quot;⋅&amp;quot; 70)&lt;br /&gt;
    and neutro (&amp;quot;𝟭&amp;quot;) &lt;br /&gt;
    and inverso (&amp;quot;_^&amp;quot; [100] 100)&lt;br /&gt;
  assumes asociativa: &amp;quot;(x ⋅ y) ⋅ z = x ⋅ (y ⋅ z)&amp;quot;&lt;br /&gt;
      and neutro_i:   &amp;quot;𝟭 ⋅ x = x&amp;quot;&lt;br /&gt;
      and neutro_d:   &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
      and inverso_d:  &amp;quot;x ⋅ x^ = 𝟭&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Notas sobre notación:&lt;br /&gt;
   * El producto es ⋅ y se escribe con \ cdot (sin espacio entre ellos). &lt;br /&gt;
   * El neutro es 𝟭 y se escribe con \ y one (sin espacio entre ellos).&lt;br /&gt;
   * El inverso de x es x^ y se escribe pulsando 2 veces en ^. *)&lt;br /&gt;
&lt;br /&gt;
context grupo&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  assumes  &amp;quot;((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
  shows &amp;quot;x ⋅ y = z ⋅ x ⟶ y = z&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;x ⋅ y = z ⋅ x&amp;quot;&lt;br /&gt;
  show &amp;quot;y = z&amp;quot;&lt;br /&gt;
  proof-&lt;br /&gt;
    have  2: &amp;quot;x ⋅ y = y ⋅ x&amp;quot;&lt;br /&gt;
    proof-&lt;br /&gt;
      have &amp;quot;x ⋅ y = (x ⋅ y) ⋅ 𝟭&amp;quot; by (simp only:  neutro_d)&lt;br /&gt;
      also have &amp;quot;… =  (x ⋅ y) ⋅ (((y^ ⋅ x^) ⋅ y) ⋅ x)&amp;quot; &lt;br /&gt;
        using assms by (simp only:)&lt;br /&gt;
      also have &amp;quot;… =  (x ⋅ (y ⋅ y^) ⋅ x^) ⋅ y ⋅ x&amp;quot;&lt;br /&gt;
        by (simp only: asociativa)&lt;br /&gt;
      also have &amp;quot;… =  (x ⋅ 𝟭 ⋅ x^) ⋅ y ⋅ x&amp;quot;&lt;br /&gt;
        by (simp only: inverso_d)&lt;br /&gt;
      also have &amp;quot;… =  (x ⋅ x^) ⋅ y ⋅ x&amp;quot;&lt;br /&gt;
        by (simp only: neutro_d)&lt;br /&gt;
      also have &amp;quot;… = 𝟭 ⋅ y ⋅ x&amp;quot;&lt;br /&gt;
        by (simp only: inverso_d)&lt;br /&gt;
      also have &amp;quot;… = y ⋅ x&amp;quot;&lt;br /&gt;
         by (simp only: neutro_i)&lt;br /&gt;
       finally show  &amp;quot;x ⋅ y = y ⋅ x&amp;quot; &lt;br /&gt;
         by this&lt;br /&gt;
     qed&lt;br /&gt;
     have &amp;quot;y ⋅ x = z ⋅ x&amp;quot; using 1 2 by (simp only:)&lt;br /&gt;
     then have &amp;quot;(y ⋅ x) ⋅ x^ = (z ⋅ x) ⋅ x^&amp;quot; by (simp only:)&lt;br /&gt;
     then have &amp;quot;y ⋅ (x ⋅ x^) = z ⋅ (x ⋅ x^)&amp;quot; by (simp only:asociativa)&lt;br /&gt;
     then have &amp;quot;y ⋅ 𝟭 = z ⋅ 𝟭&amp;quot; by (simp only:inverso_d)&lt;br /&gt;
     then show &amp;quot;y = z &amp;quot; by (simp only:neutro_d)&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
 Ejercicio 4. (2.5 puntos) El conjunto de los conjuntos finitos &lt;br /&gt;
 se define inductivamente por&lt;br /&gt;
    inductive_set Finito :: &amp;quot;&amp;#039;a set set&amp;quot;&lt;br /&gt;
      where&lt;br /&gt;
        vacioI:   &amp;quot;{} ∈ Finito&amp;quot; |&lt;br /&gt;
        insertaI: &amp;quot;A ∈ Finito ⟹ insert a A ∈ Finito&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 Demostrar detalladamente que la unión de dos conjuntos finitos es &lt;br /&gt;
 finito; es decir.&lt;br /&gt;
     ⟦ A ∈ Finito; B ∈ Finito ⟧ ⟹ A ∪ B ∈ Finito&lt;br /&gt;
&lt;br /&gt;
 Nota: Los únicos métodos que se pueden usar son induct y &lt;br /&gt;
 (simp only: ...).  &lt;br /&gt;
 ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
inductive_set Finito :: &amp;quot;&amp;#039;a set set&amp;quot;&lt;br /&gt;
  where&lt;br /&gt;
    vacioI:   &amp;quot;{} ∈ Finito&amp;quot; |&lt;br /&gt;
    insertaI: &amp;quot;A ∈ Finito ⟹ insert a A ∈ Finito&amp;quot;&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración declarativa  detallada ›&lt;br /&gt;
lemma &amp;quot;⟦ A ∈ Finito; B ∈ Finito ⟧ ⟹ A ∪ B ∈ Finito&amp;quot;&lt;br /&gt;
proof (induct rule: Finito.induct)&lt;br /&gt;
  assume &amp;quot;B ∈ Finito&amp;quot;&lt;br /&gt;
  then show &amp;quot;{} ∪ B ∈ Finito&amp;quot; by (simp only: Un_empty_left)&lt;br /&gt;
next&lt;br /&gt;
  fix A a&lt;br /&gt;
  assume AF: &amp;quot;A ∈ Finito&amp;quot; and&lt;br /&gt;
         HI: &amp;quot;B ∈ Finito ⟹ A ∪ B ∈ Finito&amp;quot; and&lt;br /&gt;
         BF: &amp;quot;B ∈ Finito&amp;quot;&lt;br /&gt;
  have &amp;quot;A ∪ B ∈ Finito&amp;quot; by (simp only: HI BF)&lt;br /&gt;
  then have &amp;quot;insert a (A ∪ B) ∈ Finito&amp;quot; by (simp only: insertaI)&lt;br /&gt;
  then show &amp;quot;(insert a A) ∪ B ∈ Finito&amp;quot; &lt;br /&gt;
    by (simp only: Set.Un_insert_left)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma &amp;quot;⟦ A ∈ Finito; B ∈ Finito ⟧ ⟹ A ∪ B ∈ Finito&amp;quot;&lt;br /&gt;
proof (induct rule: Finito.induct)&lt;br /&gt;
  assume &amp;quot;B ∈ Finito&amp;quot;&lt;br /&gt;
  then show &amp;quot;{} ∪ B ∈ Finito&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix A a&lt;br /&gt;
  assume &amp;quot;A ∈ Finito&amp;quot; &lt;br /&gt;
         &amp;quot;B ∈ Finito ⟹ A ∪ B ∈ Finito&amp;quot; &lt;br /&gt;
         &amp;quot;B ∈ Finito&amp;quot;&lt;br /&gt;
  then have &amp;quot;A ∪ B ∈ Finito&amp;quot; by simp&lt;br /&gt;
  then show &amp;quot;(insert a A) ∪ B ∈ Finito&amp;quot; by (simp add: insertaI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración aplicativa  detallada ›&lt;br /&gt;
lemma &amp;quot;⟦ A ∈ Finito; B ∈ Finito ⟧ ⟹ A ∪ B ∈ Finito&amp;quot;&lt;br /&gt;
  apply (erule Finito.induct)&lt;br /&gt;
   apply (simp only: Un_empty_left)&lt;br /&gt;
  apply (simp only: Set.Un_insert_left)&lt;br /&gt;
  apply (simp only: insertaI)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración aplicativa estructurada ›&lt;br /&gt;
lemma &amp;quot;⟦ A ∈ Finito; B ∈ Finito ⟧ ⟹ A ∪ B ∈ Finito&amp;quot;&lt;br /&gt;
  apply (erule Finito.induct)&lt;br /&gt;
   apply simp &lt;br /&gt;
  apply (auto intro: insertaI)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma &amp;quot;⟦ A ∈ Finito; B ∈ Finito ⟧ ⟹ A ∪ B ∈ Finito&amp;quot;&lt;br /&gt;
  by (induct rule: Finito.induct)&lt;br /&gt;
     (auto intro: insertaI)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Examen_2C&amp;diff=1279</id>
		<title>Examen 2C</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Examen_2C&amp;diff=1279"/>
		<updated>2020-09-10T08:18:50Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Protegió «Examen 2C» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
text ‹Examen de Lógica Matemática y Fundamentos (9-septiembre-2020)›&lt;br /&gt;
&lt;br /&gt;
theory examen_9_sep&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  Apellidos:&lt;br /&gt;
  Nombre: &lt;br /&gt;
› &lt;br /&gt;
&lt;br /&gt;
text ‹Sustituye la palabra examen_9_sep por tu usuario de la Universidad &lt;br /&gt;
  de Sevilla y graba el fichero con dicho usuario.thy› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 1: El tiempo de realización del ejercicio es de 9:30 a 11:30.› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 2: Además de las reglas básicas de deducción natural de la &lt;br /&gt;
  lógica proposicional y de primer orden, también se pueden usar las &lt;br /&gt;
  reglas notnotI y mt que demostramos a  continuación.›&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 1. (2.5 puntos) Demostrar detalladamente con Isabelle, &lt;br /&gt;
  sin usar métodos automáticos (como simp, auto, ...) sino sólo las &lt;br /&gt;
  reglas básicas, que el siguiente argumento es correcto:&lt;br /&gt;
  Ningún individuo que sea candidato será derrotado si hace una&lt;br /&gt;
  buena campaña. Todo individuo que se postula es un candidato. Cualquier&lt;br /&gt;
  candidato que no sea derrotado, será elegido. Todo individuo que sea&lt;br /&gt;
  elegido hace una buena campaña. Por tanto, todo individuo que se &lt;br /&gt;
  postula será elegido si y sólo si hace una buena campaña. &lt;br /&gt;
&lt;br /&gt;
  Simbología: I(x): x es individuo, C(x): x es candidato,&lt;br /&gt;
              D(x): x es derrotado, B(x): x hace una buena campaña, &lt;br /&gt;
              P(x): x se postula, E(x): x es elegido. &lt;br /&gt;
---------------------------------------------------------------------›&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text ‹ -----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. (2.5 puntos) Consideramos la función&lt;br /&gt;
     menores :: int ⇒ int list ⇒ bool&lt;br /&gt;
  tal que (menores a xs) es la lista de los elementos de la lista xs que &lt;br /&gt;
  son menores que a. Por ejemplo,&lt;br /&gt;
     value &amp;quot;menores 2 [3,0,1] = [0,1]&amp;quot;&lt;br /&gt;
     value &amp;quot;menores 2 [3,0,5] = [0]&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  fun menores :: &amp;quot;int ⇒ int list ⇒ int list&amp;quot; where&lt;br /&gt;
    &amp;quot;menores a []     = []&amp;quot;&lt;br /&gt;
  | &amp;quot;menores a (x#xs) = (if x &amp;lt; a then x # (menores a xs)&lt;br /&gt;
                                else (menores a xs))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  Demostrar que la longitud de la lista de elementos menores que uno &lt;br /&gt;
  dado es menor o igual que la longitud de la lista original.&lt;br /&gt;
-----------------------------------------------------------------------›&lt;br /&gt;
 &lt;br /&gt;
fun menores :: &amp;quot;int ⇒ int list ⇒ int list&amp;quot; where&lt;br /&gt;
  &amp;quot;menores a []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;menores a (x#xs) = (if x &amp;lt; a then x # (menores a xs)&lt;br /&gt;
                                else (menores a xs))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;menores 2 [3,0,1] = [0,1]&amp;quot;&lt;br /&gt;
value &amp;quot;menores 2 [3,0,5] = [0]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
lemma menores_menor:&lt;br /&gt;
  &amp;quot;length (menores x xs) &amp;lt; 1 + (length xs)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. (2.5 puntos) Sea G un grupo. Demostrar que si se verifica&lt;br /&gt;
   ∀x y. (((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭), entonces también se verifica&lt;br /&gt;
   ∀x. ∀y. ∀z. x ⋅ y = z ⋅ x ⟶ y = z&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: auto, blast, force,&lt;br /&gt;
  fast, arith o metis &lt;br /&gt;
  ------------------------------------------------------------------ ›&lt;br /&gt;
&lt;br /&gt;
locale grupo =&lt;br /&gt;
  fixes prod :: &amp;quot;[&amp;#039;a, &amp;#039;a] ⇒ &amp;#039;a&amp;quot; (infixl &amp;quot;⋅&amp;quot; 70)&lt;br /&gt;
    and neutro (&amp;quot;𝟭&amp;quot;) &lt;br /&gt;
    and inverso (&amp;quot;_^&amp;quot; [100] 100)&lt;br /&gt;
  assumes asociativa: &amp;quot;(x ⋅ y) ⋅ z = x ⋅ (y ⋅ z)&amp;quot;&lt;br /&gt;
      and neutro_i:   &amp;quot;𝟭 ⋅ x = x&amp;quot;&lt;br /&gt;
      and neutro_d:   &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
      and inverso_d:  &amp;quot;x ⋅ x^ = 𝟭&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Notas sobre notación:&lt;br /&gt;
   * El producto es ⋅ y se escribe con \ cdot (sin espacio entre ellos). &lt;br /&gt;
   * El neutro es 𝟭 y se escribe con \ y one (sin espacio entre ellos).&lt;br /&gt;
   * El inverso de x es x^ y se escribe pulsando 2 veces en ^. *)&lt;br /&gt;
&lt;br /&gt;
context grupo&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  assumes  &amp;quot;((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
  shows &amp;quot;x ⋅ y = z ⋅ x ⟶ y = z&amp;quot;&lt;br /&gt;
  oops  &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
 Ejercicio 4. (2.5 puntos) El conjunto de los conjuntos finitos &lt;br /&gt;
 se define inductivamente por&lt;br /&gt;
    inductive_set Finito :: &amp;quot;&amp;#039;a set set&amp;quot;&lt;br /&gt;
      where&lt;br /&gt;
        vacioI:   &amp;quot;{} ∈ Finito&amp;quot; |&lt;br /&gt;
        insertaI: &amp;quot;A ∈ Finito ⟹ insert a A ∈ Finito&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 Demostrar detalladamente que la unión de dos conjuntos finitos es &lt;br /&gt;
 finito; es decir.&lt;br /&gt;
     ⟦ A ∈ Finito; B ∈ Finito ⟧ ⟹ A ∪ B ∈ Finito&lt;br /&gt;
&lt;br /&gt;
 Nota: Los únicos métodos que se pueden usar son induct y &lt;br /&gt;
 (simp only: ...).  &lt;br /&gt;
 ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
inductive_set Finito :: &amp;quot;&amp;#039;a set set&amp;quot;&lt;br /&gt;
  where&lt;br /&gt;
    vacioI:   &amp;quot;{} ∈ Finito&amp;quot; |&lt;br /&gt;
    insertaI: &amp;quot;A ∈ Finito ⟹ insert a A ∈ Finito&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;⟦ A ∈ Finito; B ∈ Finito ⟧ ⟹ A ∪ B ∈ Finito&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Examen_2C&amp;diff=1278</id>
		<title>Examen 2C</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Examen_2C&amp;diff=1278"/>
		<updated>2020-09-10T08:18:36Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con «&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt; text ‹Examen de Lógica Matemática y Fundamentos (9-septiembre-2020)›  theory examen_9_sep imports Main  begin  text ‹   Apellidos:   Nomb…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
text ‹Examen de Lógica Matemática y Fundamentos (9-septiembre-2020)›&lt;br /&gt;
&lt;br /&gt;
theory examen_9_sep&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  Apellidos:&lt;br /&gt;
  Nombre: &lt;br /&gt;
› &lt;br /&gt;
&lt;br /&gt;
text ‹Sustituye la palabra examen_9_sep por tu usuario de la Universidad &lt;br /&gt;
  de Sevilla y graba el fichero con dicho usuario.thy› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 1: El tiempo de realización del ejercicio es de 9:30 a 11:30.› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 2: Además de las reglas básicas de deducción natural de la &lt;br /&gt;
  lógica proposicional y de primer orden, también se pueden usar las &lt;br /&gt;
  reglas notnotI y mt que demostramos a  continuación.›&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 1. (2.5 puntos) Demostrar detalladamente con Isabelle, &lt;br /&gt;
  sin usar métodos automáticos (como simp, auto, ...) sino sólo las &lt;br /&gt;
  reglas básicas, que el siguiente argumento es correcto:&lt;br /&gt;
  Ningún individuo que sea candidato será derrotado si hace una&lt;br /&gt;
  buena campaña. Todo individuo que se postula es un candidato. Cualquier&lt;br /&gt;
  candidato que no sea derrotado, será elegido. Todo individuo que sea&lt;br /&gt;
  elegido hace una buena campaña. Por tanto, todo individuo que se &lt;br /&gt;
  postula será elegido si y sólo si hace una buena campaña. &lt;br /&gt;
&lt;br /&gt;
  Simbología: I(x): x es individuo, C(x): x es candidato,&lt;br /&gt;
              D(x): x es derrotado, B(x): x hace una buena campaña, &lt;br /&gt;
              P(x): x se postula, E(x): x es elegido. &lt;br /&gt;
---------------------------------------------------------------------›&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text ‹ -----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. (2.5 puntos) Consideramos la función&lt;br /&gt;
     menores :: int ⇒ int list ⇒ bool&lt;br /&gt;
  tal que (menores a xs) es la lista de los elementos de la lista xs que &lt;br /&gt;
  son menores que a. Por ejemplo,&lt;br /&gt;
     value &amp;quot;menores 2 [3,0,1] = [0,1]&amp;quot;&lt;br /&gt;
     value &amp;quot;menores 2 [3,0,5] = [0]&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  fun menores :: &amp;quot;int ⇒ int list ⇒ int list&amp;quot; where&lt;br /&gt;
    &amp;quot;menores a []     = []&amp;quot;&lt;br /&gt;
  | &amp;quot;menores a (x#xs) = (if x &amp;lt; a then x # (menores a xs)&lt;br /&gt;
                                else (menores a xs))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  Demostrar que la longitud de la lista de elementos menores que uno &lt;br /&gt;
  dado es menor o igual que la longitud de la lista original.&lt;br /&gt;
-----------------------------------------------------------------------›&lt;br /&gt;
 &lt;br /&gt;
fun menores :: &amp;quot;int ⇒ int list ⇒ int list&amp;quot; where&lt;br /&gt;
  &amp;quot;menores a []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;menores a (x#xs) = (if x &amp;lt; a then x # (menores a xs)&lt;br /&gt;
                                else (menores a xs))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;menores 2 [3,0,1] = [0,1]&amp;quot;&lt;br /&gt;
value &amp;quot;menores 2 [3,0,5] = [0]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
lemma menores_menor:&lt;br /&gt;
  &amp;quot;length (menores x xs) &amp;lt; 1 + (length xs)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. (2.5 puntos) Sea G un grupo. Demostrar que si se verifica&lt;br /&gt;
   ∀x y. (((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭), entonces también se verifica&lt;br /&gt;
   ∀x. ∀y. ∀z. x ⋅ y = z ⋅ x ⟶ y = z&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: auto, blast, force,&lt;br /&gt;
  fast, arith o metis &lt;br /&gt;
  ------------------------------------------------------------------ ›&lt;br /&gt;
&lt;br /&gt;
locale grupo =&lt;br /&gt;
  fixes prod :: &amp;quot;[&amp;#039;a, &amp;#039;a] ⇒ &amp;#039;a&amp;quot; (infixl &amp;quot;⋅&amp;quot; 70)&lt;br /&gt;
    and neutro (&amp;quot;𝟭&amp;quot;) &lt;br /&gt;
    and inverso (&amp;quot;_^&amp;quot; [100] 100)&lt;br /&gt;
  assumes asociativa: &amp;quot;(x ⋅ y) ⋅ z = x ⋅ (y ⋅ z)&amp;quot;&lt;br /&gt;
      and neutro_i:   &amp;quot;𝟭 ⋅ x = x&amp;quot;&lt;br /&gt;
      and neutro_d:   &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
      and inverso_d:  &amp;quot;x ⋅ x^ = 𝟭&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Notas sobre notación:&lt;br /&gt;
   * El producto es ⋅ y se escribe con \ cdot (sin espacio entre ellos). &lt;br /&gt;
   * El neutro es 𝟭 y se escribe con \ y one (sin espacio entre ellos).&lt;br /&gt;
   * El inverso de x es x^ y se escribe pulsando 2 veces en ^. *)&lt;br /&gt;
&lt;br /&gt;
context grupo&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  assumes  &amp;quot;((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
  shows &amp;quot;x ⋅ y = z ⋅ x ⟶ y = z&amp;quot;&lt;br /&gt;
  oops  &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
 Ejercicio 4. (2.5 puntos) El conjunto de los conjuntos finitos &lt;br /&gt;
 se define inductivamente por&lt;br /&gt;
    inductive_set Finito :: &amp;quot;&amp;#039;a set set&amp;quot;&lt;br /&gt;
      where&lt;br /&gt;
        vacioI:   &amp;quot;{} ∈ Finito&amp;quot; |&lt;br /&gt;
        insertaI: &amp;quot;A ∈ Finito ⟹ insert a A ∈ Finito&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 Demostrar detalladamente que la unión de dos conjuntos finitos es &lt;br /&gt;
 finito; es decir.&lt;br /&gt;
     ⟦ A ∈ Finito; B ∈ Finito ⟧ ⟹ A ∪ B ∈ Finito&lt;br /&gt;
&lt;br /&gt;
 Nota: Los únicos métodos que se pueden usar son induct y &lt;br /&gt;
 (simp only: ...).  &lt;br /&gt;
 ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
inductive_set Finito :: &amp;quot;&amp;#039;a set set&amp;quot;&lt;br /&gt;
  where&lt;br /&gt;
    vacioI:   &amp;quot;{} ∈ Finito&amp;quot; |&lt;br /&gt;
    insertaI: &amp;quot;A ∈ Finito ⟹ insert a A ∈ Finito&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;⟦ A ∈ Finito; B ∈ Finito ⟧ ⟹ A ∪ B ∈ Finito&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Ejercicios&amp;diff=1277</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Ejercicios&amp;diff=1277"/>
		<updated>2020-09-10T08:16:58Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-19/ejercicios/ejercicios-LMF-2019-20.pdf libro de ejercicios].&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]], [[Relación 1 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R1_sol.pdf Una solución]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R2.thy Deducción natural proposicional con Isabelle] ([[R2 |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Rel 2 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R3.thy Deducción natural proposicional con Isabelle (II)] ([[R3 |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Rel 3 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4.thy Sintaxis y semántica de la lógica de primer orden.] ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4_sol.pdf Una solución]).).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R5.thy Deducción natural en lógica de primer orden.] ([[R5 |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Rel 5 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R6.thy Formalización y argumentación con Isabelle/HOL.] ([[R6 |Enunciado]], [[Relación 6 |Solución colaborativa]] , [[Rel 6 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R7.thy Deducción natural,formalización y argumentación en LPO con Isabelle/HOL.] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R8.thy Programación funcional en  Isabelle/HOL.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 8 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 8 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R9.thy Programación funcional en  Isabelle/HOL (II).] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 9 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 9 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1 (24-04-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T1 |Enunciado]], [[T1 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R10.thy Razonamiento sobre programas en Isabelle/HOL.] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 10 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL(II).] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 11 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R12.thy Razonamiento sobre programas en Isabelle/HOL(III).] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 12 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2 (12-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T2 |Enunciado]], [[T2 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R13.thy Recorridos de árboles.] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 13 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R14.thy Una axiomátización de la Geometría.] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 14 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3 (19-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T3 |Enunciado]], [[T3 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R15.thy Definiciones inductivas: clausuras.] ([[R15 |Enunciado]], [[Relación 15 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 15 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4 (26-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T4 |Enunciado]], [[T4 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 5 (02-06-2020)&amp;#039;&amp;#039;&amp;#039;: &lt;br /&gt;
** ([[T5-1 |Enunciado (1)]], [[T5-1 sol |Una solución]]).&lt;br /&gt;
** ([[T5-2 |Enunciado (2)]], [[T5-2 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Trabajo final&amp;#039;&amp;#039;&amp;#039;: ([[TF |Enunciado]], [[TF sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen (2-07-2020)&amp;#039;&amp;#039;&amp;#039;: ([[Examen 1C |Enunciado]], [[Examen 1C sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen (9-09-2020)&amp;#039;&amp;#039;&amp;#039;: ([[Examen 2C |Enunciado]], [[Examen 2C sol |Una solución]]).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Nota&amp;#039;&amp;#039;&amp;#039; Se pueden publicar las soluciones hasta el martes 31 de marzo.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]] y [[Sol 9 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R10.thy Programación funcional en Isabelle (2)] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]  y [[Sol 10 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]  y [[Sol 11 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R12.thy Recorridos de árboles en Isabelle/HOL] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]  y [[Sol 12 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R13.thy Definiciones inductivas: clausuras] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]  y [[Sol 13 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R14.thy Desarrollo de teorías axiomáticas] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]  y [[Sol 14 | una solución]]).&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Examen_1C&amp;diff=1276</id>
		<title>Examen 1C</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Examen_1C&amp;diff=1276"/>
		<updated>2020-07-06T12:32:54Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Protegió «Examen 1C» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
text ‹Examen de Lógica Matemática y Fundamentos (2-julio-2020)›&lt;br /&gt;
&lt;br /&gt;
theory examen_2_jul&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  Apellidos:&lt;br /&gt;
  Nombre: &lt;br /&gt;
› &lt;br /&gt;
&lt;br /&gt;
text ‹Sustituye la palabra examen_2_jul por tu usuario de la Universidad &lt;br /&gt;
  de Sevilla y graba el fichero con dicho usuario.thy› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 1: El tiempo de realización del ejercicio es de 9:30 a 11:30.› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 2: Además de las reglas básicas de deducción natural de la &lt;br /&gt;
  lógica proposicional y de primer orden, también se pueden usar las &lt;br /&gt;
  reglas notnotI y mt que demostramos a  continuación.›&lt;br /&gt;
&lt;br /&gt;
text ‹Nota 3: En el proceso de corrección del examen, y antes de la&lt;br /&gt;
  publicación de las calificaciones del mismo, se podrá requerir&lt;br /&gt;
  aclaraciones sobre su respuesta. Estas aclaraciones se harán por &lt;br /&gt;
  alguno de los procedimientos virtuales previstos en la PEV. ›&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 1. Demostrar detalladamente con Isabelle, sin usar métodos&lt;br /&gt;
  automáticos (como simp, auto, ...) sino sólo las reglas básicas, &lt;br /&gt;
  que el siguiente argumento es correcto &lt;br /&gt;
     Si todas las medicinas están contaminadas, entonces todos los&lt;br /&gt;
     técnicos negligentes son unos bribones. Si hay medicinas&lt;br /&gt;
     contaminadas, entonces todas las medicinas están contaminadas y son&lt;br /&gt;
     peligrosas. Todos los germicidas son medicinas. Sólo los&lt;br /&gt;
     negligentes son distraídos. Por tanto, si cualquier técnico es&lt;br /&gt;
     distraído y si algunos germicidas están contaminados, los técnicos&lt;br /&gt;
     son bribones. &lt;br /&gt;
  Usar la siguiente simbología: &lt;br /&gt;
     M(x): x es medicina,  C(x): x está contaminada, &lt;br /&gt;
     T(x): x es técnico,   N(x): x es un negligente, &lt;br /&gt;
     B(x): x es un bribón, G(x): x es germicida, &lt;br /&gt;
     D(x): x es distraído, P(x): x es peligrosa.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Se consideran las definiciones de las siguientes&lt;br /&gt;
  funciones (que se dan a continuación)&lt;br /&gt;
     estaEn   :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
     sublista :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
     elimina  :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tales que &lt;br /&gt;
  + (estaEn x xs) se verifica si el elemento x está en la lista xs. Por&lt;br /&gt;
    ejemplo,  &lt;br /&gt;
       estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
       estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  + (sublista xs ys) se verifica si todos los elementos de la lista xs&lt;br /&gt;
    están en la lista ys. Por ejemplo, &lt;br /&gt;
       sublista [(1::nat),2,3] [3,2,1,2] = True&lt;br /&gt;
       sublista [(1::nat),2,3] [2,1,2]   = False&lt;br /&gt;
  + (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
    elementos de xs. Por ejemplo, &lt;br /&gt;
       elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
&lt;br /&gt;
  Demostrar detalladamente que&lt;br /&gt;
     sublista (elimina n xs) xs&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x []     = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a#xs) = (a=x ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun sublista :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sublista [] ys     = True&amp;quot;&lt;br /&gt;
| &amp;quot;sublista (x#xs) ys = (estaEn x ys ∧ sublista xs ys )&amp;quot;&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;
lemma eliminaSublista: &amp;quot;sublista (elimina n xs) xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. Sea G un grupo. Demostrar que las siguientes condiciones&lt;br /&gt;
  son equivalentes:&lt;br /&gt;
    (+) G es commutativo, es decir, ∀x y. (x ⋅ y = y ⋅ x) &lt;br /&gt;
    (+) ∀x y. (((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭)&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: auto, blast, force,&lt;br /&gt;
  fast, arith o metis &lt;br /&gt;
  ------------------------------------------------------------------ ›&lt;br /&gt;
&lt;br /&gt;
locale grupo =&lt;br /&gt;
  fixes prod :: &amp;quot;[&amp;#039;a, &amp;#039;a] ⇒ &amp;#039;a&amp;quot; (infixl &amp;quot;⋅&amp;quot; 70)&lt;br /&gt;
    and neutro (&amp;quot;𝟭&amp;quot;) &lt;br /&gt;
    and inverso (&amp;quot;_^&amp;quot; [100] 100)&lt;br /&gt;
  assumes asociativa: &amp;quot;(x ⋅ y) ⋅ z = x ⋅ (y ⋅ z)&amp;quot;&lt;br /&gt;
      and neutro_i:   &amp;quot;𝟭 ⋅ x = x&amp;quot;&lt;br /&gt;
      and neutro_d:   &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
      and inverso_i:  &amp;quot;x^ ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Notas sobre notación:&lt;br /&gt;
   * El producto es ⋅ y se escribe con \ cdot (sin espacio entre ellos). &lt;br /&gt;
   * El neutro es 𝟭 y se escribe con \ y one (sin espacio entre ellos).&lt;br /&gt;
   * El inverso de x es x^ y se escribe pulsando 2 veces en ^. *)&lt;br /&gt;
&lt;br /&gt;
context grupo&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
  shows   &amp;quot;x ⋅ y = y ⋅ x&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;x ⋅ y = y ⋅ x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
      &lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 4. Se define la clausura reflexiva, simétrica y transitiva &lt;br /&gt;
  de una relación binaria r como sigue:&lt;br /&gt;
     inductive rst :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;  &lt;br /&gt;
      for r where&lt;br /&gt;
       refl1: &amp;quot;rst r x x&amp;quot;&lt;br /&gt;
     | trans1: &amp;quot;r x y ⟹ rst r y z ⟹ rst r x z&amp;quot;&lt;br /&gt;
     | trans2: &amp;quot;r y x ⟹ rst r y z ⟹ rst r x z&amp;quot; &lt;br /&gt;
                     &lt;br /&gt;
  Demostrar detalladamente que la relación (rst es r) simétrica. &lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
inductive rst :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;  &lt;br /&gt;
 for r where&lt;br /&gt;
  refl1: &amp;quot;rst r x x&amp;quot;&lt;br /&gt;
| trans1: &amp;quot;r x y ⟹ rst r y z ⟹ rst r x z&amp;quot;&lt;br /&gt;
| trans2: &amp;quot;r y x ⟹ rst r y z ⟹ rst r x z&amp;quot; &lt;br /&gt;
&lt;br /&gt;
lemma rst_es_simetrica : &amp;quot;rst r x y ⟹ rst r y x&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Examen_1C&amp;diff=1275</id>
		<title>Examen 1C</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Examen_1C&amp;diff=1275"/>
		<updated>2020-07-06T12:32:42Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con «&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt; text ‹Examen de Lógica Matemática y Fundamentos (2-julio-2020)›  theory examen_2_jul imports Main  begin  text ‹   Apellidos:   Nombre:…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
text ‹Examen de Lógica Matemática y Fundamentos (2-julio-2020)›&lt;br /&gt;
&lt;br /&gt;
theory examen_2_jul&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  Apellidos:&lt;br /&gt;
  Nombre: &lt;br /&gt;
› &lt;br /&gt;
&lt;br /&gt;
text ‹Sustituye la palabra examen_2_jul por tu usuario de la Universidad &lt;br /&gt;
  de Sevilla y graba el fichero con dicho usuario.thy› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 1: El tiempo de realización del ejercicio es de 9:30 a 11:30.› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 2: Además de las reglas básicas de deducción natural de la &lt;br /&gt;
  lógica proposicional y de primer orden, también se pueden usar las &lt;br /&gt;
  reglas notnotI y mt que demostramos a  continuación.›&lt;br /&gt;
&lt;br /&gt;
text ‹Nota 3: En el proceso de corrección del examen, y antes de la&lt;br /&gt;
  publicación de las calificaciones del mismo, se podrá requerir&lt;br /&gt;
  aclaraciones sobre su respuesta. Estas aclaraciones se harán por &lt;br /&gt;
  alguno de los procedimientos virtuales previstos en la PEV. ›&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 1. Demostrar detalladamente con Isabelle, sin usar métodos&lt;br /&gt;
  automáticos (como simp, auto, ...) sino sólo las reglas básicas, &lt;br /&gt;
  que el siguiente argumento es correcto &lt;br /&gt;
     Si todas las medicinas están contaminadas, entonces todos los&lt;br /&gt;
     técnicos negligentes son unos bribones. Si hay medicinas&lt;br /&gt;
     contaminadas, entonces todas las medicinas están contaminadas y son&lt;br /&gt;
     peligrosas. Todos los germicidas son medicinas. Sólo los&lt;br /&gt;
     negligentes son distraídos. Por tanto, si cualquier técnico es&lt;br /&gt;
     distraído y si algunos germicidas están contaminados, los técnicos&lt;br /&gt;
     son bribones. &lt;br /&gt;
  Usar la siguiente simbología: &lt;br /&gt;
     M(x): x es medicina,  C(x): x está contaminada, &lt;br /&gt;
     T(x): x es técnico,   N(x): x es un negligente, &lt;br /&gt;
     B(x): x es un bribón, G(x): x es germicida, &lt;br /&gt;
     D(x): x es distraído, P(x): x es peligrosa.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Se consideran las definiciones de las siguientes&lt;br /&gt;
  funciones (que se dan a continuación)&lt;br /&gt;
     estaEn   :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
     sublista :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
     elimina  :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tales que &lt;br /&gt;
  + (estaEn x xs) se verifica si el elemento x está en la lista xs. Por&lt;br /&gt;
    ejemplo,  &lt;br /&gt;
       estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
       estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  + (sublista xs ys) se verifica si todos los elementos de la lista xs&lt;br /&gt;
    están en la lista ys. Por ejemplo, &lt;br /&gt;
       sublista [(1::nat),2,3] [3,2,1,2] = True&lt;br /&gt;
       sublista [(1::nat),2,3] [2,1,2]   = False&lt;br /&gt;
  + (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
    elementos de xs. Por ejemplo, &lt;br /&gt;
       elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
&lt;br /&gt;
  Demostrar detalladamente que&lt;br /&gt;
     sublista (elimina n xs) xs&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x []     = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a#xs) = (a=x ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun sublista :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sublista [] ys     = True&amp;quot;&lt;br /&gt;
| &amp;quot;sublista (x#xs) ys = (estaEn x ys ∧ sublista xs ys )&amp;quot;&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;
lemma eliminaSublista: &amp;quot;sublista (elimina n xs) xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. Sea G un grupo. Demostrar que las siguientes condiciones&lt;br /&gt;
  son equivalentes:&lt;br /&gt;
    (+) G es commutativo, es decir, ∀x y. (x ⋅ y = y ⋅ x) &lt;br /&gt;
    (+) ∀x y. (((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭)&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: auto, blast, force,&lt;br /&gt;
  fast, arith o metis &lt;br /&gt;
  ------------------------------------------------------------------ ›&lt;br /&gt;
&lt;br /&gt;
locale grupo =&lt;br /&gt;
  fixes prod :: &amp;quot;[&amp;#039;a, &amp;#039;a] ⇒ &amp;#039;a&amp;quot; (infixl &amp;quot;⋅&amp;quot; 70)&lt;br /&gt;
    and neutro (&amp;quot;𝟭&amp;quot;) &lt;br /&gt;
    and inverso (&amp;quot;_^&amp;quot; [100] 100)&lt;br /&gt;
  assumes asociativa: &amp;quot;(x ⋅ y) ⋅ z = x ⋅ (y ⋅ z)&amp;quot;&lt;br /&gt;
      and neutro_i:   &amp;quot;𝟭 ⋅ x = x&amp;quot;&lt;br /&gt;
      and neutro_d:   &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
      and inverso_i:  &amp;quot;x^ ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Notas sobre notación:&lt;br /&gt;
   * El producto es ⋅ y se escribe con \ cdot (sin espacio entre ellos). &lt;br /&gt;
   * El neutro es 𝟭 y se escribe con \ y one (sin espacio entre ellos).&lt;br /&gt;
   * El inverso de x es x^ y se escribe pulsando 2 veces en ^. *)&lt;br /&gt;
&lt;br /&gt;
context grupo&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
  shows   &amp;quot;x ⋅ y = y ⋅ x&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;x ⋅ y = y ⋅ x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
      &lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 4. Se define la clausura reflexiva, simétrica y transitiva &lt;br /&gt;
  de una relación binaria r como sigue:&lt;br /&gt;
     inductive rst :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;  &lt;br /&gt;
      for r where&lt;br /&gt;
       refl1: &amp;quot;rst r x x&amp;quot;&lt;br /&gt;
     | trans1: &amp;quot;r x y ⟹ rst r y z ⟹ rst r x z&amp;quot;&lt;br /&gt;
     | trans2: &amp;quot;r y x ⟹ rst r y z ⟹ rst r x z&amp;quot; &lt;br /&gt;
                     &lt;br /&gt;
  Demostrar detalladamente que la relación (rst es r) simétrica. &lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
inductive rst :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;  &lt;br /&gt;
 for r where&lt;br /&gt;
  refl1: &amp;quot;rst r x x&amp;quot;&lt;br /&gt;
| trans1: &amp;quot;r x y ⟹ rst r y z ⟹ rst r x z&amp;quot;&lt;br /&gt;
| trans2: &amp;quot;r y x ⟹ rst r y z ⟹ rst r x z&amp;quot; &lt;br /&gt;
&lt;br /&gt;
lemma rst_es_simetrica : &amp;quot;rst r x y ⟹ rst r y x&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Examen_1C_sol&amp;diff=1274</id>
		<title>Examen 1C sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Examen_1C_sol&amp;diff=1274"/>
		<updated>2020-07-06T12:31:30Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Protegió «Examen 1C sol» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
theory examen_2_jul_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 1. Demostrar detalladamente con Isabelle, sin usar métodos&lt;br /&gt;
  automáticos (como simp, auto, ...) sino sólo las reglas básicas, &lt;br /&gt;
  que el siguiente argumento es correcto &lt;br /&gt;
     Si todas las medicinas están contaminadas, entonces todos los&lt;br /&gt;
     técnicos negligentes son unos bribones. Si hay medicinas&lt;br /&gt;
     contaminadas, entonces todas las medicinas están contaminadas y son&lt;br /&gt;
     peligrosas. Todos los germicidas son medicinas. Sólo los&lt;br /&gt;
     negligentes son distraídos. Por tanto, si cualquier técnico es&lt;br /&gt;
     distraído y si algunos germicidas están contaminados, los técnicos&lt;br /&gt;
     son bribones. &lt;br /&gt;
  Usar la siguiente simbología: &lt;br /&gt;
     M(x): x es medicina,  C(x): x está contaminada, &lt;br /&gt;
     T(x): x es técnico,   N(x): x es un negligente, &lt;br /&gt;
     B(x): x es un bribón, G(x): x es germicida, &lt;br /&gt;
     D(x): x es distraído, P(x): x es peligrosa.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Formalización y demostración›&lt;br /&gt;
&lt;br /&gt;
― ‹Formalización:›&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;(∀x. M(x) ⟶ C(x)) ⟶ (∀y. (T(y) ∧ N(y)) ⟶ B(y))&amp;quot;&lt;br /&gt;
          &amp;quot;(∃x. M(x) ∧ C(x)) ⟶ (∀x. M(x) ⟶ C(x) ∧ P(x))&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. G(x) ⟶ M(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀y. ¬N(y) ⟶ ¬D(y)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀y. T y ⟶ D y) ∧ (∃x. G x ∧ C x) ⟶ (∀z. T z ⟶ B z)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
― ‹Auxiliar›&lt;br /&gt;
lemma previo:&lt;br /&gt;
  assumes &amp;quot;∀x. M(x) ⟶ C(x) ∧ P(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. M(x) ⟶ C(x)&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
  fix a&lt;br /&gt;
  show &amp;quot;M(a) ⟶ C(a)&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;M(a)&amp;quot;&lt;br /&gt;
      have &amp;quot;M(a) ⟶ C(a) ∧ P(a)&amp;quot; using assms by (rule allE)&lt;br /&gt;
      then have &amp;quot;C(a) ∧ P(a)&amp;quot; using ‹M(a)› by (rule mp)&lt;br /&gt;
      then show &amp;quot;C(a)&amp;quot; by (rule conjunct1)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración declarativa detallada:›&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;(∀x. M(x) ⟶ C(x)) ⟶ (∀y. (T(y) ∧ N(y)) ⟶ B(y))&amp;quot;&lt;br /&gt;
          &amp;quot;(∃x. M(x) ∧ C(x)) ⟶ (∀x. M(x) ⟶ C(x) ∧ P(x))&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. G(x) ⟶ M(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀y. ¬N(y) ⟶ ¬D(y)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀y. T y ⟶ D y) ∧ (∃x. G x ∧ C x) ⟶ (∀z. T z ⟶ B z)&amp;quot; &lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;(∀y. T(y) ⟶ D(y)) ∧ (∃x. G(x) ∧ C(x))&amp;quot;&lt;br /&gt;
  show &amp;quot;∀z. T(z) ⟶ B(z)&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
    fix a&lt;br /&gt;
    show &amp;quot;T(a) ⟶ B(a)&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume &amp;quot;T(a)&amp;quot;&lt;br /&gt;
      show   &amp;quot;B(a)&amp;quot;&lt;br /&gt;
      proof -&lt;br /&gt;
        have &amp;quot;∀y. T(y) ⟶ D(y)&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
        then have &amp;quot;T(a) ⟶ D(a)&amp;quot; by (rule allE)&lt;br /&gt;
        then have &amp;quot;D(a)&amp;quot; using  `T(a)` by (rule mp)&lt;br /&gt;
        then have &amp;quot;¬¬D(a)&amp;quot; by (rule notnotI) &lt;br /&gt;
        have &amp;quot;¬N(a)⟶¬D(a)&amp;quot;  using assms(4) by (rule allE)&lt;br /&gt;
        then have &amp;quot;¬¬N(a)&amp;quot; using `¬¬D(a)` by (rule mt)&lt;br /&gt;
        then have &amp;quot;N(a)&amp;quot;  by (rule notnotD)&lt;br /&gt;
        have &amp;quot;∃x. G(x) ∧ C(x)&amp;quot;  using 1 by (rule conjunct2)&lt;br /&gt;
        then obtain b where &amp;quot;G(b) ∧ C(b)&amp;quot; by (rule exE)&lt;br /&gt;
        then have &amp;quot;G(b)&amp;quot; by (rule conjunct1)&lt;br /&gt;
        have &amp;quot;C(b)&amp;quot; using `G(b) ∧ C(b)` by (rule conjunct2)&lt;br /&gt;
        have &amp;quot;G(b) ⟶ M(b)&amp;quot; using assms(3) by (rule allE)&lt;br /&gt;
        then have &amp;quot;M(b)&amp;quot; using  `G(b)` by (rule mp)&lt;br /&gt;
        then have &amp;quot;M(b) ∧ C(b)&amp;quot; using `C(b)` by (rule conjI)&lt;br /&gt;
        then have &amp;quot;∃x. M(x) ∧ C(x)&amp;quot;  by (rule exI)&lt;br /&gt;
        with assms(2) have &amp;quot;∀x. M(x) ⟶ C(x) ∧ P(x)&amp;quot; by (rule mp)&lt;br /&gt;
        then have &amp;quot;∀x. M(x) ⟶ C(x)&amp;quot; by (rule previo)&lt;br /&gt;
        with assms(1) have &amp;quot;∀y. (T(y) ∧ N(y)) ⟶ B(y)&amp;quot; by (rule mp)&lt;br /&gt;
        then have &amp;quot;(T(a) ∧ N(a))⟶B(a)&amp;quot; by (rule allE)&lt;br /&gt;
        have &amp;quot;T(a) ∧ N(a)&amp;quot; using `T(a)` `N(a)` by (rule conjI)&lt;br /&gt;
        with `(T(a) ∧ N(a)) ⟶ B(a)` show &amp;quot;B(a)&amp;quot;  by (rule mp)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Se consideran las definiciones de las siguientes&lt;br /&gt;
  funciones (que se dan a continuación)&lt;br /&gt;
     estaEn   :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
     sublista :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
     elimina  :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tales que &lt;br /&gt;
  + (estaEn x xs) se verifica si el elemento x está en la lista xs. Por&lt;br /&gt;
    ejemplo,  &lt;br /&gt;
       estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
       estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  + (sublista xs ys) se verifica si todos los elementos de la lista xs&lt;br /&gt;
    están en la lista ys. Por ejemplo, &lt;br /&gt;
       sublista [(1::nat),2,3] [3,2,1,2] = True&lt;br /&gt;
       sublista [(1::nat),2,3] [2,1,2]   = False&lt;br /&gt;
  + (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
    elementos de xs. Por ejemplo, &lt;br /&gt;
       elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
&lt;br /&gt;
  Demostrar detalladamente que&lt;br /&gt;
     sublista (elimina n xs) xs&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x []     = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a#xs) = (a=x ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun sublista :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sublista [] ys     = True&amp;quot;&lt;br /&gt;
| &amp;quot;sublista (x#xs) ys = (estaEn x ys ∧ sublista xs ys )&amp;quot;&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;
― ‹Auxiliares:›&lt;br /&gt;
&lt;br /&gt;
lemma sublistaMono: &amp;quot;sublista xs ys ⟹ sublista xs (y#ys)&amp;quot;&lt;br /&gt;
  apply (induct xs)&lt;br /&gt;
   apply (simp only: sublista.simps(1))&lt;br /&gt;
  apply (simp only: sublista.simps(2))&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (erule conjE)&lt;br /&gt;
   apply (simp only: estaEn.simps(2))&lt;br /&gt;
   apply (rule disjI2)&lt;br /&gt;
   apply (simp only: implies_True_equals)+&lt;br /&gt;
  done&lt;br /&gt;
   &lt;br /&gt;
lemma estaEn1: &amp;quot;estaEn x (x#xs)&amp;quot;&lt;br /&gt;
  apply (simp only: estaEn.simps(2))&lt;br /&gt;
  apply (rule disjI1)&lt;br /&gt;
  apply (rule refl)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
lemma sublistaReflexiva: &amp;quot;sublista xs xs&amp;quot;&lt;br /&gt;
  apply (induct xs)&lt;br /&gt;
   apply (simp only: sublista.simps(1))&lt;br /&gt;
  apply (simp only: sublista.simps(2))&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (rule estaEn1)&lt;br /&gt;
  apply (rule sublistaMono, assumption)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración declarativa detallada:›  &lt;br /&gt;
lemma eliminaSublista_dec: &amp;quot;sublista (elimina n xs) xs&amp;quot;&lt;br /&gt;
proof (induct rule: elimina.induct)&lt;br /&gt;
  fix n&lt;br /&gt;
  show &amp;quot;sublista (elimina n []) []&amp;quot;&lt;br /&gt;
    by (simp only: elimina.simps(1) sublista.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix x :: &amp;quot;&amp;#039;a&amp;quot; and  xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  show &amp;quot;sublista (elimina 0 (x # xs)) (x # xs)&amp;quot;&lt;br /&gt;
  by (simp only: elimina.simps(2) sublistaReflexiva)&lt;br /&gt;
next&lt;br /&gt;
   fix n and x :: &amp;quot;&amp;#039;a&amp;quot; and xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
   show &amp;quot;sublista (elimina n xs) xs ⟹ &lt;br /&gt;
         sublista (elimina (Suc n) (x # xs)) (x # xs)&amp;quot;&lt;br /&gt;
   by  (simp only: elimina.simps(3) sublistaMono)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. Sea G un grupo. Demostrar que las siguientes condiciones&lt;br /&gt;
  son equivalentes:&lt;br /&gt;
    (+) G es commutativo, es decir, ∀x y. (x ⋅ y = y ⋅ x) &lt;br /&gt;
    (+) ∀x y. (((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭)&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: auto, blast, force,&lt;br /&gt;
  fast, arith o metis &lt;br /&gt;
  ------------------------------------------------------------------ ›&lt;br /&gt;
&lt;br /&gt;
locale grupo =&lt;br /&gt;
  fixes prod :: &amp;quot;[&amp;#039;a, &amp;#039;a] ⇒ &amp;#039;a&amp;quot; (infixl &amp;quot;⋅&amp;quot; 70)&lt;br /&gt;
    and neutro (&amp;quot;𝟭&amp;quot;) &lt;br /&gt;
    and inverso (&amp;quot;_^&amp;quot; [100] 100)&lt;br /&gt;
  assumes asociativa: &amp;quot;(x ⋅ y) ⋅ z = x ⋅ (y ⋅ z)&amp;quot;&lt;br /&gt;
      and neutro_i:   &amp;quot;𝟭 ⋅ x = x&amp;quot;&lt;br /&gt;
      and neutro_d:   &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
      and inverso_i:  &amp;quot;x^ ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Notas sobre notación:&lt;br /&gt;
   * El producto es ⋅ y se escribe con \ cdot (sin espacio entre ellos). &lt;br /&gt;
   * El neutro es 𝟭 y se escribe con \ y one (sin espacio entre ellos).&lt;br /&gt;
   * El inverso de x es x^ y se escribe pulsando 2 veces en ^. *)&lt;br /&gt;
&lt;br /&gt;
context grupo&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
― ‹Auxiliar para una implicación:›&lt;br /&gt;
&lt;br /&gt;
lemma inverso_d: &lt;br /&gt;
  &amp;quot;x ⋅ x^ = 𝟭&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;x ⋅ x^ = 𝟭 ⋅ (x ⋅ x^)&amp;quot; &lt;br /&gt;
    by (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;… = (𝟭 ⋅ x) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = (((x^)^ ⋅ x^) ⋅ x) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = ((x^)^ ⋅ (x^ ⋅ x)) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = ((x^)^ ⋅ 𝟭) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = (x^)^ ⋅ (𝟭 ⋅ x^)&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = (x^)^ ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;… = 𝟭&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  finally show ?thesis &lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
  shows   &amp;quot;x ⋅ y = y ⋅ x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;x ⋅ y = (x ⋅ y) ⋅ 𝟭&amp;quot; &lt;br /&gt;
    by (rule neutro_d [THEN sym])&lt;br /&gt;
  also have &amp;quot;… =  (x ⋅ y) ⋅ (((y^ ⋅ x^) ⋅ y) ⋅ x)&amp;quot; &lt;br /&gt;
    using assms by (rule arg_cong [THEN sym])&lt;br /&gt;
  also have &amp;quot;… =  (x ⋅ ((y ⋅ y^) ⋅ x^) ⋅ y) ⋅ x&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… =  ((x ⋅ (𝟭 ⋅ x^)) ⋅ y) ⋅ x&amp;quot; &lt;br /&gt;
    by (simp only: inverso_d)&lt;br /&gt;
  also have &amp;quot;… =  (x ⋅ ((𝟭 ⋅ x^) ⋅ y)) ⋅ x &amp;quot; &lt;br /&gt;
    by  (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… =  (x ⋅ (x^ ⋅ y)) ⋅ x&amp;quot; &lt;br /&gt;
    by  (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;… =  ((x ⋅ x^) ⋅ y) ⋅ x&amp;quot; &lt;br /&gt;
    by  (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = (𝟭 ⋅ y) ⋅ x&amp;quot; &lt;br /&gt;
    by  (simp only: inverso_d)&lt;br /&gt;
  also have &amp;quot;… = 𝟭 ⋅ (y ⋅ x)&amp;quot; &lt;br /&gt;
    by  (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = y ⋅ x&amp;quot; &lt;br /&gt;
    by (simp only: neutro_i)&lt;br /&gt;
  finally show  &amp;quot;x ⋅ y = y ⋅ x&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Recíproco:›&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;x ⋅ y = y ⋅ x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;y ⋅ x = x ⋅ y&amp;quot; using assms by (rule sym)&lt;br /&gt;
  then have &amp;quot;x^ ⋅ (y ⋅ x) = x^ ⋅ (x ⋅ y)&amp;quot; by (rule arg_cong)&lt;br /&gt;
  then have &amp;quot;y^ ⋅ (x^ ⋅ (y ⋅ x)) =y^ ⋅ (x^ ⋅ (x ⋅ y))&amp;quot; by (rule arg_cong)&lt;br /&gt;
  then have &amp;quot;((y^ ⋅ x^) ⋅ y) ⋅ x =y^ ⋅ ((x^ ⋅ x) ⋅ y)&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;... = y^ ⋅ (𝟭 ⋅ y)&amp;quot; by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;... = y^ ⋅ y &amp;quot; by (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;... = 𝟭&amp;quot; by (simp only: inverso_i)&lt;br /&gt;
  finally show &amp;quot;((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭&amp;quot; by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 4. Se define la clausura reflexiva, simétrica y transitiva &lt;br /&gt;
  de una relación binaria r como sigue:&lt;br /&gt;
     inductive rst :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;  &lt;br /&gt;
      for r where&lt;br /&gt;
       refl1: &amp;quot;rst r x x&amp;quot;&lt;br /&gt;
     | trans1: &amp;quot;r x y ⟹ rst r y z ⟹ rst r x z&amp;quot;&lt;br /&gt;
     | trans2: &amp;quot;r y x ⟹ rst r y z ⟹ rst r x z&amp;quot; &lt;br /&gt;
                     &lt;br /&gt;
  Demostrar detalladamente que la relación (rst es r) simétrica. &lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
inductive rst :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;  &lt;br /&gt;
 for r where&lt;br /&gt;
  refl1: &amp;quot;rst r x x&amp;quot;&lt;br /&gt;
| trans1: &amp;quot;r x y ⟹ rst r y z ⟹ rst r x z&amp;quot;&lt;br /&gt;
| trans2: &amp;quot;r y x ⟹ rst r y z ⟹ rst r x z&amp;quot; &lt;br /&gt;
&lt;br /&gt;
― ‹Lemas auxiliares:›&lt;br /&gt;
&lt;br /&gt;
lemma r_subset_rst: &amp;quot;r x y ⟹ rst r x y&amp;quot;&lt;br /&gt;
  by (simp only: refl1 trans1)&lt;br /&gt;
&lt;br /&gt;
lemma r_subset_rst_b: &amp;quot;r x y ⟹ rst r y x&amp;quot;&lt;br /&gt;
  by (simp only: refl1 trans2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma rst_sc1_declarativo: &amp;quot;rst r x y  ⟹ r y z ⟹ rst r x z&amp;quot;&lt;br /&gt;
proof  (induct rule:rst.induct)&lt;br /&gt;
  case (refl1 x)&lt;br /&gt;
  then show ?case by (rule r_subset_rst) &lt;br /&gt;
next&lt;br /&gt;
  case (trans1 x y z)&lt;br /&gt;
  then show ?case by (simp only: rst.trans1)&lt;br /&gt;
next&lt;br /&gt;
  case (trans2 y x z)&lt;br /&gt;
  then show ?case  by (simp only: rst.trans2)&lt;br /&gt;
qed&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
lemma rst_sc2_declarativo: &amp;quot;rst r z y ⟹ r x y ⟹ rst r z x&amp;quot;&lt;br /&gt;
proof  (induct rule:rst.induct)&lt;br /&gt;
  case (refl1 x)&lt;br /&gt;
  then show ?case by (rule r_subset_rst_b) &lt;br /&gt;
next&lt;br /&gt;
  case (trans1 x y z)&lt;br /&gt;
  then show ?case by (simp only: rst.trans1)&lt;br /&gt;
next&lt;br /&gt;
  case (trans2 y x z)&lt;br /&gt;
  then show ?case by (simp only: rst.trans2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración declarativa detallada:›&lt;br /&gt;
lemma rstSimetrica_declarativa: &amp;quot;rst r x y ⟹ rst r y x&amp;quot;&lt;br /&gt;
proof (induct rule: rst.induct)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;rst r x x&amp;quot; by (rule refl1)&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume &amp;quot;r x y&amp;quot; and &amp;quot;rst r y z&amp;quot; and &amp;quot;rst r z y&amp;quot;&lt;br /&gt;
  then show &amp;quot;rst r z x&amp;quot; by (simp only: rst_sc2_declarativo)&lt;br /&gt;
next &lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume &amp;quot;r y x&amp;quot; and &amp;quot;rst r y z&amp;quot; and &amp;quot;rst r z y&amp;quot;&lt;br /&gt;
  then show &amp;quot;rst r z x&amp;quot; by (simp only: rst_sc1_declarativo)        &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>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Examen_1C_sol&amp;diff=1273</id>
		<title>Examen 1C sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Examen_1C_sol&amp;diff=1273"/>
		<updated>2020-07-06T12:31:10Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con «&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt; theory examen_2_jul_sol imports Main  begin  lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;   by auto  lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot; by auto  text ‹---…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
theory examen_2_jul_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 1. Demostrar detalladamente con Isabelle, sin usar métodos&lt;br /&gt;
  automáticos (como simp, auto, ...) sino sólo las reglas básicas, &lt;br /&gt;
  que el siguiente argumento es correcto &lt;br /&gt;
     Si todas las medicinas están contaminadas, entonces todos los&lt;br /&gt;
     técnicos negligentes son unos bribones. Si hay medicinas&lt;br /&gt;
     contaminadas, entonces todas las medicinas están contaminadas y son&lt;br /&gt;
     peligrosas. Todos los germicidas son medicinas. Sólo los&lt;br /&gt;
     negligentes son distraídos. Por tanto, si cualquier técnico es&lt;br /&gt;
     distraído y si algunos germicidas están contaminados, los técnicos&lt;br /&gt;
     son bribones. &lt;br /&gt;
  Usar la siguiente simbología: &lt;br /&gt;
     M(x): x es medicina,  C(x): x está contaminada, &lt;br /&gt;
     T(x): x es técnico,   N(x): x es un negligente, &lt;br /&gt;
     B(x): x es un bribón, G(x): x es germicida, &lt;br /&gt;
     D(x): x es distraído, P(x): x es peligrosa.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Formalización y demostración›&lt;br /&gt;
&lt;br /&gt;
― ‹Formalización:›&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;(∀x. M(x) ⟶ C(x)) ⟶ (∀y. (T(y) ∧ N(y)) ⟶ B(y))&amp;quot;&lt;br /&gt;
          &amp;quot;(∃x. M(x) ∧ C(x)) ⟶ (∀x. M(x) ⟶ C(x) ∧ P(x))&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. G(x) ⟶ M(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀y. ¬N(y) ⟶ ¬D(y)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀y. T y ⟶ D y) ∧ (∃x. G x ∧ C x) ⟶ (∀z. T z ⟶ B z)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
― ‹Auxiliar›&lt;br /&gt;
lemma previo:&lt;br /&gt;
  assumes &amp;quot;∀x. M(x) ⟶ C(x) ∧ P(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. M(x) ⟶ C(x)&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
  fix a&lt;br /&gt;
  show &amp;quot;M(a) ⟶ C(a)&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;M(a)&amp;quot;&lt;br /&gt;
      have &amp;quot;M(a) ⟶ C(a) ∧ P(a)&amp;quot; using assms by (rule allE)&lt;br /&gt;
      then have &amp;quot;C(a) ∧ P(a)&amp;quot; using ‹M(a)› by (rule mp)&lt;br /&gt;
      then show &amp;quot;C(a)&amp;quot; by (rule conjunct1)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración declarativa detallada:›&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;(∀x. M(x) ⟶ C(x)) ⟶ (∀y. (T(y) ∧ N(y)) ⟶ B(y))&amp;quot;&lt;br /&gt;
          &amp;quot;(∃x. M(x) ∧ C(x)) ⟶ (∀x. M(x) ⟶ C(x) ∧ P(x))&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. G(x) ⟶ M(x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀y. ¬N(y) ⟶ ¬D(y)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀y. T y ⟶ D y) ∧ (∃x. G x ∧ C x) ⟶ (∀z. T z ⟶ B z)&amp;quot; &lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;(∀y. T(y) ⟶ D(y)) ∧ (∃x. G(x) ∧ C(x))&amp;quot;&lt;br /&gt;
  show &amp;quot;∀z. T(z) ⟶ B(z)&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
    fix a&lt;br /&gt;
    show &amp;quot;T(a) ⟶ B(a)&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume &amp;quot;T(a)&amp;quot;&lt;br /&gt;
      show   &amp;quot;B(a)&amp;quot;&lt;br /&gt;
      proof -&lt;br /&gt;
        have &amp;quot;∀y. T(y) ⟶ D(y)&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
        then have &amp;quot;T(a) ⟶ D(a)&amp;quot; by (rule allE)&lt;br /&gt;
        then have &amp;quot;D(a)&amp;quot; using  `T(a)` by (rule mp)&lt;br /&gt;
        then have &amp;quot;¬¬D(a)&amp;quot; by (rule notnotI) &lt;br /&gt;
        have &amp;quot;¬N(a)⟶¬D(a)&amp;quot;  using assms(4) by (rule allE)&lt;br /&gt;
        then have &amp;quot;¬¬N(a)&amp;quot; using `¬¬D(a)` by (rule mt)&lt;br /&gt;
        then have &amp;quot;N(a)&amp;quot;  by (rule notnotD)&lt;br /&gt;
        have &amp;quot;∃x. G(x) ∧ C(x)&amp;quot;  using 1 by (rule conjunct2)&lt;br /&gt;
        then obtain b where &amp;quot;G(b) ∧ C(b)&amp;quot; by (rule exE)&lt;br /&gt;
        then have &amp;quot;G(b)&amp;quot; by (rule conjunct1)&lt;br /&gt;
        have &amp;quot;C(b)&amp;quot; using `G(b) ∧ C(b)` by (rule conjunct2)&lt;br /&gt;
        have &amp;quot;G(b) ⟶ M(b)&amp;quot; using assms(3) by (rule allE)&lt;br /&gt;
        then have &amp;quot;M(b)&amp;quot; using  `G(b)` by (rule mp)&lt;br /&gt;
        then have &amp;quot;M(b) ∧ C(b)&amp;quot; using `C(b)` by (rule conjI)&lt;br /&gt;
        then have &amp;quot;∃x. M(x) ∧ C(x)&amp;quot;  by (rule exI)&lt;br /&gt;
        with assms(2) have &amp;quot;∀x. M(x) ⟶ C(x) ∧ P(x)&amp;quot; by (rule mp)&lt;br /&gt;
        then have &amp;quot;∀x. M(x) ⟶ C(x)&amp;quot; by (rule previo)&lt;br /&gt;
        with assms(1) have &amp;quot;∀y. (T(y) ∧ N(y)) ⟶ B(y)&amp;quot; by (rule mp)&lt;br /&gt;
        then have &amp;quot;(T(a) ∧ N(a))⟶B(a)&amp;quot; by (rule allE)&lt;br /&gt;
        have &amp;quot;T(a) ∧ N(a)&amp;quot; using `T(a)` `N(a)` by (rule conjI)&lt;br /&gt;
        with `(T(a) ∧ N(a)) ⟶ B(a)` show &amp;quot;B(a)&amp;quot;  by (rule mp)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Se consideran las definiciones de las siguientes&lt;br /&gt;
  funciones (que se dan a continuación)&lt;br /&gt;
     estaEn   :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
     sublista :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
     elimina  :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tales que &lt;br /&gt;
  + (estaEn x xs) se verifica si el elemento x está en la lista xs. Por&lt;br /&gt;
    ejemplo,  &lt;br /&gt;
       estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
       estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  + (sublista xs ys) se verifica si todos los elementos de la lista xs&lt;br /&gt;
    están en la lista ys. Por ejemplo, &lt;br /&gt;
       sublista [(1::nat),2,3] [3,2,1,2] = True&lt;br /&gt;
       sublista [(1::nat),2,3] [2,1,2]   = False&lt;br /&gt;
  + (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
    elementos de xs. Por ejemplo, &lt;br /&gt;
       elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
&lt;br /&gt;
  Demostrar detalladamente que&lt;br /&gt;
     sublista (elimina n xs) xs&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x []     = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a#xs) = (a=x ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun sublista :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;sublista [] ys     = True&amp;quot;&lt;br /&gt;
| &amp;quot;sublista (x#xs) ys = (estaEn x ys ∧ sublista xs ys )&amp;quot;&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;
― ‹Auxiliares:›&lt;br /&gt;
&lt;br /&gt;
lemma sublistaMono: &amp;quot;sublista xs ys ⟹ sublista xs (y#ys)&amp;quot;&lt;br /&gt;
  apply (induct xs)&lt;br /&gt;
   apply (simp only: sublista.simps(1))&lt;br /&gt;
  apply (simp only: sublista.simps(2))&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (erule conjE)&lt;br /&gt;
   apply (simp only: estaEn.simps(2))&lt;br /&gt;
   apply (rule disjI2)&lt;br /&gt;
   apply (simp only: implies_True_equals)+&lt;br /&gt;
  done&lt;br /&gt;
   &lt;br /&gt;
lemma estaEn1: &amp;quot;estaEn x (x#xs)&amp;quot;&lt;br /&gt;
  apply (simp only: estaEn.simps(2))&lt;br /&gt;
  apply (rule disjI1)&lt;br /&gt;
  apply (rule refl)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
lemma sublistaReflexiva: &amp;quot;sublista xs xs&amp;quot;&lt;br /&gt;
  apply (induct xs)&lt;br /&gt;
   apply (simp only: sublista.simps(1))&lt;br /&gt;
  apply (simp only: sublista.simps(2))&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (rule estaEn1)&lt;br /&gt;
  apply (rule sublistaMono, assumption)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración declarativa detallada:›  &lt;br /&gt;
lemma eliminaSublista_dec: &amp;quot;sublista (elimina n xs) xs&amp;quot;&lt;br /&gt;
proof (induct rule: elimina.induct)&lt;br /&gt;
  fix n&lt;br /&gt;
  show &amp;quot;sublista (elimina n []) []&amp;quot;&lt;br /&gt;
    by (simp only: elimina.simps(1) sublista.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix x :: &amp;quot;&amp;#039;a&amp;quot; and  xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  show &amp;quot;sublista (elimina 0 (x # xs)) (x # xs)&amp;quot;&lt;br /&gt;
  by (simp only: elimina.simps(2) sublistaReflexiva)&lt;br /&gt;
next&lt;br /&gt;
   fix n and x :: &amp;quot;&amp;#039;a&amp;quot; and xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
   show &amp;quot;sublista (elimina n xs) xs ⟹ &lt;br /&gt;
         sublista (elimina (Suc n) (x # xs)) (x # xs)&amp;quot;&lt;br /&gt;
   by  (simp only: elimina.simps(3) sublistaMono)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. Sea G un grupo. Demostrar que las siguientes condiciones&lt;br /&gt;
  son equivalentes:&lt;br /&gt;
    (+) G es commutativo, es decir, ∀x y. (x ⋅ y = y ⋅ x) &lt;br /&gt;
    (+) ∀x y. (((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭)&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: auto, blast, force,&lt;br /&gt;
  fast, arith o metis &lt;br /&gt;
  ------------------------------------------------------------------ ›&lt;br /&gt;
&lt;br /&gt;
locale grupo =&lt;br /&gt;
  fixes prod :: &amp;quot;[&amp;#039;a, &amp;#039;a] ⇒ &amp;#039;a&amp;quot; (infixl &amp;quot;⋅&amp;quot; 70)&lt;br /&gt;
    and neutro (&amp;quot;𝟭&amp;quot;) &lt;br /&gt;
    and inverso (&amp;quot;_^&amp;quot; [100] 100)&lt;br /&gt;
  assumes asociativa: &amp;quot;(x ⋅ y) ⋅ z = x ⋅ (y ⋅ z)&amp;quot;&lt;br /&gt;
      and neutro_i:   &amp;quot;𝟭 ⋅ x = x&amp;quot;&lt;br /&gt;
      and neutro_d:   &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
      and inverso_i:  &amp;quot;x^ ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Notas sobre notación:&lt;br /&gt;
   * El producto es ⋅ y se escribe con \ cdot (sin espacio entre ellos). &lt;br /&gt;
   * El neutro es 𝟭 y se escribe con \ y one (sin espacio entre ellos).&lt;br /&gt;
   * El inverso de x es x^ y se escribe pulsando 2 veces en ^. *)&lt;br /&gt;
&lt;br /&gt;
context grupo&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
― ‹Auxiliar para una implicación:›&lt;br /&gt;
&lt;br /&gt;
lemma inverso_d: &lt;br /&gt;
  &amp;quot;x ⋅ x^ = 𝟭&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;x ⋅ x^ = 𝟭 ⋅ (x ⋅ x^)&amp;quot; &lt;br /&gt;
    by (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;… = (𝟭 ⋅ x) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = (((x^)^ ⋅ x^) ⋅ x) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = ((x^)^ ⋅ (x^ ⋅ x)) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = ((x^)^ ⋅ 𝟭) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = (x^)^ ⋅ (𝟭 ⋅ x^)&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = (x^)^ ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;… = 𝟭&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  finally show ?thesis &lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
  shows   &amp;quot;x ⋅ y = y ⋅ x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;x ⋅ y = (x ⋅ y) ⋅ 𝟭&amp;quot; &lt;br /&gt;
    by (rule neutro_d [THEN sym])&lt;br /&gt;
  also have &amp;quot;… =  (x ⋅ y) ⋅ (((y^ ⋅ x^) ⋅ y) ⋅ x)&amp;quot; &lt;br /&gt;
    using assms by (rule arg_cong [THEN sym])&lt;br /&gt;
  also have &amp;quot;… =  (x ⋅ ((y ⋅ y^) ⋅ x^) ⋅ y) ⋅ x&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… =  ((x ⋅ (𝟭 ⋅ x^)) ⋅ y) ⋅ x&amp;quot; &lt;br /&gt;
    by (simp only: inverso_d)&lt;br /&gt;
  also have &amp;quot;… =  (x ⋅ ((𝟭 ⋅ x^) ⋅ y)) ⋅ x &amp;quot; &lt;br /&gt;
    by  (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… =  (x ⋅ (x^ ⋅ y)) ⋅ x&amp;quot; &lt;br /&gt;
    by  (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;… =  ((x ⋅ x^) ⋅ y) ⋅ x&amp;quot; &lt;br /&gt;
    by  (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = (𝟭 ⋅ y) ⋅ x&amp;quot; &lt;br /&gt;
    by  (simp only: inverso_d)&lt;br /&gt;
  also have &amp;quot;… = 𝟭 ⋅ (y ⋅ x)&amp;quot; &lt;br /&gt;
    by  (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = y ⋅ x&amp;quot; &lt;br /&gt;
    by (simp only: neutro_i)&lt;br /&gt;
  finally show  &amp;quot;x ⋅ y = y ⋅ x&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Recíproco:›&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;x ⋅ y = y ⋅ x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;y ⋅ x = x ⋅ y&amp;quot; using assms by (rule sym)&lt;br /&gt;
  then have &amp;quot;x^ ⋅ (y ⋅ x) = x^ ⋅ (x ⋅ y)&amp;quot; by (rule arg_cong)&lt;br /&gt;
  then have &amp;quot;y^ ⋅ (x^ ⋅ (y ⋅ x)) =y^ ⋅ (x^ ⋅ (x ⋅ y))&amp;quot; by (rule arg_cong)&lt;br /&gt;
  then have &amp;quot;((y^ ⋅ x^) ⋅ y) ⋅ x =y^ ⋅ ((x^ ⋅ x) ⋅ y)&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;... = y^ ⋅ (𝟭 ⋅ y)&amp;quot; by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;... = y^ ⋅ y &amp;quot; by (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;... = 𝟭&amp;quot; by (simp only: inverso_i)&lt;br /&gt;
  finally show &amp;quot;((y^ ⋅ x^) ⋅ y) ⋅ x = 𝟭&amp;quot; by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 4. Se define la clausura reflexiva, simétrica y transitiva &lt;br /&gt;
  de una relación binaria r como sigue:&lt;br /&gt;
     inductive rst :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;  &lt;br /&gt;
      for r where&lt;br /&gt;
       refl1: &amp;quot;rst r x x&amp;quot;&lt;br /&gt;
     | trans1: &amp;quot;r x y ⟹ rst r y z ⟹ rst r x z&amp;quot;&lt;br /&gt;
     | trans2: &amp;quot;r y x ⟹ rst r y z ⟹ rst r x z&amp;quot; &lt;br /&gt;
                     &lt;br /&gt;
  Demostrar detalladamente que la relación (rst es r) simétrica. &lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
inductive rst :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;  &lt;br /&gt;
 for r where&lt;br /&gt;
  refl1: &amp;quot;rst r x x&amp;quot;&lt;br /&gt;
| trans1: &amp;quot;r x y ⟹ rst r y z ⟹ rst r x z&amp;quot;&lt;br /&gt;
| trans2: &amp;quot;r y x ⟹ rst r y z ⟹ rst r x z&amp;quot; &lt;br /&gt;
&lt;br /&gt;
― ‹Lemas auxiliares:›&lt;br /&gt;
&lt;br /&gt;
lemma r_subset_rst: &amp;quot;r x y ⟹ rst r x y&amp;quot;&lt;br /&gt;
  by (simp only: refl1 trans1)&lt;br /&gt;
&lt;br /&gt;
lemma r_subset_rst_b: &amp;quot;r x y ⟹ rst r y x&amp;quot;&lt;br /&gt;
  by (simp only: refl1 trans2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma rst_sc1_declarativo: &amp;quot;rst r x y  ⟹ r y z ⟹ rst r x z&amp;quot;&lt;br /&gt;
proof  (induct rule:rst.induct)&lt;br /&gt;
  case (refl1 x)&lt;br /&gt;
  then show ?case by (rule r_subset_rst) &lt;br /&gt;
next&lt;br /&gt;
  case (trans1 x y z)&lt;br /&gt;
  then show ?case by (simp only: rst.trans1)&lt;br /&gt;
next&lt;br /&gt;
  case (trans2 y x z)&lt;br /&gt;
  then show ?case  by (simp only: rst.trans2)&lt;br /&gt;
qed&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
lemma rst_sc2_declarativo: &amp;quot;rst r z y ⟹ r x y ⟹ rst r z x&amp;quot;&lt;br /&gt;
proof  (induct rule:rst.induct)&lt;br /&gt;
  case (refl1 x)&lt;br /&gt;
  then show ?case by (rule r_subset_rst_b) &lt;br /&gt;
next&lt;br /&gt;
  case (trans1 x y z)&lt;br /&gt;
  then show ?case by (simp only: rst.trans1)&lt;br /&gt;
next&lt;br /&gt;
  case (trans2 y x z)&lt;br /&gt;
  then show ?case by (simp only: rst.trans2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración declarativa detallada:›&lt;br /&gt;
lemma rstSimetrica_declarativa: &amp;quot;rst r x y ⟹ rst r y x&amp;quot;&lt;br /&gt;
proof (induct rule: rst.induct)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;rst r x x&amp;quot; by (rule refl1)&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume &amp;quot;r x y&amp;quot; and &amp;quot;rst r y z&amp;quot; and &amp;quot;rst r z y&amp;quot;&lt;br /&gt;
  then show &amp;quot;rst r z x&amp;quot; by (simp only: rst_sc2_declarativo)&lt;br /&gt;
next &lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume &amp;quot;r y x&amp;quot; and &amp;quot;rst r y z&amp;quot; and &amp;quot;rst r z y&amp;quot;&lt;br /&gt;
  then show &amp;quot;rst r z x&amp;quot; by (simp only: rst_sc1_declarativo)        &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>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Ejercicios&amp;diff=1272</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Ejercicios&amp;diff=1272"/>
		<updated>2020-07-06T12:28:46Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-19/ejercicios/ejercicios-LMF-2019-20.pdf libro de ejercicios].&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]], [[Relación 1 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R1_sol.pdf Una solución]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R2.thy Deducción natural proposicional con Isabelle] ([[R2 |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Rel 2 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R3.thy Deducción natural proposicional con Isabelle (II)] ([[R3 |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Rel 3 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4.thy Sintaxis y semántica de la lógica de primer orden.] ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4_sol.pdf Una solución]).).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R5.thy Deducción natural en lógica de primer orden.] ([[R5 |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Rel 5 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R6.thy Formalización y argumentación con Isabelle/HOL.] ([[R6 |Enunciado]], [[Relación 6 |Solución colaborativa]] , [[Rel 6 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R7.thy Deducción natural,formalización y argumentación en LPO con Isabelle/HOL.] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R8.thy Programación funcional en  Isabelle/HOL.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 8 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 8 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R9.thy Programación funcional en  Isabelle/HOL (II).] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 9 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 9 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1 (24-04-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T1 |Enunciado]], [[T1 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R10.thy Razonamiento sobre programas en Isabelle/HOL.] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 10 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL(II).] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 11 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R12.thy Razonamiento sobre programas en Isabelle/HOL(III).] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 12 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2 (12-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T2 |Enunciado]], [[T2 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R13.thy Recorridos de árboles.] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 13 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R14.thy Una axiomátización de la Geometría.] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 14 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3 (19-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T3 |Enunciado]], [[T3 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R15.thy Definiciones inductivas: clausuras.] ([[R15 |Enunciado]], [[Relación 15 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 15 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4 (26-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T4 |Enunciado]], [[T4 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 5 (02-06-2020)&amp;#039;&amp;#039;&amp;#039;: &lt;br /&gt;
** ([[T5-1 |Enunciado (1)]], [[T5-1 sol |Una solución]]).&lt;br /&gt;
** ([[T5-2 |Enunciado (2)]], [[T5-2 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Trabajo final&amp;#039;&amp;#039;&amp;#039;: ([[TF |Enunciado]], [[TF sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen (2-07-2020)&amp;#039;&amp;#039;&amp;#039;: ([[Examen 1C |Enunciado]], [[Examen 1C sol |Una solución]]).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Nota&amp;#039;&amp;#039;&amp;#039; Se pueden publicar las soluciones hasta el martes 31 de marzo.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]] y [[Sol 9 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R10.thy Programación funcional en Isabelle (2)] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]  y [[Sol 10 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]  y [[Sol 11 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R12.thy Recorridos de árboles en Isabelle/HOL] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]  y [[Sol 12 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R13.thy Definiciones inductivas: clausuras] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]  y [[Sol 13 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R14.thy Desarrollo de teorías axiomáticas] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]  y [[Sol 14 | una solución]]).&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Rel_15_(sol)&amp;diff=1271</id>
		<title>Rel 15 (sol)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Rel_15_(sol)&amp;diff=1271"/>
		<updated>2020-06-29T15:38:38Z</updated>

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

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

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-19/ejercicios/ejercicios-LMF-2019-20.pdf libro de ejercicios].&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]], [[Relación 1 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R1_sol.pdf Una solución]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R2.thy Deducción natural proposicional con Isabelle] ([[R2 |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Rel 2 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R3.thy Deducción natural proposicional con Isabelle (II)] ([[R3 |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Rel 3 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4.thy Sintaxis y semántica de la lógica de primer orden.] ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4_sol.pdf Una solución]).).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R5.thy Deducción natural en lógica de primer orden.] ([[R5 |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Rel 5 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R6.thy Formalización y argumentación con Isabelle/HOL.] ([[R6 |Enunciado]], [[Relación 6 |Solución colaborativa]] , [[Rel 6 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R7.thy Deducción natural,formalización y argumentación en LPO con Isabelle/HOL.] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R8.thy Programación funcional en  Isabelle/HOL.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 8 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 8 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R9.thy Programación funcional en  Isabelle/HOL (II).] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 9 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 9 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1 (24-04-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T1 |Enunciado]], [[T1 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R10.thy Razonamiento sobre programas en Isabelle/HOL.] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 10 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL(II).] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 11 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R12.thy Razonamiento sobre programas en Isabelle/HOL(III).] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 12 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2 (12-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T2 |Enunciado]], [[T2 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R13.thy Recorridos de árboles.] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 13 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R14.thy Una axiomátización de la Geometría.] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 14 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3 (19-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T3 |Enunciado]], [[T3 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R15.thy Definiciones inductivas: clausuras.] ([[R15 |Enunciado]], [[Relación 15 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 15 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4 (26-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T4 |Enunciado]], [[T4 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 5 (02-06-2020)&amp;#039;&amp;#039;&amp;#039;: &lt;br /&gt;
** ([[T5-1 |Enunciado (1)]], [[T5-1 sol |Una solución]]).&lt;br /&gt;
** ([[T5-2 |Enunciado (2)]], [[T5-2 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Trabajo final&amp;#039;&amp;#039;&amp;#039;: ([[TF |Enunciado]], [[TF sol |Una solución]]).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Nota&amp;#039;&amp;#039;&amp;#039; Se pueden publicar las soluciones hasta el martes 31 de marzo.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]] y [[Sol 9 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R10.thy Programación funcional en Isabelle (2)] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]  y [[Sol 10 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]  y [[Sol 11 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R12.thy Recorridos de árboles en Isabelle/HOL] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]  y [[Sol 12 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R13.thy Definiciones inductivas: clausuras] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]  y [[Sol 13 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R14.thy Desarrollo de teorías axiomáticas] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]  y [[Sol 14 | una solución]]).&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=TF_sol&amp;diff=1268</id>
		<title>TF sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=TF_sol&amp;diff=1268"/>
		<updated>2020-06-18T07:13:48Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
chapter ‹Expresiones booleanas y expresiones condicionales›&lt;br /&gt;
&lt;br /&gt;
theory Trabajo_final_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section ‹Expresiones booleanas›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 1. La expresiones booleanas se definen por&lt;br /&gt;
  * las constantes booleanas son expresiones,&lt;br /&gt;
  * las variables son expresiones,&lt;br /&gt;
  * Si e es una expresión, entonces ¬e también lo es.&lt;br /&gt;
  * Si e1 y e2 son expresiones, entonces e1 ∧ e2 también lo es.&lt;br /&gt;
&lt;br /&gt;
  Definir exp_booleana como el tipo de las expresiones booleanas.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
datatype exp_booleana = Const bool &lt;br /&gt;
                      | Var nat &lt;br /&gt;
                      | Neg exp_booleana&lt;br /&gt;
                      | And exp_booleana exp_booleana&lt;br /&gt;
&lt;br /&gt;
section ‹El valor de las expresiones boolenas›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 2. Una interpretación es una función i que asigna a cada&lt;br /&gt;
  número natural un booleano de forma que el valor de la variable&lt;br /&gt;
  &amp;#039;Var n&amp;#039; en la interpretación &amp;#039;i&amp;#039; es &amp;#039;i(n)&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     valor :: exp_booleana ⇒ (nat ⇒ bool) ⇒ bool&lt;br /&gt;
  tal que (valor e i) es el valor de la expresión booleana e en la&lt;br /&gt;
  interpretación i. Por ejemplo,&lt;br /&gt;
     value &amp;quot;(valor (Var 3) (λx. False)) &lt;br /&gt;
  es False&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun valor :: &amp;quot;exp_booleana ⇒ (nat ⇒ bool) ⇒ bool&amp;quot; where&lt;br /&gt;
   &amp;quot;valor (Const b) _   = b&amp;quot;&lt;br /&gt;
 | &amp;quot;valor (Var n) i     = i n &amp;quot;&lt;br /&gt;
 | &amp;quot;valor (Neg e) i     = (¬ (valor e i))&amp;quot;&lt;br /&gt;
 | &amp;quot;valor (And e1 e2) i = (valor e1 i ∧ valor e2 i)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
section ‹Expresiones If›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 3. La expresiones if se definen por&lt;br /&gt;
  * las constantes booleanas son expresiones,&lt;br /&gt;
  * las variables son expresiones,&lt;br /&gt;
  * Si e, e1 y e2 son expresiones, entonces (if e e1 e2) también lo es.&lt;br /&gt;
&lt;br /&gt;
  Definir exp_if como el tipo de las expresiones if.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
datatype exp_if = CIF bool &lt;br /&gt;
                | VIF nat &lt;br /&gt;
                | IF exp_if exp_if exp_if&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     valor_if :: exp_if ⇒ (nat ⇒ bool) ⇒ bool&lt;br /&gt;
  tal que (valor_if e i) es el valor de la expresión if e en la&lt;br /&gt;
  interpretación i.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun valor_if :: &amp;quot;exp_if ⇒ (nat ⇒ bool) ⇒ bool&amp;quot; where&lt;br /&gt;
   &amp;quot;valor_if (CIF b) _      = b&amp;quot;&lt;br /&gt;
 | &amp;quot;valor_if (VIF n) i      = i n&amp;quot;&lt;br /&gt;
 | &amp;quot;valor_if (IF e e1 e2) i = (if (valor_if e i) &lt;br /&gt;
                               then (valor_if e1 i) &lt;br /&gt;
                               else (valor_if e2 i))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
section ‹Transformación de expresiones booleanas en expresiones if›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Definición de bool2if›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     bool2if :: exp_booleana ⇒ exp_if&lt;br /&gt;
  tal que (bool2if e) es una expresión if equivalente a la expresión&lt;br /&gt;
  booleana e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun bool2if :: &amp;quot;exp_booleana ⇒ exp_if&amp;quot; where&lt;br /&gt;
   &amp;quot;bool2if (Const b)   = CIF b&amp;quot;&lt;br /&gt;
 | &amp;quot;bool2if (Var n)     = VIF n&amp;quot;&lt;br /&gt;
 | &amp;quot;bool2if (Neg e)     = IF (bool2if e) (CIF False) (CIF True)&amp;quot;&lt;br /&gt;
 | &amp;quot;bool2if (And e1 e2) = IF (bool2if e1) (bool2if e2) (CIF False)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 6. Demostrar que para cualquier expresión boolena e, son&lt;br /&gt;
  equivalentes (bool2if e) y e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostraciones de valor_if_bool2if›&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración estructurada de valor_if_bool2if›&lt;br /&gt;
lemma valor_if_bool2if_E:&lt;br /&gt;
  &amp;quot;valor_if (bool2if e) ent = valor e ent&amp;quot;&lt;br /&gt;
proof (induct e)&lt;br /&gt;
  case (Const x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (Var x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (Neg e)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (And e1 e2)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración automática de valor_if_bool2if›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_bool2if_A:&lt;br /&gt;
  &amp;quot;valor_if (bool2if e) ent = valor e ent&amp;quot;&lt;br /&gt;
  by (induct e) simp_all&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración declarativa detallada de valor_if_bool2if›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_bool2if:&lt;br /&gt;
  &amp;quot;valor_if (bool2if e) ent = valor e ent&amp;quot;&lt;br /&gt;
proof (induct e)&lt;br /&gt;
  fix b&lt;br /&gt;
  have &amp;quot;valor_if (bool2if (Const b)) ent = valor_if (CIF b) ent&amp;quot;&lt;br /&gt;
    by (simp only: bool2if.simps(1))&lt;br /&gt;
  also have &amp;quot;… = b&amp;quot;&lt;br /&gt;
    by (simp only: valor_if.simps(1))&lt;br /&gt;
  also have &amp;quot;… = valor (Const b) ent&amp;quot;&lt;br /&gt;
    by (simp only: valor.simps(1))&lt;br /&gt;
  finally show &amp;quot;valor_if (bool2if (Const b)) ent = valor (Const b) ent&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  have &amp;quot;valor_if (bool2if (Var n)) ent = valor_if (VIF n) ent&amp;quot;&lt;br /&gt;
    by (simp only: bool2if.simps(2))&lt;br /&gt;
  also have &amp;quot;… = ent n&amp;quot;&lt;br /&gt;
    by (simp only: valor_if.simps(2))&lt;br /&gt;
  also have &amp;quot;… = valor (Var n) ent&amp;quot;&lt;br /&gt;
    by (simp only: valor.simps(2))&lt;br /&gt;
  finally show &amp;quot;valor_if (bool2if (Var n)) ent = valor (Var n) ent&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
next&lt;br /&gt;
  fix e&lt;br /&gt;
  assume HI: &amp;quot;valor_if (bool2if e) ent = valor e ent&amp;quot;&lt;br /&gt;
  have &amp;quot;valor_if (bool2if (Neg e)) ent = &lt;br /&gt;
        valor_if (IF (bool2if e) (CIF False) (CIF True)) ent&amp;quot;&lt;br /&gt;
    by (simp only: bool2if.simps(3))&lt;br /&gt;
  also have &amp;quot;… = (if valor_if (bool2if e) ent &lt;br /&gt;
                   then valor_if (CIF False) ent&lt;br /&gt;
                   else valor_if (CIF True) ent)&amp;quot;&lt;br /&gt;
    by (simp only: valor_if.simps(3))&lt;br /&gt;
  also have &amp;quot;… = (if valor e ent &lt;br /&gt;
                   then False&lt;br /&gt;
                   else True)&amp;quot;&lt;br /&gt;
    by (simp only: HI valor_if.simps(1))&lt;br /&gt;
    also have &amp;quot;… = (¬ valor e ent)&amp;quot; &lt;br /&gt;
    by (rule SMT.z3_rule(52))&lt;br /&gt;
  also have &amp;quot;… = valor (Neg e) ent&amp;quot;&lt;br /&gt;
    by (simp only: valor.simps(3))&lt;br /&gt;
  finally show &amp;quot;valor_if (bool2if (Neg e)) ent = valor (Neg e) ent&amp;quot;&lt;br /&gt;
    by this&lt;br /&gt;
next&lt;br /&gt;
  fix e1 e2&lt;br /&gt;
  assume HI1: &amp;quot;valor_if (bool2if e1) ent = valor e1 ent&amp;quot; and&lt;br /&gt;
         HI2: &amp;quot;valor_if (bool2if e2) ent = valor e2 ent&amp;quot;&lt;br /&gt;
  have &amp;quot;valor_if (bool2if (And e1 e2)) ent = &lt;br /&gt;
        valor_if (IF (bool2if e1) (bool2if e2) (CIF False)) ent&amp;quot;&lt;br /&gt;
    by (simp only: bool2if.simps(4))&lt;br /&gt;
  also have &amp;quot;… = (if valor_if (bool2if e1) ent &lt;br /&gt;
                   then valor_if (bool2if e2) ent&lt;br /&gt;
                   else valor_if (CIF False) ent)&amp;quot;&lt;br /&gt;
    by (simp only: valor_if.simps(3))&lt;br /&gt;
  also have &amp;quot;… = (if valor e1 ent &lt;br /&gt;
                   then valor e2 ent&lt;br /&gt;
                   else False)&amp;quot;&lt;br /&gt;
    by (simp only: HI1 HI2 valor_if.simps(1))&lt;br /&gt;
  also have &amp;quot;… = ((valor e1 ent ∧ valor e2 ent) ∨&lt;br /&gt;
                   (¬(valor e1 ent) ∧ False))&amp;quot;&lt;br /&gt;
    by (rule if_bool_eq_disj)&lt;br /&gt;
    also have &amp;quot;… = ((valor e1 ent ∧ valor e2 ent) ∨ False)&amp;quot;&lt;br /&gt;
    by (simp only: simp_thms(23))&lt;br /&gt;
  also have &amp;quot;… = (valor e1 ent ∧ valor e2 ent)&amp;quot;&lt;br /&gt;
    by (simp only: simp_thms(31))&lt;br /&gt;
  also have &amp;quot;… = valor (And e1 e2) ent&amp;quot;&lt;br /&gt;
    by (simp only: valor.simps(4))&lt;br /&gt;
  finally show &amp;quot;valor_if (bool2if (And e1 e2)) ent = &lt;br /&gt;
                valor (And e1 e2) ent&amp;quot;&lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración aplicativa detallada de valor_if_bool2if›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_bool2if_aplicativa:&lt;br /&gt;
  &amp;quot;valor_if (bool2if e) ent = valor e ent&amp;quot;&lt;br /&gt;
  apply (induct e)&lt;br /&gt;
     apply (simp only: bool2if.simps valor_if.simps valor.simps)&lt;br /&gt;
    apply (simp only: bool2if.simps valor_if.simps valor.simps)&lt;br /&gt;
   apply (simp only: bool2if.simps)&lt;br /&gt;
   apply (simp only: valor_if.simps)&lt;br /&gt;
   apply (simp only: valor.simps)&lt;br /&gt;
   apply (split if_split)&lt;br /&gt;
   apply (rule conjI)&lt;br /&gt;
    apply (rule impI)&lt;br /&gt;
    apply (rule iffI)&lt;br /&gt;
     apply (rule ccontr, assumption)&lt;br /&gt;
    apply (erule notE, assumption)&lt;br /&gt;
   apply (rule impI)&lt;br /&gt;
   apply (rule iffI, assumption)&lt;br /&gt;
   apply (simp only: TrueI)&lt;br /&gt;
  apply (simp only: bool2if.simps)&lt;br /&gt;
  apply (simp only: valor_if.simps)&lt;br /&gt;
  apply (simp only: valor.simps)&lt;br /&gt;
  apply (split if_split)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply (rule impI)&lt;br /&gt;
   apply (rule iffI)&lt;br /&gt;
    apply (erule conjI, assumption)&lt;br /&gt;
   apply (erule conjunct2)&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule iffI)&lt;br /&gt;
   apply (rule FalseE, assumption)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply (erule conjunct1)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
section ‹Formas normales›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Definición de es_normal›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 6. Un expresión if, e, está en forma normal si para cada&lt;br /&gt;
  subexpresión de e de la forma (if c e1 e2) se tiene que c es una&lt;br /&gt;
  constante o una variable.&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     es_normal :: exp_if ⇒ bool&lt;br /&gt;
  tal que (es_normal e) se verifica si e está en forma normal.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun es_normal :: &amp;quot;exp_if ⇒ bool&amp;quot; where&lt;br /&gt;
   &amp;quot;es_normal (CIF _)            = True&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal (VIF _)            = True&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal (IF (CIF _) e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal (IF (VIF _) e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal _                  = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
subsection ‹Definición de normal›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     normal :: exp_if ⇒ exp_if&lt;br /&gt;
  tal que (normal e) es una expresión if en forma normal equivalente a&lt;br /&gt;
  la expresión e.&lt;br /&gt;
  --------------------------------------------------------------------- ›&lt;br /&gt;
&lt;br /&gt;
fun normalAux :: &amp;quot;exp_if ⇒ exp_if ⇒ exp_if ⇒ exp_if&amp;quot; where&lt;br /&gt;
   &amp;quot;normalAux (CIF b) e1 e2 = IF (CIF b) e1 e2&amp;quot;&lt;br /&gt;
 | &amp;quot;normalAux (VIF n) e1 e2 = IF (VIF n) e1 e2&amp;quot;&lt;br /&gt;
 | &amp;quot;normalAux (IF a a1 a2) e1 e2 = &lt;br /&gt;
      normalAux a (normalAux a1 e1 e2) (normalAux a2 e1 e2)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun normal :: &amp;quot;exp_if ⇒ exp_if&amp;quot; where&lt;br /&gt;
   &amp;quot;normal (CIF b)      = CIF b&amp;quot;&lt;br /&gt;
 | &amp;quot;normal (VIF n)      = VIF n&amp;quot;&lt;br /&gt;
 | &amp;quot;normal (IF e e1 e2) = normalAux e (normal e1) (normal e2)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
section ‹Corrección de la normalización›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 8. Demostrar que la forma normal de una expresión if es&lt;br /&gt;
  equivalente a la expresión; es decir,  &lt;br /&gt;
     valor_if (normal e) i = valor_if e i&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Lema auxiliar valor_if_normalAux›&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración estructurada de valor_if_normalAux›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_normalAux_E:&lt;br /&gt;
  &amp;quot;valor_if (normalAux e e1 e2) ent = valor_if (IF e e1 e2) ent&amp;quot;&lt;br /&gt;
proof (induct e arbitrary: e1 e2)&lt;br /&gt;
  case (CIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (VIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (IF e1 e2 e3)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración automática de valor_if_normalAux›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_normalAux_A:&lt;br /&gt;
  &amp;quot;valor_if (normalAux e e1 e2) ent = valor_if (IF e e1 e2) ent&amp;quot;&lt;br /&gt;
  by (induct e arbitrary: e1 e2) simp_all&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración declarativa detallada de valor_if_normalAux›&lt;br /&gt;
&lt;br /&gt;
lemma if_if:&lt;br /&gt;
  fixes A and A1 and A2 and C1 and C2 :: bool&lt;br /&gt;
  shows&lt;br /&gt;
  &amp;quot;(if A&lt;br /&gt;
    then (if A1 then C1 else C2)&lt;br /&gt;
    else (if A2 then C1 else C2)) =&lt;br /&gt;
   (if (if A then A1 else A2)&lt;br /&gt;
    then C1&lt;br /&gt;
    else C2)&amp;quot;  &lt;br /&gt;
  by (cases A; cases A1; cases A2) &lt;br /&gt;
     (simp_all only: if_True if_False)&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_IF:&lt;br /&gt;
  &amp;quot;valor_if (IF a (IF a1 c1 c2) (IF a2 c1 c2)) ent =&lt;br /&gt;
   valor_if (IF (IF a a1 a2) c1 c2) ent&amp;quot;&lt;br /&gt;
  by (simp only: valor_if.simps(3) if_if)&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_normalAux: &lt;br /&gt;
  &amp;quot;valor_if (normalAux e e1 e2) ent = valor_if (IF e e1 e2) ent&amp;quot;&lt;br /&gt;
proof (induct e arbitrary: e1 e2)&lt;br /&gt;
  fix b e1 e2&lt;br /&gt;
  show &amp;quot;valor_if (normalAux (CIF b) e1 e2) ent = &lt;br /&gt;
        valor_if (IF (CIF b) e1 e2) ent&amp;quot;  &lt;br /&gt;
    by (simp only: normalAux.simps(1)) &lt;br /&gt;
next&lt;br /&gt;
  fix n e1 e2&lt;br /&gt;
  show &amp;quot;valor_if (normalAux (VIF n) e1 e2) ent = &lt;br /&gt;
        valor_if (IF (VIF n) e1 e2) ent&amp;quot; &lt;br /&gt;
    by (simp only: normalAux.simps(2)) &lt;br /&gt;
next&lt;br /&gt;
  fix a a1 a2 c1 c2&lt;br /&gt;
  assume HI:  &amp;quot;⋀e1 e2. valor_if (normalAux a e1 e2) ent = &lt;br /&gt;
                        valor_if (IF a e1 e2) ent&amp;quot; and&lt;br /&gt;
         HI1: &amp;quot;⋀e1 e2. valor_if (normalAux a1 e1 e2) ent = &lt;br /&gt;
                        valor_if (IF a1 e1 e2) ent&amp;quot; and&lt;br /&gt;
         HI2: &amp;quot;⋀e1 e2. valor_if (normalAux a2 e1 e2) ent = &lt;br /&gt;
                        valor_if (IF a2 e1 e2) ent&amp;quot;&lt;br /&gt;
  show &amp;quot;valor_if (normalAux (IF a a1 a2) c1 c2) ent =&lt;br /&gt;
        valor_if (IF (IF a a1 a2) c1 c2) ent&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;valor_if (normalAux (IF a a1 a2) c1 c2) ent =&lt;br /&gt;
          valor_if (normalAux a &lt;br /&gt;
                              (normalAux a1 c1 c2) &lt;br /&gt;
                              (normalAux a2 c1 c2)) ent&amp;quot; &lt;br /&gt;
      by (simp only: normalAux.simps(3))&lt;br /&gt;
    also have &amp;quot;… = valor_if (IF a &lt;br /&gt;
                                 (normalAux a1 c1 c2) &lt;br /&gt;
                                 (normalAux a2 c1 c2)) ent&amp;quot; &lt;br /&gt;
      by (simp only: HI)&lt;br /&gt;
    also have &amp;quot;… = (if valor_if a ent &lt;br /&gt;
                     then valor_if (normalAux a1 c1 c2) ent&lt;br /&gt;
                     else valor_if (normalAux a2 c1 c2) ent)&amp;quot; &lt;br /&gt;
      by (simp only: valor_if.simps(3))&lt;br /&gt;
    also have &amp;quot;… = (if valor_if a ent&lt;br /&gt;
                     then valor_if (IF a1 c1 c2) ent&lt;br /&gt;
                     else valor_if (IF a2 c1 c2) ent)&amp;quot; &lt;br /&gt;
      by (simp only: HI1 HI2)&lt;br /&gt;
    also have &amp;quot;… = valor_if (IF a (IF a1 c1 c2) (IF a2 c1 c2)) ent&amp;quot;&lt;br /&gt;
      by (simp only: valor_if.simps(3))&lt;br /&gt;
    also have &amp;quot;… = valor_if (IF (IF a a1 a2) c1 c2) ent&amp;quot; &lt;br /&gt;
      by (simp only: valor_if_IF)    &lt;br /&gt;
    finally show ?thesis &lt;br /&gt;
      by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración aplicativa detallada de valor_if_normalAux›  &lt;br /&gt;
&lt;br /&gt;
lemma valor_if_normalAux_aplicativo:&lt;br /&gt;
  &amp;quot;∀e1 e2. valor_if (normalAux e e1 e2) ent = valor_if (IF e e1 e2) ent&amp;quot;&lt;br /&gt;
  apply (induct e)&lt;br /&gt;
    apply (rule allI)+&lt;br /&gt;
    apply (simp only: normalAux.simps(1))&lt;br /&gt;
   apply (rule allI)+&lt;br /&gt;
   apply (simp only: normalAux.simps(2))&lt;br /&gt;
  apply (rule allI)+&lt;br /&gt;
  apply (simp only: normalAux.simps(3))&lt;br /&gt;
  apply (simp only: valor_if.simps(3))&lt;br /&gt;
  apply (case_tac &amp;quot;valor_if e1 ent&amp;quot;)&lt;br /&gt;
   apply (simp only: if_True)&lt;br /&gt;
  apply (simp only: if_False)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostraciones del teorema valor_if_normal›&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración estructurada del teorema valor_if_normal›&lt;br /&gt;
&lt;br /&gt;
theorem valor_if_normal_E:&lt;br /&gt;
  &amp;quot;valor_if (normal b) ent = valor_if b ent&amp;quot;&lt;br /&gt;
proof (induct b)&lt;br /&gt;
  case (CIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (VIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (IF b1 b2 b3)&lt;br /&gt;
  then show ?case by (simp add: valor_if_normalAux)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración automática del teorema valor_if_normal›&lt;br /&gt;
&lt;br /&gt;
theorem valor_if_normal_A:&lt;br /&gt;
  &amp;quot;valor_if (normal b) ent = valor_if b ent&amp;quot;&lt;br /&gt;
  by (induct b) (simp_all add: valor_if_normalAux)&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración declarativa detallada del teorema valor_if_normal›&lt;br /&gt;
&lt;br /&gt;
theorem valor_if_normal:&lt;br /&gt;
  &amp;quot;valor_if (normal b) ent = valor_if b ent&amp;quot;&lt;br /&gt;
proof (induct b)&lt;br /&gt;
  fix b&lt;br /&gt;
  show &amp;quot;valor_if (normal (CIF b)) ent = valor_if (CIF b) ent&amp;quot;&lt;br /&gt;
    by (simp only: normal.simps(1) valor_if.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  show &amp;quot;valor_if (normal (VIF n)) ent = valor_if (VIF n) ent&amp;quot; &lt;br /&gt;
    by (simp only: normal.simps(2) valor_if.simps(2))&lt;br /&gt;
next&lt;br /&gt;
  fix e e1 e2&lt;br /&gt;
  assume HI:  &amp;quot;valor_if (normal e) ent = valor_if e ent&amp;quot; and&lt;br /&gt;
         HI1: &amp;quot;valor_if (normal e1) ent = valor_if e1 ent&amp;quot; and&lt;br /&gt;
         HI2: &amp;quot;valor_if (normal e2) ent = valor_if e2 ent&amp;quot;&lt;br /&gt;
  show &amp;quot;valor_if (normal (IF e e1 e2)) ent = &lt;br /&gt;
        valor_if (IF e e1 e2) ent&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;valor_if (normal (IF e e1 e2)) ent = &lt;br /&gt;
          valor_if (normalAux e (normal e1) (normal e2)) ent&amp;quot; &lt;br /&gt;
      by (simp only: normal.simps(3))&lt;br /&gt;
    also have &amp;quot;… = valor_if (IF e (normal e1) (normal e2)) ent&amp;quot; &lt;br /&gt;
      by (simp only: valor_if_normalAux)&lt;br /&gt;
    also have &amp;quot;… = (if (valor_if e ent) &lt;br /&gt;
                     then (valor_if (normal e1) ent) &lt;br /&gt;
                     else (valor_if (normal e2) ent))&amp;quot; &lt;br /&gt;
      by (simp only: valor_if.simps(3))&lt;br /&gt;
    also have &amp;quot;… = (if (valor_if e ent) &lt;br /&gt;
                     then (valor_if e1 ent) &lt;br /&gt;
                     else (valor_if e2 ent))&amp;quot; &lt;br /&gt;
      by (simp only: HI1 HI2)&lt;br /&gt;
    also have &amp;quot;… = valor_if (IF e e1 e2) ent&amp;quot; &lt;br /&gt;
      by (simp only: valor_if.simps(3))&lt;br /&gt;
    finally show ?thesis &lt;br /&gt;
      by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración aplicativa detallada del teorema valor_if_normal›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_normal_aplicativo:&lt;br /&gt;
  &amp;quot;valor_if (normal b) ent = valor_if b ent&amp;quot;&lt;br /&gt;
  apply (induct b)&lt;br /&gt;
    apply (simp only: normal.simps(1))&lt;br /&gt;
   apply (simp only: normal.simps(2))&lt;br /&gt;
  apply (simp only: normal.simps(3))&lt;br /&gt;
  apply (simp only: valor_if_normalAux_aplicativo)&lt;br /&gt;
  apply (simp only: valor_if.simps(3))&lt;br /&gt;
  done &lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 9. Demostrar que para toda expresión if e, (normal e) está&lt;br /&gt;
  en forma normal.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Lema auxiliar es_normal_normalAux›&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración estructurada de es_normal_normalAux›&lt;br /&gt;
&lt;br /&gt;
lemma es_normal_normalAux_E:&lt;br /&gt;
  &amp;quot;es_normal (normalAux e e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
proof (induct e arbitrary: e1 e2)&lt;br /&gt;
  case (CIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (VIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (IF e1 e2 e3)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración automática de es_normal_normalAux›&lt;br /&gt;
&lt;br /&gt;
lemma es_normal_normalAux_A:&lt;br /&gt;
  &amp;quot;es_normal (normalAux e e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
  by (induct e arbitrary: e1 e2) simp_all&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración declarativa detallada de es_normal_normalAux›&lt;br /&gt;
&lt;br /&gt;
lemma es_normal_normalAux:&lt;br /&gt;
  &amp;quot;es_normal (normalAux e e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
proof (induct e arbitrary: e1 e2)&lt;br /&gt;
  fix b e1 e2&lt;br /&gt;
  have &amp;quot;es_normal (normalAux (CIF b) e1 e2) = &lt;br /&gt;
        es_normal (IF (CIF b) e1 e2)&amp;quot;&lt;br /&gt;
    by (simp only: normalAux.simps(1))&lt;br /&gt;
  also have &amp;quot;… =  (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
    by (simp only: es_normal.simps(3))&lt;br /&gt;
  finally show &amp;quot;es_normal (normalAux (CIF b) e1 e2) =&lt;br /&gt;
                (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
    by this &lt;br /&gt;
next&lt;br /&gt;
  fix n e1 e2&lt;br /&gt;
  have &amp;quot;es_normal (normalAux (VIF n) e1 e2) = &lt;br /&gt;
        es_normal (IF (VIF n) e1 e2)&amp;quot;&lt;br /&gt;
    by (simp only: normalAux.simps(2))&lt;br /&gt;
  also have &amp;quot;… =  (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
    by (simp only: es_normal.simps(4))&lt;br /&gt;
  finally show &amp;quot;es_normal (normalAux (VIF n) e1 e2) =&lt;br /&gt;
                (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
    by this &lt;br /&gt;
next&lt;br /&gt;
  fix a a1 a2 e1 e2&lt;br /&gt;
  assume &lt;br /&gt;
    HI:  &amp;quot;⋀e1 e2. es_normal (normalAux a e1 e2) = &lt;br /&gt;
                  (es_normal e1 ∧ es_normal e2)&amp;quot; and&lt;br /&gt;
    HI1: &amp;quot;⋀e1 e2. es_normal (normalAux a1 e1 e2) = &lt;br /&gt;
                  (es_normal e1 ∧ es_normal e2)&amp;quot; and&lt;br /&gt;
    HI2: &amp;quot;⋀e1 e2. es_normal (normalAux a2 e1 e2) = &lt;br /&gt;
                  (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
  have &amp;quot;es_normal (normalAux (IF a a1 a2) e1 e2) = &lt;br /&gt;
        es_normal (normalAux a &lt;br /&gt;
                             (normalAux a1 e1 e2)&lt;br /&gt;
                             (normalAux a2 e1 e2))&amp;quot; &lt;br /&gt;
    by (simp only: normalAux.simps(3))&lt;br /&gt;
  also have &amp;quot;… = (es_normal (normalAux a1 e1 e2) ∧&lt;br /&gt;
                   es_normal (normalAux a2 e1 e2))&amp;quot;&lt;br /&gt;
    by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;… = ((es_normal e1 ∧ es_normal e2) ∧&lt;br /&gt;
                   (es_normal e1 ∧ es_normal e2))&amp;quot;&lt;br /&gt;
    by (simp only: HI1 HI2)&lt;br /&gt;
  also have &amp;quot;… = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
    by (simp only: conj_absorb)&lt;br /&gt;
  finally show &amp;quot;es_normal (normalAux (IF a a1 a2) e1 e2) = &lt;br /&gt;
               (es_normal e1 ∧ es_normal e2)&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
    qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración aplicativa detallada de es_normal_normalAux›&lt;br /&gt;
&lt;br /&gt;
lemma es_normal_normalAux_aplicativa:&lt;br /&gt;
  &amp;quot;es_normal (normalAux e e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;    &lt;br /&gt;
  apply (induct e arbitrary: e1 e2)&lt;br /&gt;
    apply (simp only: normalAux.simps es_normal.simps)+&lt;br /&gt;
  apply (rule iffI)&lt;br /&gt;
   apply (erule conjunct2)&lt;br /&gt;
  apply (rule conjI)&lt;br /&gt;
   apply assumption+&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostraciones del teorema es_normal_normal›&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración estructurada del teorema es_normal_normal›&lt;br /&gt;
&lt;br /&gt;
theorem es_normal_normal_E:&lt;br /&gt;
  &amp;quot;es_normal (normal b)&amp;quot;&lt;br /&gt;
proof (induct b)&lt;br /&gt;
  case (CIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (VIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (IF b1 b2 b3)&lt;br /&gt;
  then show ?case by (simp add: es_normal_normalAux)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración automática del teorema es_normal_normal›&lt;br /&gt;
&lt;br /&gt;
theorem es_normal_normal_A:&lt;br /&gt;
  &amp;quot;es_normal (normal b)&amp;quot;&lt;br /&gt;
  by (induct b) (simp_all add: es_normal_normalAux)&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración declarativa detallada del teorema &lt;br /&gt;
  es_normal_normal›&lt;br /&gt;
&lt;br /&gt;
theorem es_normal_normal:&lt;br /&gt;
  &amp;quot;es_normal (normal b)&amp;quot;&lt;br /&gt;
proof (induct b)&lt;br /&gt;
  fix b&lt;br /&gt;
  show &amp;quot;es_normal (normal (CIF b))&amp;quot;&lt;br /&gt;
    by (simp only: normal.simps(1) es_normal.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  show &amp;quot;es_normal (normal (VIF n))&amp;quot; &lt;br /&gt;
    by (simp only: normal.simps(2) es_normal.simps(2))&lt;br /&gt;
next&lt;br /&gt;
  fix e e1 e2&lt;br /&gt;
  assume &amp;quot;es_normal (normal e)&amp;quot;&lt;br /&gt;
    &amp;quot;es_normal (normal e1)&amp;quot;&lt;br /&gt;
    &amp;quot;es_normal (normal e2)&amp;quot;&lt;br /&gt;
  then show &amp;quot;es_normal (normal (IF e e1 e2))&amp;quot; &lt;br /&gt;
    by (simp only: normal.simps(3) es_normal_normalAux)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración aplicativa detallada del teorema &lt;br /&gt;
  es_normal_normal›&lt;br /&gt;
&lt;br /&gt;
lemma es_normal_normal_aplicativa:&lt;br /&gt;
  &amp;quot;es_normal (normal b)&amp;quot;&lt;br /&gt;
  apply (induct b)&lt;br /&gt;
    apply (simp only: normal.simps(1))&lt;br /&gt;
    apply (simp only: es_normal.simps(1))&lt;br /&gt;
   apply (simp only: normal.simps(2))&lt;br /&gt;
   apply (simp only: es_normal.simps(2))&lt;br /&gt;
  apply (simp only: normal.simps)&lt;br /&gt;
  apply (simp only: es_normal_normalAux_aplicativa)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
section ‹Definición de bool2ifN›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 10. Definir la función&lt;br /&gt;
     bool2ifN :: exp_booleana ⇒ exp_if&lt;br /&gt;
  tal que (bool2ifN e) es una expresión if en forma normal equivalente a&lt;br /&gt;
  la expresión Booleana e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
definition bool2ifN :: &amp;quot;exp_booleana ⇒ exp_if&amp;quot; where&lt;br /&gt;
  &amp;quot;bool2ifN e ≡ normal (bool2if e)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
section ‹Lema es_normal_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 11. Demostrar que para toda expresión booleana e, &lt;br /&gt;
  (bool2ifN e) está en forma normal.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de es_normal_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
theorem es_normal_bool2ifN_A:&lt;br /&gt;
  &amp;quot;es_normal (bool2ifN e)&amp;quot;&lt;br /&gt;
   by (simp only: bool2ifN_def es_normal_normal) &lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración declarativa detallada de es_normal_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
lemma es_normal_bool2ifN: &lt;br /&gt;
  &amp;quot;es_normal (bool2ifN e)&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  have &amp;quot;bool2ifN e = normal (bool2if e)&amp;quot; &lt;br /&gt;
    by (simp only: bool2ifN_def)&lt;br /&gt;
  then show &amp;quot;es_normal (bool2ifN e)&amp;quot; &lt;br /&gt;
    by (simp only: es_normal_normal) &lt;br /&gt;
qed  &lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración aplicativa detallada de es_normal_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
lemma es_normal_bool2ifN_aplicativa: &lt;br /&gt;
  &amp;quot;es_normal (bool2ifN e)&amp;quot;  &lt;br /&gt;
  apply (simp only: bool2ifN_def)&lt;br /&gt;
  apply (simp only: es_normal_normal) &lt;br /&gt;
  done&lt;br /&gt;
  &lt;br /&gt;
section ‹Lema valor_if_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 12. Demostrar que para toda expresión booleana e, &lt;br /&gt;
  (bool2ifN e) es equivalente a e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de valor_if_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
theorem valor_if_bool2ifN_A:&lt;br /&gt;
  &amp;quot;valor_if (bool2ifN e) ent = valor e ent&amp;quot;&lt;br /&gt;
  by (simp only: bool2ifN_def valor_if_bool2if valor_if_normal)&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración declarativa detallada de valor_if_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_bool2ifN:&lt;br /&gt;
  &amp;quot;valor_if (bool2ifN e) ent = valor e ent&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;bool2ifN e ≡ normal (bool2if e)&amp;quot; &lt;br /&gt;
    by (simp only: bool2ifN_def)&lt;br /&gt;
  then have &amp;quot;valor_if (bool2ifN e) ent = &lt;br /&gt;
             valor_if (normal (bool2if e)) ent&amp;quot; &lt;br /&gt;
    by (simp only: )&lt;br /&gt;
  also have &amp;quot;… = valor_if (bool2if e) ent&amp;quot; &lt;br /&gt;
    by (simp only: valor_if_normal)&lt;br /&gt;
  also have &amp;quot;… = valor e ent&amp;quot; &lt;br /&gt;
    by (simp only: valor_if_bool2if)&lt;br /&gt;
  finally show  &amp;quot;valor_if (bool2ifN e) ent = valor e ent&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración aplicativa detallada de valor_if_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_bool2ifN_aplicativa:&lt;br /&gt;
  &amp;quot;valor_if (bool2ifN e) ent = valor e ent&amp;quot;&lt;br /&gt;
  apply (simp only: bool2ifN_def)&lt;br /&gt;
  apply (simp only: valor_if_normal)&lt;br /&gt;
  apply (simp only: valor_if_bool2if)&lt;br /&gt;
  done&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=TF_sol&amp;diff=1267</id>
		<title>TF sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=TF_sol&amp;diff=1267"/>
		<updated>2020-06-18T06:53:16Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Protegió «TF sol» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter ‹Expresiones booleanas y expresiones condicionales›&lt;br /&gt;
&lt;br /&gt;
theory Trabajo_final_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section ‹Expresiones booleanas›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 1. La expresiones booleanas se definen por&lt;br /&gt;
  * las constantes booleanas son expresiones,&lt;br /&gt;
  * las variables son expresiones,&lt;br /&gt;
  * Si e es una expresión, entonces ¬e también lo es.&lt;br /&gt;
  * Si e1 y e2 son expresiones, entonces e1 ∧ e2 también lo es.&lt;br /&gt;
&lt;br /&gt;
  Definir exp_booleana como el tipo de las expresiones booleanas.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
datatype exp_booleana = Const bool &lt;br /&gt;
                      | Var nat &lt;br /&gt;
                      | Neg exp_booleana&lt;br /&gt;
                      | And exp_booleana exp_booleana&lt;br /&gt;
&lt;br /&gt;
section ‹El valor de las expresiones boolenas›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 2. Una interpretación es una función i que asigna a cada&lt;br /&gt;
  número natural un booleano de forma que el valor de la variable&lt;br /&gt;
  &amp;#039;Var n&amp;#039; en la interpretación &amp;#039;i&amp;#039; es &amp;#039;i(n)&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     valor :: exp_booleana ⇒ (nat ⇒ bool) ⇒ bool&lt;br /&gt;
  tal que (valor e i) es el valor de la expresión booleana e en la&lt;br /&gt;
  interpretación i. Por ejemplo,&lt;br /&gt;
     value &amp;quot;(valor (Var 3) (λx. False)) &lt;br /&gt;
  es False&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun valor :: &amp;quot;exp_booleana ⇒ (nat ⇒ bool) ⇒ bool&amp;quot; where&lt;br /&gt;
   &amp;quot;valor (Const b) _   = b&amp;quot;&lt;br /&gt;
 | &amp;quot;valor (Var n) i     = i n &amp;quot;&lt;br /&gt;
 | &amp;quot;valor (Neg e) i     = (¬ (valor e i))&amp;quot;&lt;br /&gt;
 | &amp;quot;valor (And e1 e2) i = (valor e1 i ∧ valor e2 i)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
section ‹Expresiones If›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 3. La expresiones if se definen por&lt;br /&gt;
  * las constantes booleanas son expresiones,&lt;br /&gt;
  * las variables son expresiones,&lt;br /&gt;
  * Si e, e1 y e2 son expresiones, entonces (if e e1 e2) también lo es.&lt;br /&gt;
&lt;br /&gt;
  Definir exp_if como el tipo de las expresiones if.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
datatype exp_if = CIF bool &lt;br /&gt;
                | VIF nat &lt;br /&gt;
                | IF exp_if exp_if exp_if&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     valor_if :: exp_if ⇒ (nat ⇒ bool) ⇒ bool&lt;br /&gt;
  tal que (valor_if e i) es el valor de la expresión if e en la&lt;br /&gt;
  interpretación i.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun valor_if :: &amp;quot;exp_if ⇒ (nat ⇒ bool) ⇒ bool&amp;quot; where&lt;br /&gt;
   &amp;quot;valor_if (CIF b) _      = b&amp;quot;&lt;br /&gt;
 | &amp;quot;valor_if (VIF n) i      = i n&amp;quot;&lt;br /&gt;
 | &amp;quot;valor_if (IF e e1 e2) i = (if (valor_if e i) &lt;br /&gt;
                               then (valor_if e1 i) &lt;br /&gt;
                               else (valor_if e2 i))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
section ‹Transformación de expresiones booleanas en expresiones if›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Definición de bool2if›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     bool2if :: exp_booleana ⇒ exp_if&lt;br /&gt;
  tal que (bool2if e) es una expresión if equivalente a la expresión&lt;br /&gt;
  booleana e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun bool2if :: &amp;quot;exp_booleana ⇒ exp_if&amp;quot; where&lt;br /&gt;
   &amp;quot;bool2if (Const b)   = CIF b&amp;quot;&lt;br /&gt;
 | &amp;quot;bool2if (Var n)     = VIF n&amp;quot;&lt;br /&gt;
 | &amp;quot;bool2if (Neg e)     = IF (bool2if e) (CIF False) (CIF True)&amp;quot;&lt;br /&gt;
 | &amp;quot;bool2if (And e1 e2) = IF (bool2if e1) (bool2if e2) (CIF False)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 6. Demostrar que para cualquier expresión boolena e, son&lt;br /&gt;
  equivalentes (bool2if e) y e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostraciones de valor_if_bool2if›&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración estructurada de valor_if_bool2if›&lt;br /&gt;
lemma valor_if_bool2if_E:&lt;br /&gt;
  &amp;quot;valor_if (bool2if e) ent = valor e ent&amp;quot;&lt;br /&gt;
proof (induct e)&lt;br /&gt;
  case (Const x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (Var x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (Neg e)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (And e1 e2)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración automática de valor_if_bool2if›&lt;br /&gt;
lemma valor_if_bool2if_A: &lt;br /&gt;
  &amp;quot;valor_if (bool2if e) ent = valor e ent&amp;quot;&lt;br /&gt;
  by (induct e) simp_all&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración declarativa detallada de valor_if_bool2if›&lt;br /&gt;
lemma valor_if_bool2if:&lt;br /&gt;
  &amp;quot;valor_if (bool2if e) ent = valor e ent&amp;quot;&lt;br /&gt;
proof (induct e)&lt;br /&gt;
  fix b&lt;br /&gt;
  have &amp;quot;valor_if (bool2if (Const b)) ent = valor_if (CIF b) ent&amp;quot;&lt;br /&gt;
    by (simp only: bool2if.simps(1))&lt;br /&gt;
  also have &amp;quot;… = b&amp;quot;&lt;br /&gt;
    by (simp only: valor_if.simps(1))&lt;br /&gt;
  also have &amp;quot;… = valor (Const b) ent&amp;quot;&lt;br /&gt;
    by (simp only: valor.simps(1))&lt;br /&gt;
  finally show &amp;quot;valor_if (bool2if (Const b)) ent = valor (Const b) ent&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  have &amp;quot;valor_if (bool2if (Var n)) ent = valor_if (VIF n) ent&amp;quot;&lt;br /&gt;
    by (simp only: bool2if.simps(2))&lt;br /&gt;
  also have &amp;quot;… = ent n&amp;quot;&lt;br /&gt;
    by (simp only: valor_if.simps(2))&lt;br /&gt;
  also have &amp;quot;… = valor (Var n) ent&amp;quot;&lt;br /&gt;
    by (simp only: valor.simps(2))&lt;br /&gt;
  finally show &amp;quot;valor_if (bool2if (Var n)) ent = valor (Var n) ent&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
next&lt;br /&gt;
  fix e&lt;br /&gt;
  assume HI: &amp;quot;valor_if (bool2if e) ent = valor e ent&amp;quot;&lt;br /&gt;
  have &amp;quot;valor_if (bool2if (Neg e)) ent = &lt;br /&gt;
        valor_if (IF (bool2if e) (CIF False) (CIF True)) ent&amp;quot;&lt;br /&gt;
    by (simp only: bool2if.simps(3))&lt;br /&gt;
  also have &amp;quot;… = (if valor_if (bool2if e) ent &lt;br /&gt;
                   then valor_if (CIF False) ent&lt;br /&gt;
                   else valor_if (CIF True) ent)&amp;quot;&lt;br /&gt;
    by (simp only: valor_if.simps(3))&lt;br /&gt;
  also have &amp;quot;… = (if valor e ent &lt;br /&gt;
                   then False&lt;br /&gt;
                   else True)&amp;quot;&lt;br /&gt;
    by (simp only: HI valor_if.simps(1))&lt;br /&gt;
    also have &amp;quot;… = (¬ valor e ent)&amp;quot; &lt;br /&gt;
    by (rule SMT.z3_rule(52))&lt;br /&gt;
  also have &amp;quot;… = valor (Neg e) ent&amp;quot;&lt;br /&gt;
    by (simp only: valor.simps(3))&lt;br /&gt;
  finally show &amp;quot;valor_if (bool2if (Neg e)) ent = valor (Neg e) ent&amp;quot;&lt;br /&gt;
    by this&lt;br /&gt;
next&lt;br /&gt;
  fix e1 e2&lt;br /&gt;
  assume HI1: &amp;quot;valor_if (bool2if e1) ent = valor e1 ent&amp;quot; and&lt;br /&gt;
         HI2: &amp;quot;valor_if (bool2if e2) ent = valor e2 ent&amp;quot;&lt;br /&gt;
  have &amp;quot;valor_if (bool2if (And e1 e2)) ent = &lt;br /&gt;
        valor_if (IF (bool2if e1) (bool2if e2) (CIF False)) ent&amp;quot;&lt;br /&gt;
    by (simp only: bool2if.simps(4))&lt;br /&gt;
  also have &amp;quot;… = (if valor_if (bool2if e1) ent &lt;br /&gt;
                   then valor_if (bool2if e2) ent&lt;br /&gt;
                   else valor_if (CIF False) ent)&amp;quot;&lt;br /&gt;
    by (simp only: valor_if.simps(3))&lt;br /&gt;
  also have &amp;quot;… = (if valor e1 ent &lt;br /&gt;
                   then valor e2 ent&lt;br /&gt;
                   else False)&amp;quot;&lt;br /&gt;
    by (simp only: HI1 HI2 valor_if.simps(1))&lt;br /&gt;
  also have &amp;quot;… = ((valor e1 ent ∧ valor e2 ent) ∨&lt;br /&gt;
                   (¬(valor e1 ent) ∧ False))&amp;quot;&lt;br /&gt;
    by (rule if_bool_eq_disj)&lt;br /&gt;
    also have &amp;quot;… = ((valor e1 ent ∧ valor e2 ent) ∨ False)&amp;quot;&lt;br /&gt;
    by (simp only: simp_thms(23))&lt;br /&gt;
  also have &amp;quot;… = (valor e1 ent ∧ valor e2 ent)&amp;quot;&lt;br /&gt;
    by (simp only: simp_thms(31))&lt;br /&gt;
  also have &amp;quot;… = valor (And e1 e2) ent&amp;quot;&lt;br /&gt;
    by (simp only: valor.simps(4))&lt;br /&gt;
  finally show &amp;quot;valor_if (bool2if (And e1 e2)) ent = &lt;br /&gt;
                valor (And e1 e2) ent&amp;quot;&lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración aplicativa detallada de valor_if_bool2if›&lt;br /&gt;
lemma valor_if_bool2if_aplicativa:&lt;br /&gt;
  &amp;quot;valor_if (bool2if e) ent = valor e ent&amp;quot;&lt;br /&gt;
  apply(induct e)&lt;br /&gt;
  apply(simp only: bool2if.simps&lt;br /&gt;
                   valor_if.simps&lt;br /&gt;
                   valor.simps)&lt;br /&gt;
  apply(simp only: bool2if.simps&lt;br /&gt;
                   valor_if.simps&lt;br /&gt;
                   valor.simps)&lt;br /&gt;
  apply(simp only: bool2if.simps)&lt;br /&gt;
  apply(simp only: valor_if.simps)&lt;br /&gt;
  apply(simp only: valor.simps)&lt;br /&gt;
  apply(split if_split)&lt;br /&gt;
  apply(rule conjI)&lt;br /&gt;
  apply(rule impI)&lt;br /&gt;
  apply(rule iffI)&lt;br /&gt;
  apply(rule ccontr, assumption)&lt;br /&gt;
  apply(erule notE, assumption)&lt;br /&gt;
  apply(rule impI)&lt;br /&gt;
  apply(rule iffI, assumption)&lt;br /&gt;
  apply(simp only: TrueI)&lt;br /&gt;
  apply(simp only: bool2if.simps)&lt;br /&gt;
  apply(simp only: valor_if.simps)&lt;br /&gt;
  apply(simp only: valor.simps)&lt;br /&gt;
  apply(split if_split)&lt;br /&gt;
  apply(rule conjI)&lt;br /&gt;
  apply(rule impI)&lt;br /&gt;
  apply(rule iffI)&lt;br /&gt;
  apply(erule conjI, assumption)&lt;br /&gt;
  apply(erule conjunct2)&lt;br /&gt;
  apply(rule impI)&lt;br /&gt;
  apply(rule iffI)&lt;br /&gt;
  apply (rule FalseE, assumption)&lt;br /&gt;
  apply(erule notE)&lt;br /&gt;
  apply(erule conjunct1)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
section ‹Formas normales›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Definición de es_normal›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 6. Un expresión if, e, está en forma normal si para cada&lt;br /&gt;
  subexpresión de e de la forma (if c e1 e2) se tiene que c es una&lt;br /&gt;
  constante o una variable.&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     es_normal :: exp_if ⇒ bool&lt;br /&gt;
  tal que (es_normal e) se verifica si e está en forma normal.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun es_normal :: &amp;quot;exp_if ⇒ bool&amp;quot; where&lt;br /&gt;
   &amp;quot;es_normal (CIF _)            = True&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal (VIF _)            = True&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal (IF (CIF _) e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal (IF (VIF _) e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal _                  = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
subsection ‹Definición de normal›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     normal :: exp_if ⇒ exp_if&lt;br /&gt;
  tal que (normal e) es una expresión if en forma normal equivalente a&lt;br /&gt;
  la expresión e.&lt;br /&gt;
  --------------------------------------------------------------------- ›&lt;br /&gt;
&lt;br /&gt;
fun normalAux :: &amp;quot;exp_if ⇒ exp_if ⇒ exp_if ⇒ exp_if&amp;quot; where&lt;br /&gt;
   &amp;quot;normalAux (CIF b) e1 e2 = IF (CIF b) e1 e2&amp;quot;&lt;br /&gt;
 | &amp;quot;normalAux (VIF n) e1 e2 = IF (VIF n) e1 e2&amp;quot;&lt;br /&gt;
 | &amp;quot;normalAux (IF a a1 a2) e1 e2 = &lt;br /&gt;
      normalAux a (normalAux a1 e1 e2) (normalAux a2 e1 e2)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun normal :: &amp;quot;exp_if ⇒ exp_if&amp;quot; where&lt;br /&gt;
   &amp;quot;normal (CIF b)      = CIF b&amp;quot;&lt;br /&gt;
 | &amp;quot;normal (VIF n)      = VIF n&amp;quot;&lt;br /&gt;
 | &amp;quot;normal (IF e e1 e2) = normalAux e (normal e1) (normal e2)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
section ‹Corrección de la normalización›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 8. Demostrar que la forma normal de una expresión if es&lt;br /&gt;
  equivalente a la expresión; es decir,  &lt;br /&gt;
     valor_if (normal e) i = valor_if e i&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Lema auxiliar valor_if_normalAux›&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración estructurada de valor_if_normalAux›&lt;br /&gt;
lemma valor_if_normalAux_E:&lt;br /&gt;
  &amp;quot;valor_if (normalAux e e1 e2) ent = valor_if (IF e e1 e2) ent&amp;quot;&lt;br /&gt;
proof (induct e arbitrary: e1 e2)&lt;br /&gt;
  case (CIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (VIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (IF e1 e2 e3)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración automática de valor_if_normalAux›&lt;br /&gt;
lemma valor_if_normalAux_A: &lt;br /&gt;
  &amp;quot;valor_if (normalAux e e1 e2) ent = valor_if (IF e e1 e2) ent&amp;quot;&lt;br /&gt;
  by (induct e arbitrary: e1 e2) simp_all&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración declarativa detallada de valor_if_normalAux›&lt;br /&gt;
&lt;br /&gt;
lemma if_if:&lt;br /&gt;
  fixes A and A1 and A2 and C1 and C2 :: bool&lt;br /&gt;
  shows&lt;br /&gt;
  &amp;quot;(if A&lt;br /&gt;
    then (if A1 then C1 else C2)&lt;br /&gt;
    else (if A2 then C1 else C2)) =&lt;br /&gt;
   (if (if A then A1 else A2)&lt;br /&gt;
    then C1&lt;br /&gt;
    else C2)&amp;quot;  &lt;br /&gt;
  by (cases A; cases A1; cases A2) &lt;br /&gt;
     (simp_all only: if_True if_False)&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_IF:&lt;br /&gt;
  &amp;quot;valor_if (IF a (IF a1 c1 c2) (IF a2 c1 c2)) ent =&lt;br /&gt;
   valor_if (IF (IF a a1 a2) c1 c2) ent&amp;quot;&lt;br /&gt;
  by (simp only: valor_if.simps(3) if_if)&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_normalAux: &lt;br /&gt;
  &amp;quot;valor_if (normalAux e e1 e2) ent = valor_if (IF e e1 e2) ent&amp;quot;&lt;br /&gt;
proof (induct e arbitrary: e1 e2)&lt;br /&gt;
  fix b e1 e2&lt;br /&gt;
  show &amp;quot;valor_if (normalAux (CIF b) e1 e2) ent = &lt;br /&gt;
        valor_if (IF (CIF b) e1 e2) ent&amp;quot;  &lt;br /&gt;
    by (simp only: normalAux.simps(1)) &lt;br /&gt;
next&lt;br /&gt;
  fix n e1 e2&lt;br /&gt;
  show &amp;quot;valor_if (normalAux (VIF n) e1 e2) ent = &lt;br /&gt;
        valor_if (IF (VIF n) e1 e2) ent&amp;quot; &lt;br /&gt;
    by (simp only: normalAux.simps(2)) &lt;br /&gt;
next&lt;br /&gt;
  fix a a1 a2 c1 c2&lt;br /&gt;
  assume HI:  &amp;quot;⋀e1 e2. valor_if (normalAux a e1 e2) ent = &lt;br /&gt;
                        valor_if (IF a e1 e2) ent&amp;quot; and&lt;br /&gt;
         HI1: &amp;quot;⋀e1 e2. valor_if (normalAux a1 e1 e2) ent = &lt;br /&gt;
                        valor_if (IF a1 e1 e2) ent&amp;quot; and&lt;br /&gt;
         HI2: &amp;quot;⋀e1 e2. valor_if (normalAux a2 e1 e2) ent = &lt;br /&gt;
                        valor_if (IF a2 e1 e2) ent&amp;quot;&lt;br /&gt;
  show &amp;quot;valor_if (normalAux (IF a a1 a2) c1 c2) ent =&lt;br /&gt;
        valor_if (IF (IF a a1 a2) c1 c2) ent&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;valor_if (normalAux (IF a a1 a2) c1 c2) ent =&lt;br /&gt;
          valor_if (normalAux a &lt;br /&gt;
                              (normalAux a1 c1 c2) &lt;br /&gt;
                              (normalAux a2 c1 c2)) ent&amp;quot; &lt;br /&gt;
      by (simp only: normalAux.simps(3))&lt;br /&gt;
    also have &amp;quot;… = valor_if (IF a &lt;br /&gt;
                                 (normalAux a1 c1 c2) &lt;br /&gt;
                                 (normalAux a2 c1 c2)) ent&amp;quot; &lt;br /&gt;
      by (simp only: HI)&lt;br /&gt;
    also have &amp;quot;… = (if valor_if a ent &lt;br /&gt;
                     then valor_if (normalAux a1 c1 c2) ent&lt;br /&gt;
                     else valor_if (normalAux a2 c1 c2) ent)&amp;quot; &lt;br /&gt;
      by (simp only: valor_if.simps(3))&lt;br /&gt;
    also have &amp;quot;… = (if valor_if a ent&lt;br /&gt;
                     then valor_if (IF a1 c1 c2) ent&lt;br /&gt;
                     else valor_if (IF a2 c1 c2) ent)&amp;quot; &lt;br /&gt;
      by (simp only: HI1 HI2)&lt;br /&gt;
    also have &amp;quot;… = valor_if (IF a (IF a1 c1 c2) (IF a2 c1 c2)) ent&amp;quot;&lt;br /&gt;
      by (simp only: valor_if.simps(3))&lt;br /&gt;
    also have &amp;quot;… = valor_if (IF (IF a a1 a2) c1 c2) ent&amp;quot; &lt;br /&gt;
      by (simp only: valor_if_IF)    &lt;br /&gt;
    finally show ?thesis &lt;br /&gt;
      by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración aplicativa detallada de valor_if_normalAux›  &lt;br /&gt;
  lemma valor_if_normalAux_aplicativo:&lt;br /&gt;
  &amp;quot;∀e1 e2. valor_if (normalAux e e1 e2) ent = valor_if (IF e e1 e2) ent&amp;quot;&lt;br /&gt;
  apply (induct e)&lt;br /&gt;
    apply (rule allI)+&lt;br /&gt;
    apply (simp only: normalAux.simps(1))&lt;br /&gt;
   apply (rule allI)+&lt;br /&gt;
   apply (simp only: normalAux.simps(2))&lt;br /&gt;
  apply (rule allI)+&lt;br /&gt;
  apply (simp only: normalAux.simps(3))&lt;br /&gt;
  apply (simp only: valor_if.simps(3))&lt;br /&gt;
  apply (case_tac &amp;quot;valor_if e1 ent&amp;quot;)&lt;br /&gt;
   apply (simp only: if_True)&lt;br /&gt;
  apply (simp only: if_False)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostraciones del teorema valor_if_normal›&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración estructurada del teorema valor_if_normal›&lt;br /&gt;
theorem valor_if_normal_E:&lt;br /&gt;
  &amp;quot;valor_if (normal b) ent = valor_if b ent&amp;quot;&lt;br /&gt;
proof (induct b)&lt;br /&gt;
  case (CIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (VIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (IF b1 b2 b3)&lt;br /&gt;
  then show ?case by (simp add: valor_if_normalAux)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración automática del teorema valor_if_normal›&lt;br /&gt;
theorem valor_if_normal_A:&lt;br /&gt;
  &amp;quot;valor_if (normal b) ent = valor_if b ent&amp;quot;&lt;br /&gt;
  by (induct b) (simp_all add: valor_if_normalAux)&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración declarativa detallada del teorema valor_if_normal›&lt;br /&gt;
theorem valor_if_normal: &lt;br /&gt;
  &amp;quot;valor_if (normal b) ent = valor_if b ent&amp;quot;&lt;br /&gt;
proof (induct b)&lt;br /&gt;
  fix b&lt;br /&gt;
  show &amp;quot;valor_if (normal (CIF b)) ent = valor_if (CIF b) ent&amp;quot;&lt;br /&gt;
    by (simp only: normal.simps(1) valor_if.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  show &amp;quot;valor_if (normal (VIF n)) ent = valor_if (VIF n) ent&amp;quot; &lt;br /&gt;
    by (simp only: normal.simps(2) valor_if.simps(2))&lt;br /&gt;
next&lt;br /&gt;
  fix e e1 e2&lt;br /&gt;
  assume HI:  &amp;quot;valor_if (normal e) ent = valor_if e ent&amp;quot; and&lt;br /&gt;
         HI1: &amp;quot;valor_if (normal e1) ent = valor_if e1 ent&amp;quot; and&lt;br /&gt;
         HI2: &amp;quot;valor_if (normal e2) ent = valor_if e2 ent&amp;quot;&lt;br /&gt;
  show &amp;quot;valor_if (normal (IF e e1 e2)) ent = &lt;br /&gt;
        valor_if (IF e e1 e2) ent&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;valor_if (normal (IF e e1 e2)) ent = &lt;br /&gt;
          valor_if (normalAux e (normal e1) (normal e2)) ent&amp;quot; &lt;br /&gt;
      by (simp only: normal.simps(3))&lt;br /&gt;
    also have &amp;quot;… = valor_if (IF e (normal e1) (normal e2)) ent&amp;quot; &lt;br /&gt;
      by (simp only: valor_if_normalAux)&lt;br /&gt;
    also have &amp;quot;… = (if (valor_if e ent) &lt;br /&gt;
                     then (valor_if (normal e1) ent) &lt;br /&gt;
                     else (valor_if (normal e2) ent))&amp;quot; &lt;br /&gt;
      by (simp only: valor_if.simps(3))&lt;br /&gt;
    also have &amp;quot;… = (if (valor_if e ent) &lt;br /&gt;
                     then (valor_if e1 ent) &lt;br /&gt;
                     else (valor_if e2 ent))&amp;quot; &lt;br /&gt;
      by (simp only: HI1 HI2)&lt;br /&gt;
    also have &amp;quot;… = valor_if (IF e e1 e2) ent&amp;quot; &lt;br /&gt;
      by (simp only: valor_if.simps(3))&lt;br /&gt;
    finally show ?thesis &lt;br /&gt;
      by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración aplicativa detallada del teorema valor_if_normal›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_normal_aplicativo:&lt;br /&gt;
  &amp;quot;valor_if (normal b) ent = valor_if b ent&amp;quot;&lt;br /&gt;
  apply (induct b)&lt;br /&gt;
  apply (simp only: normal.simps(1))&lt;br /&gt;
   apply (simp only: normal.simps(2))&lt;br /&gt;
  apply (simp only: normal.simps(3))&lt;br /&gt;
  apply (simp only: valor_if_normalAux_aplicativo)&lt;br /&gt;
  apply (simp only: valor_if.simps(3))&lt;br /&gt;
  done &lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 9. Demostrar que para toda expresión if e, (normal e) está&lt;br /&gt;
  en forma normal.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Lema auxiliar es_normal_normalAux›&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración estructurada de es_normal_normalAux›&lt;br /&gt;
lemma es_normal_normalAux_E:&lt;br /&gt;
  &amp;quot;es_normal (normalAux e e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
proof (induct e arbitrary: e1 e2)&lt;br /&gt;
  case (CIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (VIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (IF e1 e2 e3)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración automática de es_normal_normalAux›&lt;br /&gt;
lemma es_normal_normalAux_A:&lt;br /&gt;
  &amp;quot;es_normal (normalAux e e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
  by (induct e arbitrary: e1 e2) simp_all&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración declarativa detallada de es_normal_normalAux›&lt;br /&gt;
lemma es_normal_normalAux:&lt;br /&gt;
  &amp;quot;es_normal (normalAux e e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
proof (induct e arbitrary: e1 e2)&lt;br /&gt;
  fix b e1 e2&lt;br /&gt;
  have &amp;quot;es_normal (normalAux (CIF b) e1 e2) = &lt;br /&gt;
        es_normal (IF (CIF b) e1 e2)&amp;quot;&lt;br /&gt;
    by (simp only: normalAux.simps(1))&lt;br /&gt;
  also have &amp;quot;… =  (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
    by (simp only: es_normal.simps(3))&lt;br /&gt;
  finally show &amp;quot;es_normal (normalAux (CIF b) e1 e2) =&lt;br /&gt;
                (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
    by this &lt;br /&gt;
next&lt;br /&gt;
  fix n e1 e2&lt;br /&gt;
  have &amp;quot;es_normal (normalAux (VIF n) e1 e2) = &lt;br /&gt;
        es_normal (IF (VIF n) e1 e2)&amp;quot;&lt;br /&gt;
    by (simp only: normalAux.simps(2))&lt;br /&gt;
  also have &amp;quot;… =  (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
    by (simp only: es_normal.simps(4))&lt;br /&gt;
  finally show &amp;quot;es_normal (normalAux (VIF n) e1 e2) =&lt;br /&gt;
                (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
    by this &lt;br /&gt;
next&lt;br /&gt;
  fix a a1 a2 e1 e2&lt;br /&gt;
  assume &lt;br /&gt;
    HI:  &amp;quot;⋀e1 e2. es_normal (normalAux a e1 e2) = &lt;br /&gt;
                  (es_normal e1 ∧ es_normal e2)&amp;quot; and&lt;br /&gt;
    HI1: &amp;quot;⋀e1 e2. es_normal (normalAux a1 e1 e2) = &lt;br /&gt;
                  (es_normal e1 ∧ es_normal e2)&amp;quot; and&lt;br /&gt;
    HI2: &amp;quot;⋀e1 e2. es_normal (normalAux a2 e1 e2) = &lt;br /&gt;
                  (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
  have &amp;quot;es_normal (normalAux (IF a a1 a2) e1 e2) = &lt;br /&gt;
        es_normal (normalAux a &lt;br /&gt;
                             (normalAux a1 e1 e2)&lt;br /&gt;
                             (normalAux a2 e1 e2))&amp;quot; &lt;br /&gt;
    by (simp only: normalAux.simps(3))&lt;br /&gt;
  also have &amp;quot;… = (es_normal (normalAux a1 e1 e2) ∧&lt;br /&gt;
                   es_normal (normalAux a2 e1 e2))&amp;quot;&lt;br /&gt;
    by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;… = ((es_normal e1 ∧ es_normal e2) ∧&lt;br /&gt;
                   (es_normal e1 ∧ es_normal e2))&amp;quot;&lt;br /&gt;
    by (simp only: HI1 HI2)&lt;br /&gt;
  also have &amp;quot;… = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
    by (simp only: conj_absorb)&lt;br /&gt;
  finally show &amp;quot;es_normal (normalAux (IF a a1 a2) e1 e2) = &lt;br /&gt;
               (es_normal e1 ∧ es_normal e2)&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
    qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración aplicativa detallada de es_normal_normalAux›&lt;br /&gt;
lemma es_normal_normalAux_aplicativa:&lt;br /&gt;
  &amp;quot;es_normal (normalAux e e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;    &lt;br /&gt;
  apply(induct e arbitrary: e1 e2)&lt;br /&gt;
  apply(simp only: normalAux.simps&lt;br /&gt;
                   es_normal.simps)+&lt;br /&gt;
  apply(rule iffI)&lt;br /&gt;
  apply(erule conjunct2)&lt;br /&gt;
  apply(rule conjI)&lt;br /&gt;
  apply assumption+&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostraciones del teorema es_normal_normal›&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración estructurada del teorema es_normal_normal›&lt;br /&gt;
theorem es_normal_normal_E: &lt;br /&gt;
  &amp;quot;es_normal (normal b)&amp;quot;&lt;br /&gt;
proof (induct b)&lt;br /&gt;
  case (CIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (VIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (IF b1 b2 b3)&lt;br /&gt;
  then show ?case by (simp add: es_normal_normalAux)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración automática del teorema es_normal_normal›&lt;br /&gt;
theorem es_normal_normal_A:&lt;br /&gt;
  &amp;quot;es_normal (normal b)&amp;quot;&lt;br /&gt;
  by (induct b) (simp_all add: es_normal_normalAux)&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración declarativa detallada del teorema &lt;br /&gt;
  es_normal_normal›&lt;br /&gt;
theorem es_normal_normal:&lt;br /&gt;
  &amp;quot;es_normal (normal b)&amp;quot;&lt;br /&gt;
proof (induct b)&lt;br /&gt;
  fix b&lt;br /&gt;
  show &amp;quot;es_normal (normal (CIF b))&amp;quot;&lt;br /&gt;
    by (simp only: normal.simps(1) es_normal.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  show &amp;quot;es_normal (normal (VIF n))&amp;quot; &lt;br /&gt;
    by (simp only: normal.simps(2) es_normal.simps(2))&lt;br /&gt;
next&lt;br /&gt;
  fix e e1 e2&lt;br /&gt;
  assume &amp;quot;es_normal (normal e)&amp;quot;&lt;br /&gt;
         &amp;quot;es_normal (normal e1)&amp;quot;&lt;br /&gt;
         &amp;quot;es_normal (normal e2)&amp;quot;&lt;br /&gt;
  then show &amp;quot;es_normal (normal (IF e e1 e2))&amp;quot; &lt;br /&gt;
    by (simp only: normal.simps(3) es_normal_normalAux)&lt;br /&gt;
    qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración aplicativa detallada del teorema &lt;br /&gt;
  es_normal_normal›&lt;br /&gt;
lemma es_normal_normal_aplicativa: &lt;br /&gt;
  &amp;quot;es_normal (normal b)&amp;quot;&lt;br /&gt;
  apply(induct b)&lt;br /&gt;
  apply(simp only: normal.simps(1))&lt;br /&gt;
  apply(simp only: es_normal.simps(1))&lt;br /&gt;
  apply(simp only: normal.simps(2))&lt;br /&gt;
  apply(simp only: es_normal.simps(2))&lt;br /&gt;
  apply(simp only: normal.simps)&lt;br /&gt;
  apply(simp only: es_normal_normalAux_aplicativa)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
section ‹Definición de bool2ifN›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 10. Definir la función&lt;br /&gt;
     bool2ifN :: exp_booleana ⇒ exp_if&lt;br /&gt;
  tal que (bool2ifN e) es una expresión if en forma normal equivalente a&lt;br /&gt;
  la expresión Booleana e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
definition bool2ifN :: &amp;quot;exp_booleana ⇒ exp_if&amp;quot; where&lt;br /&gt;
  &amp;quot;bool2ifN e ≡ normal (bool2if e)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
section ‹Lema es_normal_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 11. Demostrar que para toda expresión booleana e, &lt;br /&gt;
  (bool2ifN e) está en forma normal.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de es_normal_bool2ifN›&lt;br /&gt;
theorem es_normal_bool2ifN_A: &lt;br /&gt;
  &amp;quot;es_normal (bool2ifN e)&amp;quot;&lt;br /&gt;
   by (simp only:bool2ifN_def es_normal_normal) &lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración declarativa detallada de es_normal_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
lemma es_normal_bool2ifN: &lt;br /&gt;
  &amp;quot;es_normal (bool2ifN e)&amp;quot;&lt;br /&gt;
  proof-&lt;br /&gt;
  have &amp;quot;bool2ifN e = normal (bool2if e)&amp;quot; by (simp only:bool2ifN_def)&lt;br /&gt;
  then show &amp;quot;es_normal (bool2ifN e)&amp;quot; by &lt;br /&gt;
   (simp only:es_normal_normal) &lt;br /&gt;
  qed  &lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración aplicativa detallada de es_normal_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
lemma es_normal_bool2ifN_aplicativa: &lt;br /&gt;
  &amp;quot;es_normal (bool2ifN e)&amp;quot;  &lt;br /&gt;
  apply (simp only:bool2ifN_def)&lt;br /&gt;
  apply  (simp only:es_normal_normal) &lt;br /&gt;
  done&lt;br /&gt;
  &lt;br /&gt;
section ‹Lema valor_if_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 12. Demostrar que para toda expresión booleana e, &lt;br /&gt;
  (bool2ifN e) es equivalente a e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de valor_if_bool2ifN›&lt;br /&gt;
theorem valor_if_bool2ifN_A: &lt;br /&gt;
  &amp;quot;valor_if (bool2ifN e) ent = valor e ent&amp;quot;&lt;br /&gt;
    by (simp only: bool2ifN_def valor_if_bool2if valor_if_normal)&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración declarativa detallada de valor_if_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_bool2ifN:&lt;br /&gt;
  &amp;quot;valor_if (bool2ifN e) ent = valor e ent&amp;quot;&lt;br /&gt;
   proof-&lt;br /&gt;
   have &amp;quot;bool2ifN e ≡ normal (bool2if e)&amp;quot; by (simp only:bool2ifN_def)&lt;br /&gt;
   then have &amp;quot;valor_if (bool2ifN e) ent = &lt;br /&gt;
              valor_if (normal (bool2if e)) ent&amp;quot; by (simp only:)&lt;br /&gt;
    also have &amp;quot;… = valor_if (bool2if e) ent&amp;quot; &lt;br /&gt;
    by (simp only: valor_if_normal)&lt;br /&gt;
    also have &amp;quot;… = valor e ent&amp;quot; by (simp only:valor_if_bool2if)&lt;br /&gt;
    finally show  &amp;quot;valor_if (bool2ifN e) ent = valor e ent&amp;quot; by this&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración aplicativa detallada de valor_if_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_bool2ifN_aplicativa:&lt;br /&gt;
 &amp;quot;valor_if (bool2ifN e) ent = valor e ent&amp;quot;&lt;br /&gt;
 apply (simp only:bool2ifN_def)&lt;br /&gt;
 apply (simp only: valor_if_normal)&lt;br /&gt;
 apply  (simp only:valor_if_bool2if)&lt;br /&gt;
 done&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=TF_sol&amp;diff=1266</id>
		<title>TF sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=TF_sol&amp;diff=1266"/>
		<updated>2020-06-18T06:53:06Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con «&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt; chapter ‹Expresiones booleanas y expresiones condicionales›  theory Trabajo_final_sol imports Main  begin  section ‹Expresiones booleanas…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter ‹Expresiones booleanas y expresiones condicionales›&lt;br /&gt;
&lt;br /&gt;
theory Trabajo_final_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section ‹Expresiones booleanas›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 1. La expresiones booleanas se definen por&lt;br /&gt;
  * las constantes booleanas son expresiones,&lt;br /&gt;
  * las variables son expresiones,&lt;br /&gt;
  * Si e es una expresión, entonces ¬e también lo es.&lt;br /&gt;
  * Si e1 y e2 son expresiones, entonces e1 ∧ e2 también lo es.&lt;br /&gt;
&lt;br /&gt;
  Definir exp_booleana como el tipo de las expresiones booleanas.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
datatype exp_booleana = Const bool &lt;br /&gt;
                      | Var nat &lt;br /&gt;
                      | Neg exp_booleana&lt;br /&gt;
                      | And exp_booleana exp_booleana&lt;br /&gt;
&lt;br /&gt;
section ‹El valor de las expresiones boolenas›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 2. Una interpretación es una función i que asigna a cada&lt;br /&gt;
  número natural un booleano de forma que el valor de la variable&lt;br /&gt;
  &amp;#039;Var n&amp;#039; en la interpretación &amp;#039;i&amp;#039; es &amp;#039;i(n)&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     valor :: exp_booleana ⇒ (nat ⇒ bool) ⇒ bool&lt;br /&gt;
  tal que (valor e i) es el valor de la expresión booleana e en la&lt;br /&gt;
  interpretación i. Por ejemplo,&lt;br /&gt;
     value &amp;quot;(valor (Var 3) (λx. False)) &lt;br /&gt;
  es False&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun valor :: &amp;quot;exp_booleana ⇒ (nat ⇒ bool) ⇒ bool&amp;quot; where&lt;br /&gt;
   &amp;quot;valor (Const b) _   = b&amp;quot;&lt;br /&gt;
 | &amp;quot;valor (Var n) i     = i n &amp;quot;&lt;br /&gt;
 | &amp;quot;valor (Neg e) i     = (¬ (valor e i))&amp;quot;&lt;br /&gt;
 | &amp;quot;valor (And e1 e2) i = (valor e1 i ∧ valor e2 i)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
section ‹Expresiones If›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 3. La expresiones if se definen por&lt;br /&gt;
  * las constantes booleanas son expresiones,&lt;br /&gt;
  * las variables son expresiones,&lt;br /&gt;
  * Si e, e1 y e2 son expresiones, entonces (if e e1 e2) también lo es.&lt;br /&gt;
&lt;br /&gt;
  Definir exp_if como el tipo de las expresiones if.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
datatype exp_if = CIF bool &lt;br /&gt;
                | VIF nat &lt;br /&gt;
                | IF exp_if exp_if exp_if&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     valor_if :: exp_if ⇒ (nat ⇒ bool) ⇒ bool&lt;br /&gt;
  tal que (valor_if e i) es el valor de la expresión if e en la&lt;br /&gt;
  interpretación i.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun valor_if :: &amp;quot;exp_if ⇒ (nat ⇒ bool) ⇒ bool&amp;quot; where&lt;br /&gt;
   &amp;quot;valor_if (CIF b) _      = b&amp;quot;&lt;br /&gt;
 | &amp;quot;valor_if (VIF n) i      = i n&amp;quot;&lt;br /&gt;
 | &amp;quot;valor_if (IF e e1 e2) i = (if (valor_if e i) &lt;br /&gt;
                               then (valor_if e1 i) &lt;br /&gt;
                               else (valor_if e2 i))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
section ‹Transformación de expresiones booleanas en expresiones if›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Definición de bool2if›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     bool2if :: exp_booleana ⇒ exp_if&lt;br /&gt;
  tal que (bool2if e) es una expresión if equivalente a la expresión&lt;br /&gt;
  booleana e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun bool2if :: &amp;quot;exp_booleana ⇒ exp_if&amp;quot; where&lt;br /&gt;
   &amp;quot;bool2if (Const b)   = CIF b&amp;quot;&lt;br /&gt;
 | &amp;quot;bool2if (Var n)     = VIF n&amp;quot;&lt;br /&gt;
 | &amp;quot;bool2if (Neg e)     = IF (bool2if e) (CIF False) (CIF True)&amp;quot;&lt;br /&gt;
 | &amp;quot;bool2if (And e1 e2) = IF (bool2if e1) (bool2if e2) (CIF False)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 6. Demostrar que para cualquier expresión boolena e, son&lt;br /&gt;
  equivalentes (bool2if e) y e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostraciones de valor_if_bool2if›&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración estructurada de valor_if_bool2if›&lt;br /&gt;
lemma valor_if_bool2if_E:&lt;br /&gt;
  &amp;quot;valor_if (bool2if e) ent = valor e ent&amp;quot;&lt;br /&gt;
proof (induct e)&lt;br /&gt;
  case (Const x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (Var x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (Neg e)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (And e1 e2)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración automática de valor_if_bool2if›&lt;br /&gt;
lemma valor_if_bool2if_A: &lt;br /&gt;
  &amp;quot;valor_if (bool2if e) ent = valor e ent&amp;quot;&lt;br /&gt;
  by (induct e) simp_all&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración declarativa detallada de valor_if_bool2if›&lt;br /&gt;
lemma valor_if_bool2if:&lt;br /&gt;
  &amp;quot;valor_if (bool2if e) ent = valor e ent&amp;quot;&lt;br /&gt;
proof (induct e)&lt;br /&gt;
  fix b&lt;br /&gt;
  have &amp;quot;valor_if (bool2if (Const b)) ent = valor_if (CIF b) ent&amp;quot;&lt;br /&gt;
    by (simp only: bool2if.simps(1))&lt;br /&gt;
  also have &amp;quot;… = b&amp;quot;&lt;br /&gt;
    by (simp only: valor_if.simps(1))&lt;br /&gt;
  also have &amp;quot;… = valor (Const b) ent&amp;quot;&lt;br /&gt;
    by (simp only: valor.simps(1))&lt;br /&gt;
  finally show &amp;quot;valor_if (bool2if (Const b)) ent = valor (Const b) ent&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  have &amp;quot;valor_if (bool2if (Var n)) ent = valor_if (VIF n) ent&amp;quot;&lt;br /&gt;
    by (simp only: bool2if.simps(2))&lt;br /&gt;
  also have &amp;quot;… = ent n&amp;quot;&lt;br /&gt;
    by (simp only: valor_if.simps(2))&lt;br /&gt;
  also have &amp;quot;… = valor (Var n) ent&amp;quot;&lt;br /&gt;
    by (simp only: valor.simps(2))&lt;br /&gt;
  finally show &amp;quot;valor_if (bool2if (Var n)) ent = valor (Var n) ent&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
next&lt;br /&gt;
  fix e&lt;br /&gt;
  assume HI: &amp;quot;valor_if (bool2if e) ent = valor e ent&amp;quot;&lt;br /&gt;
  have &amp;quot;valor_if (bool2if (Neg e)) ent = &lt;br /&gt;
        valor_if (IF (bool2if e) (CIF False) (CIF True)) ent&amp;quot;&lt;br /&gt;
    by (simp only: bool2if.simps(3))&lt;br /&gt;
  also have &amp;quot;… = (if valor_if (bool2if e) ent &lt;br /&gt;
                   then valor_if (CIF False) ent&lt;br /&gt;
                   else valor_if (CIF True) ent)&amp;quot;&lt;br /&gt;
    by (simp only: valor_if.simps(3))&lt;br /&gt;
  also have &amp;quot;… = (if valor e ent &lt;br /&gt;
                   then False&lt;br /&gt;
                   else True)&amp;quot;&lt;br /&gt;
    by (simp only: HI valor_if.simps(1))&lt;br /&gt;
    also have &amp;quot;… = (¬ valor e ent)&amp;quot; &lt;br /&gt;
    by (rule SMT.z3_rule(52))&lt;br /&gt;
  also have &amp;quot;… = valor (Neg e) ent&amp;quot;&lt;br /&gt;
    by (simp only: valor.simps(3))&lt;br /&gt;
  finally show &amp;quot;valor_if (bool2if (Neg e)) ent = valor (Neg e) ent&amp;quot;&lt;br /&gt;
    by this&lt;br /&gt;
next&lt;br /&gt;
  fix e1 e2&lt;br /&gt;
  assume HI1: &amp;quot;valor_if (bool2if e1) ent = valor e1 ent&amp;quot; and&lt;br /&gt;
         HI2: &amp;quot;valor_if (bool2if e2) ent = valor e2 ent&amp;quot;&lt;br /&gt;
  have &amp;quot;valor_if (bool2if (And e1 e2)) ent = &lt;br /&gt;
        valor_if (IF (bool2if e1) (bool2if e2) (CIF False)) ent&amp;quot;&lt;br /&gt;
    by (simp only: bool2if.simps(4))&lt;br /&gt;
  also have &amp;quot;… = (if valor_if (bool2if e1) ent &lt;br /&gt;
                   then valor_if (bool2if e2) ent&lt;br /&gt;
                   else valor_if (CIF False) ent)&amp;quot;&lt;br /&gt;
    by (simp only: valor_if.simps(3))&lt;br /&gt;
  also have &amp;quot;… = (if valor e1 ent &lt;br /&gt;
                   then valor e2 ent&lt;br /&gt;
                   else False)&amp;quot;&lt;br /&gt;
    by (simp only: HI1 HI2 valor_if.simps(1))&lt;br /&gt;
  also have &amp;quot;… = ((valor e1 ent ∧ valor e2 ent) ∨&lt;br /&gt;
                   (¬(valor e1 ent) ∧ False))&amp;quot;&lt;br /&gt;
    by (rule if_bool_eq_disj)&lt;br /&gt;
    also have &amp;quot;… = ((valor e1 ent ∧ valor e2 ent) ∨ False)&amp;quot;&lt;br /&gt;
    by (simp only: simp_thms(23))&lt;br /&gt;
  also have &amp;quot;… = (valor e1 ent ∧ valor e2 ent)&amp;quot;&lt;br /&gt;
    by (simp only: simp_thms(31))&lt;br /&gt;
  also have &amp;quot;… = valor (And e1 e2) ent&amp;quot;&lt;br /&gt;
    by (simp only: valor.simps(4))&lt;br /&gt;
  finally show &amp;quot;valor_if (bool2if (And e1 e2)) ent = &lt;br /&gt;
                valor (And e1 e2) ent&amp;quot;&lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración aplicativa detallada de valor_if_bool2if›&lt;br /&gt;
lemma valor_if_bool2if_aplicativa:&lt;br /&gt;
  &amp;quot;valor_if (bool2if e) ent = valor e ent&amp;quot;&lt;br /&gt;
  apply(induct e)&lt;br /&gt;
  apply(simp only: bool2if.simps&lt;br /&gt;
                   valor_if.simps&lt;br /&gt;
                   valor.simps)&lt;br /&gt;
  apply(simp only: bool2if.simps&lt;br /&gt;
                   valor_if.simps&lt;br /&gt;
                   valor.simps)&lt;br /&gt;
  apply(simp only: bool2if.simps)&lt;br /&gt;
  apply(simp only: valor_if.simps)&lt;br /&gt;
  apply(simp only: valor.simps)&lt;br /&gt;
  apply(split if_split)&lt;br /&gt;
  apply(rule conjI)&lt;br /&gt;
  apply(rule impI)&lt;br /&gt;
  apply(rule iffI)&lt;br /&gt;
  apply(rule ccontr, assumption)&lt;br /&gt;
  apply(erule notE, assumption)&lt;br /&gt;
  apply(rule impI)&lt;br /&gt;
  apply(rule iffI, assumption)&lt;br /&gt;
  apply(simp only: TrueI)&lt;br /&gt;
  apply(simp only: bool2if.simps)&lt;br /&gt;
  apply(simp only: valor_if.simps)&lt;br /&gt;
  apply(simp only: valor.simps)&lt;br /&gt;
  apply(split if_split)&lt;br /&gt;
  apply(rule conjI)&lt;br /&gt;
  apply(rule impI)&lt;br /&gt;
  apply(rule iffI)&lt;br /&gt;
  apply(erule conjI, assumption)&lt;br /&gt;
  apply(erule conjunct2)&lt;br /&gt;
  apply(rule impI)&lt;br /&gt;
  apply(rule iffI)&lt;br /&gt;
  apply (rule FalseE, assumption)&lt;br /&gt;
  apply(erule notE)&lt;br /&gt;
  apply(erule conjunct1)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
section ‹Formas normales›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Definición de es_normal›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 6. Un expresión if, e, está en forma normal si para cada&lt;br /&gt;
  subexpresión de e de la forma (if c e1 e2) se tiene que c es una&lt;br /&gt;
  constante o una variable.&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     es_normal :: exp_if ⇒ bool&lt;br /&gt;
  tal que (es_normal e) se verifica si e está en forma normal.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun es_normal :: &amp;quot;exp_if ⇒ bool&amp;quot; where&lt;br /&gt;
   &amp;quot;es_normal (CIF _)            = True&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal (VIF _)            = True&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal (IF (CIF _) e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal (IF (VIF _) e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal _                  = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
subsection ‹Definición de normal›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     normal :: exp_if ⇒ exp_if&lt;br /&gt;
  tal que (normal e) es una expresión if en forma normal equivalente a&lt;br /&gt;
  la expresión e.&lt;br /&gt;
  --------------------------------------------------------------------- ›&lt;br /&gt;
&lt;br /&gt;
fun normalAux :: &amp;quot;exp_if ⇒ exp_if ⇒ exp_if ⇒ exp_if&amp;quot; where&lt;br /&gt;
   &amp;quot;normalAux (CIF b) e1 e2 = IF (CIF b) e1 e2&amp;quot;&lt;br /&gt;
 | &amp;quot;normalAux (VIF n) e1 e2 = IF (VIF n) e1 e2&amp;quot;&lt;br /&gt;
 | &amp;quot;normalAux (IF a a1 a2) e1 e2 = &lt;br /&gt;
      normalAux a (normalAux a1 e1 e2) (normalAux a2 e1 e2)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun normal :: &amp;quot;exp_if ⇒ exp_if&amp;quot; where&lt;br /&gt;
   &amp;quot;normal (CIF b)      = CIF b&amp;quot;&lt;br /&gt;
 | &amp;quot;normal (VIF n)      = VIF n&amp;quot;&lt;br /&gt;
 | &amp;quot;normal (IF e e1 e2) = normalAux e (normal e1) (normal e2)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
section ‹Corrección de la normalización›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 8. Demostrar que la forma normal de una expresión if es&lt;br /&gt;
  equivalente a la expresión; es decir,  &lt;br /&gt;
     valor_if (normal e) i = valor_if e i&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Lema auxiliar valor_if_normalAux›&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración estructurada de valor_if_normalAux›&lt;br /&gt;
lemma valor_if_normalAux_E:&lt;br /&gt;
  &amp;quot;valor_if (normalAux e e1 e2) ent = valor_if (IF e e1 e2) ent&amp;quot;&lt;br /&gt;
proof (induct e arbitrary: e1 e2)&lt;br /&gt;
  case (CIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (VIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (IF e1 e2 e3)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración automática de valor_if_normalAux›&lt;br /&gt;
lemma valor_if_normalAux_A: &lt;br /&gt;
  &amp;quot;valor_if (normalAux e e1 e2) ent = valor_if (IF e e1 e2) ent&amp;quot;&lt;br /&gt;
  by (induct e arbitrary: e1 e2) simp_all&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración declarativa detallada de valor_if_normalAux›&lt;br /&gt;
&lt;br /&gt;
lemma if_if:&lt;br /&gt;
  fixes A and A1 and A2 and C1 and C2 :: bool&lt;br /&gt;
  shows&lt;br /&gt;
  &amp;quot;(if A&lt;br /&gt;
    then (if A1 then C1 else C2)&lt;br /&gt;
    else (if A2 then C1 else C2)) =&lt;br /&gt;
   (if (if A then A1 else A2)&lt;br /&gt;
    then C1&lt;br /&gt;
    else C2)&amp;quot;  &lt;br /&gt;
  by (cases A; cases A1; cases A2) &lt;br /&gt;
     (simp_all only: if_True if_False)&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_IF:&lt;br /&gt;
  &amp;quot;valor_if (IF a (IF a1 c1 c2) (IF a2 c1 c2)) ent =&lt;br /&gt;
   valor_if (IF (IF a a1 a2) c1 c2) ent&amp;quot;&lt;br /&gt;
  by (simp only: valor_if.simps(3) if_if)&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_normalAux: &lt;br /&gt;
  &amp;quot;valor_if (normalAux e e1 e2) ent = valor_if (IF e e1 e2) ent&amp;quot;&lt;br /&gt;
proof (induct e arbitrary: e1 e2)&lt;br /&gt;
  fix b e1 e2&lt;br /&gt;
  show &amp;quot;valor_if (normalAux (CIF b) e1 e2) ent = &lt;br /&gt;
        valor_if (IF (CIF b) e1 e2) ent&amp;quot;  &lt;br /&gt;
    by (simp only: normalAux.simps(1)) &lt;br /&gt;
next&lt;br /&gt;
  fix n e1 e2&lt;br /&gt;
  show &amp;quot;valor_if (normalAux (VIF n) e1 e2) ent = &lt;br /&gt;
        valor_if (IF (VIF n) e1 e2) ent&amp;quot; &lt;br /&gt;
    by (simp only: normalAux.simps(2)) &lt;br /&gt;
next&lt;br /&gt;
  fix a a1 a2 c1 c2&lt;br /&gt;
  assume HI:  &amp;quot;⋀e1 e2. valor_if (normalAux a e1 e2) ent = &lt;br /&gt;
                        valor_if (IF a e1 e2) ent&amp;quot; and&lt;br /&gt;
         HI1: &amp;quot;⋀e1 e2. valor_if (normalAux a1 e1 e2) ent = &lt;br /&gt;
                        valor_if (IF a1 e1 e2) ent&amp;quot; and&lt;br /&gt;
         HI2: &amp;quot;⋀e1 e2. valor_if (normalAux a2 e1 e2) ent = &lt;br /&gt;
                        valor_if (IF a2 e1 e2) ent&amp;quot;&lt;br /&gt;
  show &amp;quot;valor_if (normalAux (IF a a1 a2) c1 c2) ent =&lt;br /&gt;
        valor_if (IF (IF a a1 a2) c1 c2) ent&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;valor_if (normalAux (IF a a1 a2) c1 c2) ent =&lt;br /&gt;
          valor_if (normalAux a &lt;br /&gt;
                              (normalAux a1 c1 c2) &lt;br /&gt;
                              (normalAux a2 c1 c2)) ent&amp;quot; &lt;br /&gt;
      by (simp only: normalAux.simps(3))&lt;br /&gt;
    also have &amp;quot;… = valor_if (IF a &lt;br /&gt;
                                 (normalAux a1 c1 c2) &lt;br /&gt;
                                 (normalAux a2 c1 c2)) ent&amp;quot; &lt;br /&gt;
      by (simp only: HI)&lt;br /&gt;
    also have &amp;quot;… = (if valor_if a ent &lt;br /&gt;
                     then valor_if (normalAux a1 c1 c2) ent&lt;br /&gt;
                     else valor_if (normalAux a2 c1 c2) ent)&amp;quot; &lt;br /&gt;
      by (simp only: valor_if.simps(3))&lt;br /&gt;
    also have &amp;quot;… = (if valor_if a ent&lt;br /&gt;
                     then valor_if (IF a1 c1 c2) ent&lt;br /&gt;
                     else valor_if (IF a2 c1 c2) ent)&amp;quot; &lt;br /&gt;
      by (simp only: HI1 HI2)&lt;br /&gt;
    also have &amp;quot;… = valor_if (IF a (IF a1 c1 c2) (IF a2 c1 c2)) ent&amp;quot;&lt;br /&gt;
      by (simp only: valor_if.simps(3))&lt;br /&gt;
    also have &amp;quot;… = valor_if (IF (IF a a1 a2) c1 c2) ent&amp;quot; &lt;br /&gt;
      by (simp only: valor_if_IF)    &lt;br /&gt;
    finally show ?thesis &lt;br /&gt;
      by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración aplicativa detallada de valor_if_normalAux›  &lt;br /&gt;
  lemma valor_if_normalAux_aplicativo:&lt;br /&gt;
  &amp;quot;∀e1 e2. valor_if (normalAux e e1 e2) ent = valor_if (IF e e1 e2) ent&amp;quot;&lt;br /&gt;
  apply (induct e)&lt;br /&gt;
    apply (rule allI)+&lt;br /&gt;
    apply (simp only: normalAux.simps(1))&lt;br /&gt;
   apply (rule allI)+&lt;br /&gt;
   apply (simp only: normalAux.simps(2))&lt;br /&gt;
  apply (rule allI)+&lt;br /&gt;
  apply (simp only: normalAux.simps(3))&lt;br /&gt;
  apply (simp only: valor_if.simps(3))&lt;br /&gt;
  apply (case_tac &amp;quot;valor_if e1 ent&amp;quot;)&lt;br /&gt;
   apply (simp only: if_True)&lt;br /&gt;
  apply (simp only: if_False)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostraciones del teorema valor_if_normal›&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración estructurada del teorema valor_if_normal›&lt;br /&gt;
theorem valor_if_normal_E:&lt;br /&gt;
  &amp;quot;valor_if (normal b) ent = valor_if b ent&amp;quot;&lt;br /&gt;
proof (induct b)&lt;br /&gt;
  case (CIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (VIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (IF b1 b2 b3)&lt;br /&gt;
  then show ?case by (simp add: valor_if_normalAux)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración automática del teorema valor_if_normal›&lt;br /&gt;
theorem valor_if_normal_A:&lt;br /&gt;
  &amp;quot;valor_if (normal b) ent = valor_if b ent&amp;quot;&lt;br /&gt;
  by (induct b) (simp_all add: valor_if_normalAux)&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración declarativa detallada del teorema valor_if_normal›&lt;br /&gt;
theorem valor_if_normal: &lt;br /&gt;
  &amp;quot;valor_if (normal b) ent = valor_if b ent&amp;quot;&lt;br /&gt;
proof (induct b)&lt;br /&gt;
  fix b&lt;br /&gt;
  show &amp;quot;valor_if (normal (CIF b)) ent = valor_if (CIF b) ent&amp;quot;&lt;br /&gt;
    by (simp only: normal.simps(1) valor_if.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  show &amp;quot;valor_if (normal (VIF n)) ent = valor_if (VIF n) ent&amp;quot; &lt;br /&gt;
    by (simp only: normal.simps(2) valor_if.simps(2))&lt;br /&gt;
next&lt;br /&gt;
  fix e e1 e2&lt;br /&gt;
  assume HI:  &amp;quot;valor_if (normal e) ent = valor_if e ent&amp;quot; and&lt;br /&gt;
         HI1: &amp;quot;valor_if (normal e1) ent = valor_if e1 ent&amp;quot; and&lt;br /&gt;
         HI2: &amp;quot;valor_if (normal e2) ent = valor_if e2 ent&amp;quot;&lt;br /&gt;
  show &amp;quot;valor_if (normal (IF e e1 e2)) ent = &lt;br /&gt;
        valor_if (IF e e1 e2) ent&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;valor_if (normal (IF e e1 e2)) ent = &lt;br /&gt;
          valor_if (normalAux e (normal e1) (normal e2)) ent&amp;quot; &lt;br /&gt;
      by (simp only: normal.simps(3))&lt;br /&gt;
    also have &amp;quot;… = valor_if (IF e (normal e1) (normal e2)) ent&amp;quot; &lt;br /&gt;
      by (simp only: valor_if_normalAux)&lt;br /&gt;
    also have &amp;quot;… = (if (valor_if e ent) &lt;br /&gt;
                     then (valor_if (normal e1) ent) &lt;br /&gt;
                     else (valor_if (normal e2) ent))&amp;quot; &lt;br /&gt;
      by (simp only: valor_if.simps(3))&lt;br /&gt;
    also have &amp;quot;… = (if (valor_if e ent) &lt;br /&gt;
                     then (valor_if e1 ent) &lt;br /&gt;
                     else (valor_if e2 ent))&amp;quot; &lt;br /&gt;
      by (simp only: HI1 HI2)&lt;br /&gt;
    also have &amp;quot;… = valor_if (IF e e1 e2) ent&amp;quot; &lt;br /&gt;
      by (simp only: valor_if.simps(3))&lt;br /&gt;
    finally show ?thesis &lt;br /&gt;
      by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración aplicativa detallada del teorema valor_if_normal›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_normal_aplicativo:&lt;br /&gt;
  &amp;quot;valor_if (normal b) ent = valor_if b ent&amp;quot;&lt;br /&gt;
  apply (induct b)&lt;br /&gt;
  apply (simp only: normal.simps(1))&lt;br /&gt;
   apply (simp only: normal.simps(2))&lt;br /&gt;
  apply (simp only: normal.simps(3))&lt;br /&gt;
  apply (simp only: valor_if_normalAux_aplicativo)&lt;br /&gt;
  apply (simp only: valor_if.simps(3))&lt;br /&gt;
  done &lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 9. Demostrar que para toda expresión if e, (normal e) está&lt;br /&gt;
  en forma normal.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Lema auxiliar es_normal_normalAux›&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración estructurada de es_normal_normalAux›&lt;br /&gt;
lemma es_normal_normalAux_E:&lt;br /&gt;
  &amp;quot;es_normal (normalAux e e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
proof (induct e arbitrary: e1 e2)&lt;br /&gt;
  case (CIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (VIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (IF e1 e2 e3)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración automática de es_normal_normalAux›&lt;br /&gt;
lemma es_normal_normalAux_A:&lt;br /&gt;
  &amp;quot;es_normal (normalAux e e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
  by (induct e arbitrary: e1 e2) simp_all&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración declarativa detallada de es_normal_normalAux›&lt;br /&gt;
lemma es_normal_normalAux:&lt;br /&gt;
  &amp;quot;es_normal (normalAux e e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
proof (induct e arbitrary: e1 e2)&lt;br /&gt;
  fix b e1 e2&lt;br /&gt;
  have &amp;quot;es_normal (normalAux (CIF b) e1 e2) = &lt;br /&gt;
        es_normal (IF (CIF b) e1 e2)&amp;quot;&lt;br /&gt;
    by (simp only: normalAux.simps(1))&lt;br /&gt;
  also have &amp;quot;… =  (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
    by (simp only: es_normal.simps(3))&lt;br /&gt;
  finally show &amp;quot;es_normal (normalAux (CIF b) e1 e2) =&lt;br /&gt;
                (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
    by this &lt;br /&gt;
next&lt;br /&gt;
  fix n e1 e2&lt;br /&gt;
  have &amp;quot;es_normal (normalAux (VIF n) e1 e2) = &lt;br /&gt;
        es_normal (IF (VIF n) e1 e2)&amp;quot;&lt;br /&gt;
    by (simp only: normalAux.simps(2))&lt;br /&gt;
  also have &amp;quot;… =  (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
    by (simp only: es_normal.simps(4))&lt;br /&gt;
  finally show &amp;quot;es_normal (normalAux (VIF n) e1 e2) =&lt;br /&gt;
                (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
    by this &lt;br /&gt;
next&lt;br /&gt;
  fix a a1 a2 e1 e2&lt;br /&gt;
  assume &lt;br /&gt;
    HI:  &amp;quot;⋀e1 e2. es_normal (normalAux a e1 e2) = &lt;br /&gt;
                  (es_normal e1 ∧ es_normal e2)&amp;quot; and&lt;br /&gt;
    HI1: &amp;quot;⋀e1 e2. es_normal (normalAux a1 e1 e2) = &lt;br /&gt;
                  (es_normal e1 ∧ es_normal e2)&amp;quot; and&lt;br /&gt;
    HI2: &amp;quot;⋀e1 e2. es_normal (normalAux a2 e1 e2) = &lt;br /&gt;
                  (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
  have &amp;quot;es_normal (normalAux (IF a a1 a2) e1 e2) = &lt;br /&gt;
        es_normal (normalAux a &lt;br /&gt;
                             (normalAux a1 e1 e2)&lt;br /&gt;
                             (normalAux a2 e1 e2))&amp;quot; &lt;br /&gt;
    by (simp only: normalAux.simps(3))&lt;br /&gt;
  also have &amp;quot;… = (es_normal (normalAux a1 e1 e2) ∧&lt;br /&gt;
                   es_normal (normalAux a2 e1 e2))&amp;quot;&lt;br /&gt;
    by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;… = ((es_normal e1 ∧ es_normal e2) ∧&lt;br /&gt;
                   (es_normal e1 ∧ es_normal e2))&amp;quot;&lt;br /&gt;
    by (simp only: HI1 HI2)&lt;br /&gt;
  also have &amp;quot;… = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
    by (simp only: conj_absorb)&lt;br /&gt;
  finally show &amp;quot;es_normal (normalAux (IF a a1 a2) e1 e2) = &lt;br /&gt;
               (es_normal e1 ∧ es_normal e2)&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
    qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración aplicativa detallada de es_normal_normalAux›&lt;br /&gt;
lemma es_normal_normalAux_aplicativa:&lt;br /&gt;
  &amp;quot;es_normal (normalAux e e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;    &lt;br /&gt;
  apply(induct e arbitrary: e1 e2)&lt;br /&gt;
  apply(simp only: normalAux.simps&lt;br /&gt;
                   es_normal.simps)+&lt;br /&gt;
  apply(rule iffI)&lt;br /&gt;
  apply(erule conjunct2)&lt;br /&gt;
  apply(rule conjI)&lt;br /&gt;
  apply assumption+&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostraciones del teorema es_normal_normal›&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración estructurada del teorema es_normal_normal›&lt;br /&gt;
theorem es_normal_normal_E: &lt;br /&gt;
  &amp;quot;es_normal (normal b)&amp;quot;&lt;br /&gt;
proof (induct b)&lt;br /&gt;
  case (CIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (VIF x)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (IF b1 b2 b3)&lt;br /&gt;
  then show ?case by (simp add: es_normal_normalAux)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración automática del teorema es_normal_normal›&lt;br /&gt;
theorem es_normal_normal_A:&lt;br /&gt;
  &amp;quot;es_normal (normal b)&amp;quot;&lt;br /&gt;
  by (induct b) (simp_all add: es_normal_normalAux)&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración declarativa detallada del teorema &lt;br /&gt;
  es_normal_normal›&lt;br /&gt;
theorem es_normal_normal:&lt;br /&gt;
  &amp;quot;es_normal (normal b)&amp;quot;&lt;br /&gt;
proof (induct b)&lt;br /&gt;
  fix b&lt;br /&gt;
  show &amp;quot;es_normal (normal (CIF b))&amp;quot;&lt;br /&gt;
    by (simp only: normal.simps(1) es_normal.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  show &amp;quot;es_normal (normal (VIF n))&amp;quot; &lt;br /&gt;
    by (simp only: normal.simps(2) es_normal.simps(2))&lt;br /&gt;
next&lt;br /&gt;
  fix e e1 e2&lt;br /&gt;
  assume &amp;quot;es_normal (normal e)&amp;quot;&lt;br /&gt;
         &amp;quot;es_normal (normal e1)&amp;quot;&lt;br /&gt;
         &amp;quot;es_normal (normal e2)&amp;quot;&lt;br /&gt;
  then show &amp;quot;es_normal (normal (IF e e1 e2))&amp;quot; &lt;br /&gt;
    by (simp only: normal.simps(3) es_normal_normalAux)&lt;br /&gt;
    qed&lt;br /&gt;
&lt;br /&gt;
subsubsection ‹Demostración aplicativa detallada del teorema &lt;br /&gt;
  es_normal_normal›&lt;br /&gt;
lemma es_normal_normal_aplicativa: &lt;br /&gt;
  &amp;quot;es_normal (normal b)&amp;quot;&lt;br /&gt;
  apply(induct b)&lt;br /&gt;
  apply(simp only: normal.simps(1))&lt;br /&gt;
  apply(simp only: es_normal.simps(1))&lt;br /&gt;
  apply(simp only: normal.simps(2))&lt;br /&gt;
  apply(simp only: es_normal.simps(2))&lt;br /&gt;
  apply(simp only: normal.simps)&lt;br /&gt;
  apply(simp only: es_normal_normalAux_aplicativa)&lt;br /&gt;
  done&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
section ‹Definición de bool2ifN›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 10. Definir la función&lt;br /&gt;
     bool2ifN :: exp_booleana ⇒ exp_if&lt;br /&gt;
  tal que (bool2ifN e) es una expresión if en forma normal equivalente a&lt;br /&gt;
  la expresión Booleana e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
definition bool2ifN :: &amp;quot;exp_booleana ⇒ exp_if&amp;quot; where&lt;br /&gt;
  &amp;quot;bool2ifN e ≡ normal (bool2if e)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
section ‹Lema es_normal_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 11. Demostrar que para toda expresión booleana e, &lt;br /&gt;
  (bool2ifN e) está en forma normal.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de es_normal_bool2ifN›&lt;br /&gt;
theorem es_normal_bool2ifN_A: &lt;br /&gt;
  &amp;quot;es_normal (bool2ifN e)&amp;quot;&lt;br /&gt;
   by (simp only:bool2ifN_def es_normal_normal) &lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración declarativa detallada de es_normal_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
lemma es_normal_bool2ifN: &lt;br /&gt;
  &amp;quot;es_normal (bool2ifN e)&amp;quot;&lt;br /&gt;
  proof-&lt;br /&gt;
  have &amp;quot;bool2ifN e = normal (bool2if e)&amp;quot; by (simp only:bool2ifN_def)&lt;br /&gt;
  then show &amp;quot;es_normal (bool2ifN e)&amp;quot; by &lt;br /&gt;
   (simp only:es_normal_normal) &lt;br /&gt;
  qed  &lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración aplicativa detallada de es_normal_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
lemma es_normal_bool2ifN_aplicativa: &lt;br /&gt;
  &amp;quot;es_normal (bool2ifN e)&amp;quot;  &lt;br /&gt;
  apply (simp only:bool2ifN_def)&lt;br /&gt;
  apply  (simp only:es_normal_normal) &lt;br /&gt;
  done&lt;br /&gt;
  &lt;br /&gt;
section ‹Lema valor_if_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 12. Demostrar que para toda expresión booleana e, &lt;br /&gt;
  (bool2ifN e) es equivalente a e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de valor_if_bool2ifN›&lt;br /&gt;
theorem valor_if_bool2ifN_A: &lt;br /&gt;
  &amp;quot;valor_if (bool2ifN e) ent = valor e ent&amp;quot;&lt;br /&gt;
    by (simp only: bool2ifN_def valor_if_bool2if valor_if_normal)&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración declarativa detallada de valor_if_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_bool2ifN:&lt;br /&gt;
  &amp;quot;valor_if (bool2ifN e) ent = valor e ent&amp;quot;&lt;br /&gt;
   proof-&lt;br /&gt;
   have &amp;quot;bool2ifN e ≡ normal (bool2if e)&amp;quot; by (simp only:bool2ifN_def)&lt;br /&gt;
   then have &amp;quot;valor_if (bool2ifN e) ent = &lt;br /&gt;
              valor_if (normal (bool2if e)) ent&amp;quot; by (simp only:)&lt;br /&gt;
    also have &amp;quot;… = valor_if (bool2if e) ent&amp;quot; &lt;br /&gt;
    by (simp only: valor_if_normal)&lt;br /&gt;
    also have &amp;quot;… = valor e ent&amp;quot; by (simp only:valor_if_bool2if)&lt;br /&gt;
    finally show  &amp;quot;valor_if (bool2ifN e) ent = valor e ent&amp;quot; by this&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración aplicativa detallada de valor_if_bool2ifN›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_bool2ifN_aplicativa:&lt;br /&gt;
 &amp;quot;valor_if (bool2ifN e) ent = valor e ent&amp;quot;&lt;br /&gt;
 apply (simp only:bool2ifN_def)&lt;br /&gt;
 apply (simp only: valor_if_normal)&lt;br /&gt;
 apply  (simp only:valor_if_bool2if)&lt;br /&gt;
 done&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=TF&amp;diff=1265</id>
		<title>TF</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=TF&amp;diff=1265"/>
		<updated>2020-06-18T06:52:23Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Protegió «TF» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter ‹Expresiones booleanas y expresiones condicionales›&lt;br /&gt;
&lt;br /&gt;
theory Trabajo_final&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹El objetivo del trabajo es demostrar las propiedades de los 5 &lt;br /&gt;
  ejercicios de la forma más detallada posible.›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Definición. La expresiones booleanas se definen por&lt;br /&gt;
  * las constantes booleanas son expresiones,&lt;br /&gt;
  * las variables son expresiones,&lt;br /&gt;
  * Si e es una expresión, entonces ¬e también lo es.&lt;br /&gt;
  * Si e1 y e2 son expresiones, entonces e1 ∧ e2 también lo es.&lt;br /&gt;
&lt;br /&gt;
  Definir exp_booleana como el tipo de las expresiones booleanas.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
datatype exp_booleana = Const bool &lt;br /&gt;
                      | Var nat &lt;br /&gt;
                      | Neg exp_booleana&lt;br /&gt;
                      | And exp_booleana exp_booleana&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Definición. Una interpretación es una función i que asigna a cada&lt;br /&gt;
  número natural un booleano de forma que el vlor de la variable&lt;br /&gt;
  &amp;#039;Var n&amp;#039; en la interpretación &amp;#039;i&amp;#039; es &amp;#039;i(n)&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     valor :: exp_booleana ⇒ (nat ⇒ bool) ⇒ bool&lt;br /&gt;
  tal que (valor e i) es el valor de la expresión booleana e en la&lt;br /&gt;
  interpretación i. Por ejemplo,&lt;br /&gt;
     value &amp;quot;(valor (Var 3) (λx. False)) &lt;br /&gt;
  es False&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun valor :: &amp;quot;exp_booleana ⇒ (nat ⇒ bool) ⇒ bool&amp;quot; where&lt;br /&gt;
   &amp;quot;valor (Const b) _   = b&amp;quot;&lt;br /&gt;
 | &amp;quot;valor (Var n) i     = i n &amp;quot;&lt;br /&gt;
 | &amp;quot;valor (Neg e) i     = (¬ (valor e i))&amp;quot;&lt;br /&gt;
 | &amp;quot;valor (And e1 e2) i = (valor e1 i ∧ valor e2 i)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Definición. La expresiones if se definen por&lt;br /&gt;
  * las constantes booleanas son expresiones,&lt;br /&gt;
  * las variables son expresiones,&lt;br /&gt;
  * Si e, e1 y e2 son expresiones, entonces (if e e1 e2) también lo es.&lt;br /&gt;
&lt;br /&gt;
  Definir exp_if como el tipo de las expresiones if.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
datatype exp_if = CIF bool &lt;br /&gt;
                | VIF nat &lt;br /&gt;
                | IF exp_if exp_if exp_if&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Definición. Definir la función&lt;br /&gt;
     valor_if :: exp_if ⇒ (nat ⇒ bool) ⇒ bool&lt;br /&gt;
  tal que (valor_if e i) es el valor de la expresión if e en la&lt;br /&gt;
  interpretación i.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun valor_if :: &amp;quot;exp_if ⇒ (nat ⇒ bool) ⇒ bool&amp;quot; where&lt;br /&gt;
   &amp;quot;valor_if (CIF b) _      = b&amp;quot;&lt;br /&gt;
 | &amp;quot;valor_if (VIF n) i      = i n&amp;quot;&lt;br /&gt;
 | &amp;quot;valor_if (IF e e1 e2) i = (if (valor_if e i) &lt;br /&gt;
                               then (valor_if e1 i) &lt;br /&gt;
                               else (valor_if e2 i))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Definición. Definir la función&lt;br /&gt;
     bool2if :: exp_booleana ⇒ exp_if&lt;br /&gt;
  tal que (bool2if e) es una expresión if equivalente a la expresión&lt;br /&gt;
  booleana e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun bool2if :: &amp;quot;exp_booleana ⇒ exp_if&amp;quot; where&lt;br /&gt;
   &amp;quot;bool2if (Const b)   = CIF b&amp;quot;&lt;br /&gt;
 | &amp;quot;bool2if (Var n)     = VIF n&amp;quot;&lt;br /&gt;
 | &amp;quot;bool2if (Neg e)     = IF (bool2if e) (CIF False) (CIF True)&amp;quot;&lt;br /&gt;
 | &amp;quot;bool2if (And e1 e2) = IF (bool2if e1) (bool2if e2) (CIF False)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 1. Demostrar que para cualquier expresión boolena e, son&lt;br /&gt;
  equivalentes (bool2if e) y e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_bool2if:&lt;br /&gt;
  &amp;quot;valor_if (bool2if e) ent = valor e ent&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Definición. Un expresión if, e, está en forma normal si para cada&lt;br /&gt;
  subexpresión de e de la forma (if c e1 e2) se tiene que c es una&lt;br /&gt;
  constante o una variable.&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     es_normal :: exp_if ⇒ bool&lt;br /&gt;
  tal que (es_normal e) se verifica si e está en forma normal.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun es_normal :: &amp;quot;exp_if ⇒ bool&amp;quot; where&lt;br /&gt;
   &amp;quot;es_normal (CIF _)            = True&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal (VIF _)            = True&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal (IF (CIF _) e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal (IF (VIF _) e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal _                  = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Definición. Definir la función&lt;br /&gt;
     normal :: exp_if ⇒ exp_if&lt;br /&gt;
  tal que (normal e) es una expresión if en forma normal equivalente a&lt;br /&gt;
  la expresión e.&lt;br /&gt;
  --------------------------------------------------------------------- ›&lt;br /&gt;
&lt;br /&gt;
fun normalAux :: &amp;quot;exp_if ⇒ exp_if ⇒ exp_if ⇒ exp_if&amp;quot; where&lt;br /&gt;
   &amp;quot;normalAux (CIF b) e1 e2 = IF (CIF b) e1 e2&amp;quot;&lt;br /&gt;
 | &amp;quot;normalAux (VIF n) e1 e2 = IF (VIF n) e1 e2&amp;quot;&lt;br /&gt;
 | &amp;quot;normalAux (IF a a1 a2) e1 e2 = &lt;br /&gt;
      normalAux a (normalAux a1 e1 e2) (normalAux a2 e1 e2)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun normal :: &amp;quot;exp_if ⇒ exp_if&amp;quot; where&lt;br /&gt;
   &amp;quot;normal (CIF b)      = CIF b&amp;quot;&lt;br /&gt;
 | &amp;quot;normal (VIF n)      = VIF n&amp;quot;&lt;br /&gt;
 | &amp;quot;normal (IF e e1 e2) = normalAux e (normal e1) (normal e2)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Demostrar que la forma normal de una expresión if es&lt;br /&gt;
  equivalente a la expresión; es decir,  &lt;br /&gt;
     valor_if (normal e) i = valor_if e i&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_normal:&lt;br /&gt;
  &amp;quot;valor_if (normal b) ent = valor_if b ent&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 3. Demostrar que para toda expresión if e, (normal e) está&lt;br /&gt;
  en forma normal.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
lemma es_normal_normal: &lt;br /&gt;
  &amp;quot;es_normal (normal b)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Definición. Definir la función&lt;br /&gt;
     bool2ifN :: exp_booleana ⇒ exp_if&lt;br /&gt;
  tal que (bool2ifN e) es una expresión if en forma normal equivalente a&lt;br /&gt;
  la expresión Booleana e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
definition bool2ifN :: &amp;quot;exp_booleana ⇒ exp_if&amp;quot; where&lt;br /&gt;
  &amp;quot;bool2ifN e ≡ normal (bool2if e)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 4. Demostrar que para toda expresión booleana e, &lt;br /&gt;
  (bool2ifN e) está en forma normal.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
lemma es_normal_bool2ifN: &lt;br /&gt;
  &amp;quot;es_normal (bool2ifN e)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 5. Demostrar que para toda expresión booleana e, &lt;br /&gt;
  (bool2ifN e) es equivalente a e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_bool2ifN: &lt;br /&gt;
  &amp;quot;valor_if (bool2ifN e) ent = valor e ent&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=TF&amp;diff=1264</id>
		<title>TF</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=TF&amp;diff=1264"/>
		<updated>2020-06-18T06:52:13Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con «&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt; chapter ‹Expresiones booleanas y expresiones condicionales›  theory Trabajo_final imports Main  begin  text ‹El objetivo del trabajo es dem…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter ‹Expresiones booleanas y expresiones condicionales›&lt;br /&gt;
&lt;br /&gt;
theory Trabajo_final&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹El objetivo del trabajo es demostrar las propiedades de los 5 &lt;br /&gt;
  ejercicios de la forma más detallada posible.›&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Definición. La expresiones booleanas se definen por&lt;br /&gt;
  * las constantes booleanas son expresiones,&lt;br /&gt;
  * las variables son expresiones,&lt;br /&gt;
  * Si e es una expresión, entonces ¬e también lo es.&lt;br /&gt;
  * Si e1 y e2 son expresiones, entonces e1 ∧ e2 también lo es.&lt;br /&gt;
&lt;br /&gt;
  Definir exp_booleana como el tipo de las expresiones booleanas.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
datatype exp_booleana = Const bool &lt;br /&gt;
                      | Var nat &lt;br /&gt;
                      | Neg exp_booleana&lt;br /&gt;
                      | And exp_booleana exp_booleana&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Definición. Una interpretación es una función i que asigna a cada&lt;br /&gt;
  número natural un booleano de forma que el vlor de la variable&lt;br /&gt;
  &amp;#039;Var n&amp;#039; en la interpretación &amp;#039;i&amp;#039; es &amp;#039;i(n)&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     valor :: exp_booleana ⇒ (nat ⇒ bool) ⇒ bool&lt;br /&gt;
  tal que (valor e i) es el valor de la expresión booleana e en la&lt;br /&gt;
  interpretación i. Por ejemplo,&lt;br /&gt;
     value &amp;quot;(valor (Var 3) (λx. False)) &lt;br /&gt;
  es False&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun valor :: &amp;quot;exp_booleana ⇒ (nat ⇒ bool) ⇒ bool&amp;quot; where&lt;br /&gt;
   &amp;quot;valor (Const b) _   = b&amp;quot;&lt;br /&gt;
 | &amp;quot;valor (Var n) i     = i n &amp;quot;&lt;br /&gt;
 | &amp;quot;valor (Neg e) i     = (¬ (valor e i))&amp;quot;&lt;br /&gt;
 | &amp;quot;valor (And e1 e2) i = (valor e1 i ∧ valor e2 i)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Definición. La expresiones if se definen por&lt;br /&gt;
  * las constantes booleanas son expresiones,&lt;br /&gt;
  * las variables son expresiones,&lt;br /&gt;
  * Si e, e1 y e2 son expresiones, entonces (if e e1 e2) también lo es.&lt;br /&gt;
&lt;br /&gt;
  Definir exp_if como el tipo de las expresiones if.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
datatype exp_if = CIF bool &lt;br /&gt;
                | VIF nat &lt;br /&gt;
                | IF exp_if exp_if exp_if&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Definición. Definir la función&lt;br /&gt;
     valor_if :: exp_if ⇒ (nat ⇒ bool) ⇒ bool&lt;br /&gt;
  tal que (valor_if e i) es el valor de la expresión if e en la&lt;br /&gt;
  interpretación i.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun valor_if :: &amp;quot;exp_if ⇒ (nat ⇒ bool) ⇒ bool&amp;quot; where&lt;br /&gt;
   &amp;quot;valor_if (CIF b) _      = b&amp;quot;&lt;br /&gt;
 | &amp;quot;valor_if (VIF n) i      = i n&amp;quot;&lt;br /&gt;
 | &amp;quot;valor_if (IF e e1 e2) i = (if (valor_if e i) &lt;br /&gt;
                               then (valor_if e1 i) &lt;br /&gt;
                               else (valor_if e2 i))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Definición. Definir la función&lt;br /&gt;
     bool2if :: exp_booleana ⇒ exp_if&lt;br /&gt;
  tal que (bool2if e) es una expresión if equivalente a la expresión&lt;br /&gt;
  booleana e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun bool2if :: &amp;quot;exp_booleana ⇒ exp_if&amp;quot; where&lt;br /&gt;
   &amp;quot;bool2if (Const b)   = CIF b&amp;quot;&lt;br /&gt;
 | &amp;quot;bool2if (Var n)     = VIF n&amp;quot;&lt;br /&gt;
 | &amp;quot;bool2if (Neg e)     = IF (bool2if e) (CIF False) (CIF True)&amp;quot;&lt;br /&gt;
 | &amp;quot;bool2if (And e1 e2) = IF (bool2if e1) (bool2if e2) (CIF False)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 1. Demostrar que para cualquier expresión boolena e, son&lt;br /&gt;
  equivalentes (bool2if e) y e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_bool2if:&lt;br /&gt;
  &amp;quot;valor_if (bool2if e) ent = valor e ent&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Definición. Un expresión if, e, está en forma normal si para cada&lt;br /&gt;
  subexpresión de e de la forma (if c e1 e2) se tiene que c es una&lt;br /&gt;
  constante o una variable.&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     es_normal :: exp_if ⇒ bool&lt;br /&gt;
  tal que (es_normal e) se verifica si e está en forma normal.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun es_normal :: &amp;quot;exp_if ⇒ bool&amp;quot; where&lt;br /&gt;
   &amp;quot;es_normal (CIF _)            = True&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal (VIF _)            = True&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal (IF (CIF _) e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal (IF (VIF _) e1 e2) = (es_normal e1 ∧ es_normal e2)&amp;quot;&lt;br /&gt;
 | &amp;quot;es_normal _                  = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Definición. Definir la función&lt;br /&gt;
     normal :: exp_if ⇒ exp_if&lt;br /&gt;
  tal que (normal e) es una expresión if en forma normal equivalente a&lt;br /&gt;
  la expresión e.&lt;br /&gt;
  --------------------------------------------------------------------- ›&lt;br /&gt;
&lt;br /&gt;
fun normalAux :: &amp;quot;exp_if ⇒ exp_if ⇒ exp_if ⇒ exp_if&amp;quot; where&lt;br /&gt;
   &amp;quot;normalAux (CIF b) e1 e2 = IF (CIF b) e1 e2&amp;quot;&lt;br /&gt;
 | &amp;quot;normalAux (VIF n) e1 e2 = IF (VIF n) e1 e2&amp;quot;&lt;br /&gt;
 | &amp;quot;normalAux (IF a a1 a2) e1 e2 = &lt;br /&gt;
      normalAux a (normalAux a1 e1 e2) (normalAux a2 e1 e2)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun normal :: &amp;quot;exp_if ⇒ exp_if&amp;quot; where&lt;br /&gt;
   &amp;quot;normal (CIF b)      = CIF b&amp;quot;&lt;br /&gt;
 | &amp;quot;normal (VIF n)      = VIF n&amp;quot;&lt;br /&gt;
 | &amp;quot;normal (IF e e1 e2) = normalAux e (normal e1) (normal e2)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Demostrar que la forma normal de una expresión if es&lt;br /&gt;
  equivalente a la expresión; es decir,  &lt;br /&gt;
     valor_if (normal e) i = valor_if e i&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_normal:&lt;br /&gt;
  &amp;quot;valor_if (normal b) ent = valor_if b ent&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 3. Demostrar que para toda expresión if e, (normal e) está&lt;br /&gt;
  en forma normal.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
lemma es_normal_normal: &lt;br /&gt;
  &amp;quot;es_normal (normal b)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Definición. Definir la función&lt;br /&gt;
     bool2ifN :: exp_booleana ⇒ exp_if&lt;br /&gt;
  tal que (bool2ifN e) es una expresión if en forma normal equivalente a&lt;br /&gt;
  la expresión Booleana e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
definition bool2ifN :: &amp;quot;exp_booleana ⇒ exp_if&amp;quot; where&lt;br /&gt;
  &amp;quot;bool2ifN e ≡ normal (bool2if e)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 4. Demostrar que para toda expresión booleana e, &lt;br /&gt;
  (bool2ifN e) está en forma normal.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
lemma es_normal_bool2ifN: &lt;br /&gt;
  &amp;quot;es_normal (bool2ifN e)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 5. Demostrar que para toda expresión booleana e, &lt;br /&gt;
  (bool2ifN e) es equivalente a e.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
lemma valor_if_bool2ifN: &lt;br /&gt;
  &amp;quot;valor_if (bool2ifN e) ent = valor e ent&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Ejercicios&amp;diff=1263</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Ejercicios&amp;diff=1263"/>
		<updated>2020-06-18T06:49:01Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-19/ejercicios/ejercicios-LMF-2019-20.pdf libro de ejercicios].&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]], [[Relación 1 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R1_sol.pdf Una solución]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R2.thy Deducción natural proposicional con Isabelle] ([[R2 |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Rel 2 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R3.thy Deducción natural proposicional con Isabelle (II)] ([[R3 |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Rel 3 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4.thy Sintaxis y semántica de la lógica de primer orden.] ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4_sol.pdf Una solución]).).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R5.thy Deducción natural en lógica de primer orden.] ([[R5 |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Rel 5 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R6.thy Formalización y argumentación con Isabelle/HOL.] ([[R6 |Enunciado]], [[Relación 6 |Solución colaborativa]] , [[Rel 6 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R7.thy Deducción natural,formalización y argumentación en LPO con Isabelle/HOL.] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R8.thy Programación funcional en  Isabelle/HOL.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 8 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 8 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R9.thy Programación funcional en  Isabelle/HOL (II).] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 9 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 9 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1 (24-04-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T1 |Enunciado]], [[T1 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R10.thy Razonamiento sobre programas en Isabelle/HOL.] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 10 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL(II).] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 11 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R12.thy Razonamiento sobre programas en Isabelle/HOL(III).] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 12 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2 (12-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T2 |Enunciado]], [[T2 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R13.thy Recorridos de árboles.] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 13 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R14.thy Una axiomátización de la Geometría.] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 14 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3 (19-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T3 |Enunciado]], [[T3 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R15.thy Definiciones inductivas: clausuras.] ([[R15 |Enunciado]], [[Relación 15 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4 (26-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T4 |Enunciado]], [[T4 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 5 (02-06-2020)&amp;#039;&amp;#039;&amp;#039;: &lt;br /&gt;
** ([[T5-1 |Enunciado (1)]], [[T5-1 sol |Una solución]]).&lt;br /&gt;
** ([[T5-2 |Enunciado (2)]], [[T5-2 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Trabajo final&amp;#039;&amp;#039;&amp;#039;: ([[TF |Enunciado]], [[TF sol |Una solución]]).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Nota&amp;#039;&amp;#039;&amp;#039; Se pueden publicar las soluciones hasta el martes 31 de marzo.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]] y [[Sol 9 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R10.thy Programación funcional en Isabelle (2)] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]  y [[Sol 10 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]  y [[Sol 11 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R12.thy Recorridos de árboles en Isabelle/HOL] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]  y [[Sol 12 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R13.thy Definiciones inductivas: clausuras] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]  y [[Sol 13 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R14.thy Desarrollo de teorías axiomáticas] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]  y [[Sol 14 | una solución]]).&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T5-2_sol&amp;diff=1262</id>
		<title>T5-2 sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T5-2_sol&amp;diff=1262"/>
		<updated>2020-06-17T15:38:37Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Protegió «T5-2 sol» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
theory ej_2jun_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Consideremos el árbol binario definido por&lt;br /&gt;
     datatype &amp;#039;a arbol = H  &lt;br /&gt;
                       | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  Por ejemplo, el árbol&lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
             &lt;br /&gt;
  se representa por &amp;quot;N e (N c H H) (N g H H)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Se define las funciones&lt;br /&gt;
     fun preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;preOrden H         = []&amp;quot;&lt;br /&gt;
     | &amp;quot;preOrden (N x i d) = x#(preOrden i)@(preOrden d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
     fun preOrdenAaux :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;preOrdenAaux H         xs = xs&amp;quot;&lt;br /&gt;
     | &amp;quot;preOrdenAaux (N x i d) xs = (preOrdenAaux d (preOrdenAaux i (xs@[x])))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
     definition preOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;preOrdenA a ≡ preOrdenAaux a []&amp;quot;&lt;br /&gt;
  tales que &lt;br /&gt;
  + (preOrden a) es el recorrido post orden del árbol a. Por&lt;br /&gt;
    ejemplo, &lt;br /&gt;
       preOrden (N e (N c H H) (N g H H)) = [c, g, e]&lt;br /&gt;
  + (preOrdenA a) es el recorrido post orden del árbol a, calculado &lt;br /&gt;
    con la función auxiliar preOrdenAaux que usa un acumulador. Por &lt;br /&gt;
    ejemplo, &lt;br /&gt;
       preOrdenA (N e (N c H H) (N g H H)) = [c, g, e]&lt;br /&gt;
 &lt;br /&gt;
  Demostrar detalladamente que las funciones postOrden y postOrdenA son&lt;br /&gt;
  equivalentes; es decir,&lt;br /&gt;
     preOrdenA a = preOrden a&lt;br /&gt;
&lt;br /&gt;
  Nota: Los únicos métodos que se pueden usar son induct y simp. &lt;br /&gt;
  -------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
section ‹Definiciones›&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = H  &lt;br /&gt;
                  | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrden H         = []&amp;quot;&lt;br /&gt;
| &amp;quot;preOrden (N x i d) = x#(preOrden i)@(preOrden d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun preOrdenAaux :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrdenAaux H         xs = xs&amp;quot;&lt;br /&gt;
| &amp;quot;preOrdenAaux (N x i d) xs = (preOrdenAaux d (preOrdenAaux i (xs@[x])))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
definition preOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrdenA a ≡ preOrdenAaux a []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones del lema preOrdenAux›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración estructurada de preOrdenAux›&lt;br /&gt;
&lt;br /&gt;
lemma preOrdenAuxE:&lt;br /&gt;
  &amp;quot;preOrdenAaux a xs = xs @ preOrden a&amp;quot;&lt;br /&gt;
proof (induct a arbitrary: xs)&lt;br /&gt;
  case H&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (N x1 a1 a2)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de preOrdenAux›&lt;br /&gt;
&lt;br /&gt;
lemma preOrdenAuxA:&lt;br /&gt;
  &amp;quot;preOrdenAaux a xs = xs @ preOrden a&amp;quot;&lt;br /&gt;
  by (induct a arbitrary: xs) simp_all&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración declarativa detallada de preOrdenAux›&lt;br /&gt;
&lt;br /&gt;
lemma append_unitaria:&lt;br /&gt;
  &amp;quot;[x] @ ys = x # ys&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;[x] @ ys = x # ([] @ ys)&amp;quot;&lt;br /&gt;
    by (simp only: append.simps(2))&lt;br /&gt;
  also have &amp;quot;… = x # ys&amp;quot;&lt;br /&gt;
    by (simp only: append.simps(1))&lt;br /&gt;
  finally show &amp;quot;[x] @ ys = x # ys&amp;quot;&lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma preOrdenAux:&lt;br /&gt;
  &amp;quot;preOrdenAaux a xs = xs @ preOrden a&amp;quot;&lt;br /&gt;
proof (induct a arbitrary: xs) &lt;br /&gt;
  fix xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrdenAaux H xs = xs&amp;quot; &lt;br /&gt;
    by (simp only: preOrdenAaux.simps(1))&lt;br /&gt;
  also have &amp;quot;… = xs @ []&amp;quot;&lt;br /&gt;
    by (simp only: append_Nil2)&lt;br /&gt;
  also have &amp;quot;… = xs @ preOrden H&amp;quot; &lt;br /&gt;
    by (simp only: preOrden.simps(1))&lt;br /&gt;
  finally show &amp;quot;preOrdenAaux H xs = xs @ preOrden H&amp;quot; &lt;br /&gt;
    by this &lt;br /&gt;
next  &lt;br /&gt;
  fix x :: &amp;quot;&amp;#039;a&amp;quot; and i d :: &amp;quot;&amp;#039;a arbol&amp;quot; and xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume HI1: &amp;quot;⋀xs. preOrdenAaux i xs = xs @ preOrden i&amp;quot; &lt;br /&gt;
    and  HI2: &amp;quot;⋀xs. preOrdenAaux d xs = xs @ preOrden d&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrdenAaux (N x i d) xs = &lt;br /&gt;
        preOrdenAaux d (preOrdenAaux i (xs @ [x]))&amp;quot; &lt;br /&gt;
    by (simp only: preOrdenAaux.simps(2))&lt;br /&gt;
  also have &amp;quot;… = preOrdenAaux d ((xs @ [x]) @ (preOrden i))&amp;quot; &lt;br /&gt;
    by (simp only: HI1)      &lt;br /&gt;
  also have &amp;quot;… = ((xs @ [x]) @ (preOrden i)) @ (preOrden d)&amp;quot;&lt;br /&gt;
    by (simp only: HI2) &lt;br /&gt;
  also have &amp;quot;… = xs @ ([x] @ preOrden i @ preOrden d)&amp;quot;&lt;br /&gt;
    by (simp only: append.assoc)       &lt;br /&gt;
  also have &amp;quot;… = xs @ (x # preOrden i @ preOrden d)&amp;quot;&lt;br /&gt;
    by (simp only: append_unitaria)&lt;br /&gt;
  also have &amp;quot;… = xs @ (preOrden (N x i d))&amp;quot;&lt;br /&gt;
    by (simp only: preOrden.simps(2))&lt;br /&gt;
  finally show &amp;quot;preOrdenAaux (N x i d) xs = &lt;br /&gt;
                xs @ preOrden (N x i d)&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones de preOrdenA›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de preOrdenA›&lt;br /&gt;
&lt;br /&gt;
theorem preOrdenA_A:&lt;br /&gt;
  &amp;quot;preOrdenA a = preOrden a&amp;quot;&lt;br /&gt;
  by (simp add: preOrdenA_def preOrdenAux)&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración declarativa detallada de preOrdenA›&lt;br /&gt;
&lt;br /&gt;
theorem preOrdenA:&lt;br /&gt;
  &amp;quot;preOrdenA a = preOrden a&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;preOrdenA a = preOrdenAaux a []&amp;quot; &lt;br /&gt;
    by (simp only: preOrdenA_def)&lt;br /&gt;
  also have &amp;quot;… = [] @ (preOrden a)&amp;quot;&lt;br /&gt;
    by (simp only: preOrdenAux)&lt;br /&gt;
  also have &amp;quot;... = preOrden a&amp;quot;&lt;br /&gt;
    by (simp only: append.simps(1))&lt;br /&gt;
  finally show &amp;quot;preOrdenA a = preOrden a&amp;quot;&lt;br /&gt;
    by this&lt;br /&gt;
    qed&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Sea G un grupo. Demostrar detalladamente lo siguiente:&lt;br /&gt;
     x = y ⋅ z^ si y sólo si y = x ⋅ z&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: auto, blast, force,&lt;br /&gt;
  fast, arith o metis &lt;br /&gt;
  ------------------------------------------------------------------ ›&lt;br /&gt;
&lt;br /&gt;
locale grupo =&lt;br /&gt;
  fixes prod :: &amp;quot;[&amp;#039;a, &amp;#039;a] ⇒ &amp;#039;a&amp;quot; (infixl &amp;quot;⋅&amp;quot; 70)&lt;br /&gt;
    and neutro (&amp;quot;𝟭&amp;quot;) &lt;br /&gt;
    and inverso (&amp;quot;_^&amp;quot; [100] 100)&lt;br /&gt;
  assumes asociativa: &amp;quot;(x ⋅ y) ⋅ z = x ⋅ (y ⋅ z)&amp;quot;&lt;br /&gt;
      and neutro_i:   &amp;quot;𝟭 ⋅ x = x&amp;quot;&lt;br /&gt;
      and neutro_d:   &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
      and inverso_i:  &amp;quot;x^ ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Notas sobre notación:&lt;br /&gt;
   * El producto es ⋅ y se escribe con \ cdot (sin espacio entre ellos). &lt;br /&gt;
   * El neutro es 𝟭 y se escribe con \ y one (sin espacio entre ellos).&lt;br /&gt;
   * El inverso de x es x^ y se escribe pulsando 2 veces en ^. *)&lt;br /&gt;
&lt;br /&gt;
context grupo&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma inverso_d: &lt;br /&gt;
  &amp;quot;x ⋅ x^ = 𝟭&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;x ⋅ x^ = 𝟭 ⋅ (x ⋅ x^)&amp;quot; &lt;br /&gt;
    by (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;… = (𝟭 ⋅ x) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = (((x^)^ ⋅ x^) ⋅ x) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = ((x^)^ ⋅ (x^ ⋅ x)) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = ((x^)^ ⋅ 𝟭) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = (x^)^ ⋅ (𝟭 ⋅ x^)&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = (x^)^ ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;… = 𝟭&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  finally show ?thesis &lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma condicion_necesaria:&lt;br /&gt;
  assumes &amp;quot;x = y ⋅ z^&amp;quot;&lt;br /&gt;
  shows  &amp;quot;y = x  ⋅ z&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;x ⋅ z = (y ⋅ z^) ⋅ z&amp;quot; &lt;br /&gt;
    using assms(1)&lt;br /&gt;
    by (rule arg_cong)&lt;br /&gt;
  also have &amp;quot;… = y ⋅ (z^ ⋅ z)&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = y ⋅ 𝟭&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = y&amp;quot; &lt;br /&gt;
    by (simp only: neutro_d)&lt;br /&gt;
  finally have  &amp;quot;x ⋅ z = y&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
  then show  &amp;quot;y = x ⋅ z&amp;quot; &lt;br /&gt;
    by (rule sym)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma condicion_suficiente:&lt;br /&gt;
  assumes &amp;quot;y = x  ⋅ z&amp;quot;&lt;br /&gt;
  shows &amp;quot;x = y ⋅ z^&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  have  &amp;quot;y ⋅ z^ = (x ⋅ z) ⋅ z^&amp;quot; &lt;br /&gt;
    using assms(1)&lt;br /&gt;
    by (rule arg_cong)&lt;br /&gt;
  also have &amp;quot;… = x ⋅ (z ⋅ z^)&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = x ⋅ 𝟭&amp;quot; &lt;br /&gt;
    by (simp only: inverso_d)&lt;br /&gt;
  also have &amp;quot;… = x&amp;quot; &lt;br /&gt;
    by (simp only: neutro_d)&lt;br /&gt;
  finally have  &amp;quot;y ⋅ z^ = x&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
  then show  &amp;quot;x = y ⋅ z^&amp;quot; &lt;br /&gt;
    by (rule sym)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma condicion_necesaria_y_suficiente:&lt;br /&gt;
  &amp;quot;x = y ⋅ z^ ⟷ y = x  ⋅ z&amp;quot; &lt;br /&gt;
proof (rule iffI)&lt;br /&gt;
  assume &amp;quot;x = y ⋅ z^&amp;quot;&lt;br /&gt;
  then show &amp;quot;y = x  ⋅ z&amp;quot;&lt;br /&gt;
    by (rule condicion_necesaria)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;y = x  ⋅ z&amp;quot;&lt;br /&gt;
  then show &amp;quot;x = y ⋅ z^&amp;quot;&lt;br /&gt;
    by (rule condicion_suficiente)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T5-2_sol&amp;diff=1261</id>
		<title>T5-2 sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T5-2_sol&amp;diff=1261"/>
		<updated>2020-06-17T15:38:27Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con «&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt; theory ej_2jun_sol imports Main  begin  lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;   by auto  lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot; by auto   text ‹-------…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
theory ej_2jun_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Consideremos el árbol binario definido por&lt;br /&gt;
     datatype &amp;#039;a arbol = H  &lt;br /&gt;
                       | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  Por ejemplo, el árbol&lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
             &lt;br /&gt;
  se representa por &amp;quot;N e (N c H H) (N g H H)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Se define las funciones&lt;br /&gt;
     fun preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;preOrden H         = []&amp;quot;&lt;br /&gt;
     | &amp;quot;preOrden (N x i d) = x#(preOrden i)@(preOrden d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
     fun preOrdenAaux :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;preOrdenAaux H         xs = xs&amp;quot;&lt;br /&gt;
     | &amp;quot;preOrdenAaux (N x i d) xs = (preOrdenAaux d (preOrdenAaux i (xs@[x])))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
     definition preOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;preOrdenA a ≡ preOrdenAaux a []&amp;quot;&lt;br /&gt;
  tales que &lt;br /&gt;
  + (preOrden a) es el recorrido post orden del árbol a. Por&lt;br /&gt;
    ejemplo, &lt;br /&gt;
       preOrden (N e (N c H H) (N g H H)) = [c, g, e]&lt;br /&gt;
  + (preOrdenA a) es el recorrido post orden del árbol a, calculado &lt;br /&gt;
    con la función auxiliar preOrdenAaux que usa un acumulador. Por &lt;br /&gt;
    ejemplo, &lt;br /&gt;
       preOrdenA (N e (N c H H) (N g H H)) = [c, g, e]&lt;br /&gt;
 &lt;br /&gt;
  Demostrar detalladamente que las funciones postOrden y postOrdenA son&lt;br /&gt;
  equivalentes; es decir,&lt;br /&gt;
     preOrdenA a = preOrden a&lt;br /&gt;
&lt;br /&gt;
  Nota: Los únicos métodos que se pueden usar son induct y simp. &lt;br /&gt;
  -------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
section ‹Definiciones›&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = H  &lt;br /&gt;
                  | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrden H         = []&amp;quot;&lt;br /&gt;
| &amp;quot;preOrden (N x i d) = x#(preOrden i)@(preOrden d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun preOrdenAaux :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrdenAaux H         xs = xs&amp;quot;&lt;br /&gt;
| &amp;quot;preOrdenAaux (N x i d) xs = (preOrdenAaux d (preOrdenAaux i (xs@[x])))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
definition preOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrdenA a ≡ preOrdenAaux a []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones del lema preOrdenAux›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración estructurada de preOrdenAux›&lt;br /&gt;
&lt;br /&gt;
lemma preOrdenAuxE:&lt;br /&gt;
  &amp;quot;preOrdenAaux a xs = xs @ preOrden a&amp;quot;&lt;br /&gt;
proof (induct a arbitrary: xs)&lt;br /&gt;
  case H&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (N x1 a1 a2)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de preOrdenAux›&lt;br /&gt;
&lt;br /&gt;
lemma preOrdenAuxA:&lt;br /&gt;
  &amp;quot;preOrdenAaux a xs = xs @ preOrden a&amp;quot;&lt;br /&gt;
  by (induct a arbitrary: xs) simp_all&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración declarativa detallada de preOrdenAux›&lt;br /&gt;
&lt;br /&gt;
lemma append_unitaria:&lt;br /&gt;
  &amp;quot;[x] @ ys = x # ys&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;[x] @ ys = x # ([] @ ys)&amp;quot;&lt;br /&gt;
    by (simp only: append.simps(2))&lt;br /&gt;
  also have &amp;quot;… = x # ys&amp;quot;&lt;br /&gt;
    by (simp only: append.simps(1))&lt;br /&gt;
  finally show &amp;quot;[x] @ ys = x # ys&amp;quot;&lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma preOrdenAux:&lt;br /&gt;
  &amp;quot;preOrdenAaux a xs = xs @ preOrden a&amp;quot;&lt;br /&gt;
proof (induct a arbitrary: xs) &lt;br /&gt;
  fix xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrdenAaux H xs = xs&amp;quot; &lt;br /&gt;
    by (simp only: preOrdenAaux.simps(1))&lt;br /&gt;
  also have &amp;quot;… = xs @ []&amp;quot;&lt;br /&gt;
    by (simp only: append_Nil2)&lt;br /&gt;
  also have &amp;quot;… = xs @ preOrden H&amp;quot; &lt;br /&gt;
    by (simp only: preOrden.simps(1))&lt;br /&gt;
  finally show &amp;quot;preOrdenAaux H xs = xs @ preOrden H&amp;quot; &lt;br /&gt;
    by this &lt;br /&gt;
next  &lt;br /&gt;
  fix x :: &amp;quot;&amp;#039;a&amp;quot; and i d :: &amp;quot;&amp;#039;a arbol&amp;quot; and xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume HI1: &amp;quot;⋀xs. preOrdenAaux i xs = xs @ preOrden i&amp;quot; &lt;br /&gt;
    and  HI2: &amp;quot;⋀xs. preOrdenAaux d xs = xs @ preOrden d&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrdenAaux (N x i d) xs = &lt;br /&gt;
        preOrdenAaux d (preOrdenAaux i (xs @ [x]))&amp;quot; &lt;br /&gt;
    by (simp only: preOrdenAaux.simps(2))&lt;br /&gt;
  also have &amp;quot;… = preOrdenAaux d ((xs @ [x]) @ (preOrden i))&amp;quot; &lt;br /&gt;
    by (simp only: HI1)      &lt;br /&gt;
  also have &amp;quot;… = ((xs @ [x]) @ (preOrden i)) @ (preOrden d)&amp;quot;&lt;br /&gt;
    by (simp only: HI2) &lt;br /&gt;
  also have &amp;quot;… = xs @ ([x] @ preOrden i @ preOrden d)&amp;quot;&lt;br /&gt;
    by (simp only: append.assoc)       &lt;br /&gt;
  also have &amp;quot;… = xs @ (x # preOrden i @ preOrden d)&amp;quot;&lt;br /&gt;
    by (simp only: append_unitaria)&lt;br /&gt;
  also have &amp;quot;… = xs @ (preOrden (N x i d))&amp;quot;&lt;br /&gt;
    by (simp only: preOrden.simps(2))&lt;br /&gt;
  finally show &amp;quot;preOrdenAaux (N x i d) xs = &lt;br /&gt;
                xs @ preOrden (N x i d)&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones de preOrdenA›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de preOrdenA›&lt;br /&gt;
&lt;br /&gt;
theorem preOrdenA_A:&lt;br /&gt;
  &amp;quot;preOrdenA a = preOrden a&amp;quot;&lt;br /&gt;
  by (simp add: preOrdenA_def preOrdenAux)&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración declarativa detallada de preOrdenA›&lt;br /&gt;
&lt;br /&gt;
theorem preOrdenA:&lt;br /&gt;
  &amp;quot;preOrdenA a = preOrden a&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;preOrdenA a = preOrdenAaux a []&amp;quot; &lt;br /&gt;
    by (simp only: preOrdenA_def)&lt;br /&gt;
  also have &amp;quot;… = [] @ (preOrden a)&amp;quot;&lt;br /&gt;
    by (simp only: preOrdenAux)&lt;br /&gt;
  also have &amp;quot;... = preOrden a&amp;quot;&lt;br /&gt;
    by (simp only: append.simps(1))&lt;br /&gt;
  finally show &amp;quot;preOrdenA a = preOrden a&amp;quot;&lt;br /&gt;
    by this&lt;br /&gt;
    qed&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Sea G un grupo. Demostrar detalladamente lo siguiente:&lt;br /&gt;
     x = y ⋅ z^ si y sólo si y = x ⋅ z&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: auto, blast, force,&lt;br /&gt;
  fast, arith o metis &lt;br /&gt;
  ------------------------------------------------------------------ ›&lt;br /&gt;
&lt;br /&gt;
locale grupo =&lt;br /&gt;
  fixes prod :: &amp;quot;[&amp;#039;a, &amp;#039;a] ⇒ &amp;#039;a&amp;quot; (infixl &amp;quot;⋅&amp;quot; 70)&lt;br /&gt;
    and neutro (&amp;quot;𝟭&amp;quot;) &lt;br /&gt;
    and inverso (&amp;quot;_^&amp;quot; [100] 100)&lt;br /&gt;
  assumes asociativa: &amp;quot;(x ⋅ y) ⋅ z = x ⋅ (y ⋅ z)&amp;quot;&lt;br /&gt;
      and neutro_i:   &amp;quot;𝟭 ⋅ x = x&amp;quot;&lt;br /&gt;
      and neutro_d:   &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
      and inverso_i:  &amp;quot;x^ ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Notas sobre notación:&lt;br /&gt;
   * El producto es ⋅ y se escribe con \ cdot (sin espacio entre ellos). &lt;br /&gt;
   * El neutro es 𝟭 y se escribe con \ y one (sin espacio entre ellos).&lt;br /&gt;
   * El inverso de x es x^ y se escribe pulsando 2 veces en ^. *)&lt;br /&gt;
&lt;br /&gt;
context grupo&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma inverso_d: &lt;br /&gt;
  &amp;quot;x ⋅ x^ = 𝟭&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;x ⋅ x^ = 𝟭 ⋅ (x ⋅ x^)&amp;quot; &lt;br /&gt;
    by (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;… = (𝟭 ⋅ x) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = (((x^)^ ⋅ x^) ⋅ x) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = ((x^)^ ⋅ (x^ ⋅ x)) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = ((x^)^ ⋅ 𝟭) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = (x^)^ ⋅ (𝟭 ⋅ x^)&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = (x^)^ ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;… = 𝟭&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  finally show ?thesis &lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma condicion_necesaria:&lt;br /&gt;
  assumes &amp;quot;x = y ⋅ z^&amp;quot;&lt;br /&gt;
  shows  &amp;quot;y = x  ⋅ z&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;x ⋅ z = (y ⋅ z^) ⋅ z&amp;quot; &lt;br /&gt;
    using assms(1)&lt;br /&gt;
    by (rule arg_cong)&lt;br /&gt;
  also have &amp;quot;… = y ⋅ (z^ ⋅ z)&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = y ⋅ 𝟭&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = y&amp;quot; &lt;br /&gt;
    by (simp only: neutro_d)&lt;br /&gt;
  finally have  &amp;quot;x ⋅ z = y&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
  then show  &amp;quot;y = x ⋅ z&amp;quot; &lt;br /&gt;
    by (rule sym)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma condicion_suficiente:&lt;br /&gt;
  assumes &amp;quot;y = x  ⋅ z&amp;quot;&lt;br /&gt;
  shows &amp;quot;x = y ⋅ z^&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  have  &amp;quot;y ⋅ z^ = (x ⋅ z) ⋅ z^&amp;quot; &lt;br /&gt;
    using assms(1)&lt;br /&gt;
    by (rule arg_cong)&lt;br /&gt;
  also have &amp;quot;… = x ⋅ (z ⋅ z^)&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = x ⋅ 𝟭&amp;quot; &lt;br /&gt;
    by (simp only: inverso_d)&lt;br /&gt;
  also have &amp;quot;… = x&amp;quot; &lt;br /&gt;
    by (simp only: neutro_d)&lt;br /&gt;
  finally have  &amp;quot;y ⋅ z^ = x&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
  then show  &amp;quot;x = y ⋅ z^&amp;quot; &lt;br /&gt;
    by (rule sym)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma condicion_necesaria_y_suficiente:&lt;br /&gt;
  &amp;quot;x = y ⋅ z^ ⟷ y = x  ⋅ z&amp;quot; &lt;br /&gt;
proof (rule iffI)&lt;br /&gt;
  assume &amp;quot;x = y ⋅ z^&amp;quot;&lt;br /&gt;
  then show &amp;quot;y = x  ⋅ z&amp;quot;&lt;br /&gt;
    by (rule condicion_necesaria)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;y = x  ⋅ z&amp;quot;&lt;br /&gt;
  then show &amp;quot;x = y ⋅ z^&amp;quot;&lt;br /&gt;
    by (rule condicion_suficiente)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T5-2&amp;diff=1260</id>
		<title>T5-2</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T5-2&amp;diff=1260"/>
		<updated>2020-06-17T15:37:48Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Protegió «T5-2» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
text ‹Ejercicio 5 de Lógica Matemática y Fundamentos (2-junio-2020)›&lt;br /&gt;
&lt;br /&gt;
theory ej_2jun&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  Apellidos:&lt;br /&gt;
  Nombre: &lt;br /&gt;
› &lt;br /&gt;
&lt;br /&gt;
text ‹Sustituye la palabra ej_2jun por tu usuario de la Universidad de&lt;br /&gt;
  Sevilla y graba el fichero con dicho usuario.thy› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 1: El tiempo de realización del ejercicio, incluida su&lt;br /&gt;
   entrega en la PEV, es de 15:30 a 17:30.› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 2: Además de las reglas básicas de deducción natural de la &lt;br /&gt;
  lógica proposicional y de primer orden, también se pueden usar las &lt;br /&gt;
  reglas notnotI y mt que demostramos a  continuación.›&lt;br /&gt;
&lt;br /&gt;
text ‹Nota 3: En el proceso de corrección del ejercicio, y antes de la&lt;br /&gt;
  publicación de las calificaciones del mismo, se podrá requerir&lt;br /&gt;
  aclaraciones sobre su respuesta. Estas aclaraciones se harán por &lt;br /&gt;
  alguno de los procedimientos virtuales previstos en la PEV. ›&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;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Consideremos el árbol binario definido por&lt;br /&gt;
     datatype &amp;#039;a arbol = H  &lt;br /&gt;
                       | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  Por ejemplo, el árbol&lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
             &lt;br /&gt;
  se representa por &amp;quot;N e (N c H H) (N g H H)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Se define las funciones&lt;br /&gt;
     fun preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;preOrden H         = []&amp;quot;&lt;br /&gt;
     | &amp;quot;preOrden (N x i d) = x#(preOrden i)@(preOrden d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
     fun preOrdenAaux :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;preOrdenAaux H         xs = xs&amp;quot;&lt;br /&gt;
     | &amp;quot;preOrdenAaux (N x i d) xs = (preOrdenAaux d (preOrdenAaux i (xs@[x])))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
     definition preOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;preOrdenA a ≡ preOrdenAaux a []&amp;quot;&lt;br /&gt;
  tales que &lt;br /&gt;
  + (preOrden a) es el recorrido post orden del árbol a. Por&lt;br /&gt;
    ejemplo, &lt;br /&gt;
       preOrden (N e (N c H H) (N g H H)) = [c, g, e]&lt;br /&gt;
  + (preOrdenA a) es el recorrido post orden del árbol a, calculado &lt;br /&gt;
    con la función auxiliar preOrdenAaux que usa un acumulador. Por &lt;br /&gt;
    ejemplo, &lt;br /&gt;
       preOrdenA (N e (N c H H) (N g H H)) = [c, g, e]&lt;br /&gt;
 &lt;br /&gt;
  Demostrar detalladamente que las funciones preOrden y preOrdenA son&lt;br /&gt;
  equivalentes; es decir,&lt;br /&gt;
     preOrdenA a = preOrden a&lt;br /&gt;
  -------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
section ‹Definiciones›&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = H  &lt;br /&gt;
                  | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrden H         = []&amp;quot;&lt;br /&gt;
| &amp;quot;preOrden (N x i d) = x#(preOrden i)@(preOrden d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun preOrdenAaux :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrdenAaux H         xs = xs&amp;quot;&lt;br /&gt;
| &amp;quot;preOrdenAaux (N x i d) xs = (preOrdenAaux d (preOrdenAaux i (xs@[x])))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
definition preOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrdenA a ≡ preOrdenAaux a []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
― ‹Lema preOrdenAux›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración en lenguaje natural›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada de preOrdenAux›&lt;br /&gt;
&lt;br /&gt;
lemma preOrdenAux:&lt;br /&gt;
  &amp;quot;preOrdenAaux a xs = xs @ preOrden a&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
― ‹Demostraciones de preOrdenA›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración en lenguaje natural›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada›&lt;br /&gt;
&lt;br /&gt;
theorem preOrdenA:&lt;br /&gt;
  &amp;quot;preOrdenA a = preOrden a&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Sea G un grupo. Demostrar detalladamente lo siguiente:&lt;br /&gt;
     x = y ⋅ z^ si y sólo si y = x ⋅ z&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: auto, blast, force,&lt;br /&gt;
  fast, arith o metis &lt;br /&gt;
  ------------------------------------------------------------------ ›&lt;br /&gt;
&lt;br /&gt;
locale grupo =&lt;br /&gt;
  fixes prod :: &amp;quot;[&amp;#039;a, &amp;#039;a] ⇒ &amp;#039;a&amp;quot; (infixl &amp;quot;⋅&amp;quot; 70)&lt;br /&gt;
    and neutro (&amp;quot;𝟭&amp;quot;) &lt;br /&gt;
    and inverso (&amp;quot;_^&amp;quot; [100] 100)&lt;br /&gt;
  assumes asociativa: &amp;quot;(x ⋅ y) ⋅ z = x ⋅ (y ⋅ z)&amp;quot;&lt;br /&gt;
      and neutro_i:   &amp;quot;𝟭 ⋅ x = x&amp;quot;&lt;br /&gt;
      and neutro_d:   &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
      and inverso_i:  &amp;quot;x^ ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Notas sobre notación:&lt;br /&gt;
   * El producto es ⋅ y se escribe con \ cdot (sin espacio entre ellos). &lt;br /&gt;
   * El neutro es 𝟭 y se escribe con \ y one (sin espacio entre ellos).&lt;br /&gt;
   * El inverso de x es x^ y se escribe pulsando 2 veces en ^. *)&lt;br /&gt;
&lt;br /&gt;
context grupo&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada›&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;x = y ⋅ z^ ⟷ y = x  ⋅ z&amp;quot; &lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T5-2&amp;diff=1259</id>
		<title>T5-2</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T5-2&amp;diff=1259"/>
		<updated>2020-06-17T15:37:37Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con «&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt; text ‹Ejercicio 5 de Lógica Matemática y Fundamentos (2-junio-2020)›  theory ej_2jun imports Main  begin  text ‹   Apellidos:   Nombre:…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
text ‹Ejercicio 5 de Lógica Matemática y Fundamentos (2-junio-2020)›&lt;br /&gt;
&lt;br /&gt;
theory ej_2jun&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  Apellidos:&lt;br /&gt;
  Nombre: &lt;br /&gt;
› &lt;br /&gt;
&lt;br /&gt;
text ‹Sustituye la palabra ej_2jun por tu usuario de la Universidad de&lt;br /&gt;
  Sevilla y graba el fichero con dicho usuario.thy› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 1: El tiempo de realización del ejercicio, incluida su&lt;br /&gt;
   entrega en la PEV, es de 15:30 a 17:30.› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 2: Además de las reglas básicas de deducción natural de la &lt;br /&gt;
  lógica proposicional y de primer orden, también se pueden usar las &lt;br /&gt;
  reglas notnotI y mt que demostramos a  continuación.›&lt;br /&gt;
&lt;br /&gt;
text ‹Nota 3: En el proceso de corrección del ejercicio, y antes de la&lt;br /&gt;
  publicación de las calificaciones del mismo, se podrá requerir&lt;br /&gt;
  aclaraciones sobre su respuesta. Estas aclaraciones se harán por &lt;br /&gt;
  alguno de los procedimientos virtuales previstos en la PEV. ›&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;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Consideremos el árbol binario definido por&lt;br /&gt;
     datatype &amp;#039;a arbol = H  &lt;br /&gt;
                       | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  Por ejemplo, el árbol&lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
             &lt;br /&gt;
  se representa por &amp;quot;N e (N c H H) (N g H H)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Se define las funciones&lt;br /&gt;
     fun preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;preOrden H         = []&amp;quot;&lt;br /&gt;
     | &amp;quot;preOrden (N x i d) = x#(preOrden i)@(preOrden d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
     fun preOrdenAaux :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;preOrdenAaux H         xs = xs&amp;quot;&lt;br /&gt;
     | &amp;quot;preOrdenAaux (N x i d) xs = (preOrdenAaux d (preOrdenAaux i (xs@[x])))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
     definition preOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
       &amp;quot;preOrdenA a ≡ preOrdenAaux a []&amp;quot;&lt;br /&gt;
  tales que &lt;br /&gt;
  + (preOrden a) es el recorrido post orden del árbol a. Por&lt;br /&gt;
    ejemplo, &lt;br /&gt;
       preOrden (N e (N c H H) (N g H H)) = [c, g, e]&lt;br /&gt;
  + (preOrdenA a) es el recorrido post orden del árbol a, calculado &lt;br /&gt;
    con la función auxiliar preOrdenAaux que usa un acumulador. Por &lt;br /&gt;
    ejemplo, &lt;br /&gt;
       preOrdenA (N e (N c H H) (N g H H)) = [c, g, e]&lt;br /&gt;
 &lt;br /&gt;
  Demostrar detalladamente que las funciones preOrden y preOrdenA son&lt;br /&gt;
  equivalentes; es decir,&lt;br /&gt;
     preOrdenA a = preOrden a&lt;br /&gt;
  -------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
section ‹Definiciones›&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = H  &lt;br /&gt;
                  | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrden H         = []&amp;quot;&lt;br /&gt;
| &amp;quot;preOrden (N x i d) = x#(preOrden i)@(preOrden d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun preOrdenAaux :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrdenAaux H         xs = xs&amp;quot;&lt;br /&gt;
| &amp;quot;preOrdenAaux (N x i d) xs = (preOrdenAaux d (preOrdenAaux i (xs@[x])))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
definition preOrdenA :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrdenA a ≡ preOrdenAaux a []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
― ‹Lema preOrdenAux›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración en lenguaje natural›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada de preOrdenAux›&lt;br /&gt;
&lt;br /&gt;
lemma preOrdenAux:&lt;br /&gt;
  &amp;quot;preOrdenAaux a xs = xs @ preOrden a&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
― ‹Demostraciones de preOrdenA›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración en lenguaje natural›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada›&lt;br /&gt;
&lt;br /&gt;
theorem preOrdenA:&lt;br /&gt;
  &amp;quot;preOrdenA a = preOrden a&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Sea G un grupo. Demostrar detalladamente lo siguiente:&lt;br /&gt;
     x = y ⋅ z^ si y sólo si y = x ⋅ z&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: auto, blast, force,&lt;br /&gt;
  fast, arith o metis &lt;br /&gt;
  ------------------------------------------------------------------ ›&lt;br /&gt;
&lt;br /&gt;
locale grupo =&lt;br /&gt;
  fixes prod :: &amp;quot;[&amp;#039;a, &amp;#039;a] ⇒ &amp;#039;a&amp;quot; (infixl &amp;quot;⋅&amp;quot; 70)&lt;br /&gt;
    and neutro (&amp;quot;𝟭&amp;quot;) &lt;br /&gt;
    and inverso (&amp;quot;_^&amp;quot; [100] 100)&lt;br /&gt;
  assumes asociativa: &amp;quot;(x ⋅ y) ⋅ z = x ⋅ (y ⋅ z)&amp;quot;&lt;br /&gt;
      and neutro_i:   &amp;quot;𝟭 ⋅ x = x&amp;quot;&lt;br /&gt;
      and neutro_d:   &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
      and inverso_i:  &amp;quot;x^ ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Notas sobre notación:&lt;br /&gt;
   * El producto es ⋅ y se escribe con \ cdot (sin espacio entre ellos). &lt;br /&gt;
   * El neutro es 𝟭 y se escribe con \ y one (sin espacio entre ellos).&lt;br /&gt;
   * El inverso de x es x^ y se escribe pulsando 2 veces en ^. *)&lt;br /&gt;
&lt;br /&gt;
context grupo&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada›&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;x = y ⋅ z^ ⟷ y = x  ⋅ z&amp;quot; &lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T5-1_sol&amp;diff=1258</id>
		<title>T5-1 sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T5-1_sol&amp;diff=1258"/>
		<updated>2020-06-17T15:36:57Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Protegió «T5-1 sol» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
theory ej_2_jun_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Consideremos el árbol binario definido por&lt;br /&gt;
     datatype &amp;#039;a arbol = H  &lt;br /&gt;
                       | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  Por ejemplo, el árbol&lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
             &lt;br /&gt;
  se representa por &amp;quot;N e (N c H H) (N g H H)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Se define las funciones&lt;br /&gt;
    fun nHojas :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
      &amp;quot;nHojas H         = 1&amp;quot;&lt;br /&gt;
    | &amp;quot;nHojas (N x i d) = nHojas i + nHojas d&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    fun nHojasAaux :: &amp;quot;&amp;#039;a arbol ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
      &amp;quot;nHojasAaux H         n = n + 1&amp;quot;&lt;br /&gt;
    | &amp;quot;nHojasAaux (N x i d) n = nHojasAaux i (nHojasAaux d n)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    definition nHojasA :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
      &amp;quot;nHojasA a ≡ nHojasAaux a 0&amp;quot;&lt;br /&gt;
  tales que&lt;br /&gt;
  + (nHojas a) es el número de hojas del árbol a. Por ejemplo, &lt;br /&gt;
       nHojas (N e (N c H H) (N g H H)) = 4&lt;br /&gt;
  + (nHojasAA a) es el número de hojas del árbol a, calculado &lt;br /&gt;
    con la función auxiliar nHojasAaux que el el segundo argumento va&lt;br /&gt;
    acumulando el resultado. Por ejemplo, &lt;br /&gt;
       nHojasA (N e (N c H H) (N g H H)) = 4&lt;br /&gt;
 &lt;br /&gt;
  Demostrar detalladamente que las funciones nHojas y nHojasA son&lt;br /&gt;
  equivalentes; es decir,&lt;br /&gt;
     nHojasA a = nHojas a&lt;br /&gt;
&lt;br /&gt;
  Nota: Los únicos métodos que se pueden usar son induct y simp. &lt;br /&gt;
  -------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
section ‹Definiciones›&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = H  &lt;br /&gt;
                  | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun nHojas :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;nHojas H         = 1&amp;quot;&lt;br /&gt;
| &amp;quot;nHojas (N x i d) = nHojas i + nHojas d&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun nHojasAaux :: &amp;quot;&amp;#039;a arbol ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;nHojasAaux H         n = n + 1&amp;quot;&lt;br /&gt;
| &amp;quot;nHojasAaux (N x i d) n = nHojasAaux i (nHojasAaux d n)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
definition nHojasA :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;nHojasA a ≡ nHojasAaux a 0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;nHojas (N e (N c H H) (N g H H)) = 4&amp;quot;&lt;br /&gt;
value &amp;quot;nHojasA (N e (N c H H) (N g H H)) = 4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones del lema auxiliar nHojasAux›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración estructurada de nHojasAux›&lt;br /&gt;
&lt;br /&gt;
lemma nHojasAuxE:&lt;br /&gt;
  &amp;quot;nHojasAaux a n = nHojas a + n&amp;quot;&lt;br /&gt;
proof (induct a arbitrary: n)&lt;br /&gt;
  case H&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (N x1 a1 a2)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de nHojasAux›&lt;br /&gt;
&lt;br /&gt;
lemma nHojasAuxA:&lt;br /&gt;
  &amp;quot;nHojasAaux a n = nHojas a + n&amp;quot;&lt;br /&gt;
  by (induct a arbitrary: n) simp_all&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración declarativa detallada de nHojasAux›&lt;br /&gt;
&lt;br /&gt;
lemma nHojasAux:&lt;br /&gt;
  &amp;quot;nHojasAaux a n = (nHojas a) + n&amp;quot;&lt;br /&gt;
proof (induct a arbitrary: n)&lt;br /&gt;
  fix n&lt;br /&gt;
  have &amp;quot;nHojasAaux H n = n + 1&amp;quot; &lt;br /&gt;
    by (simp only: nHojasAaux.simps(1))&lt;br /&gt;
  also have &amp;quot;… = nHojas H + n&amp;quot; &lt;br /&gt;
    by (simp only:nHojas.simps(1))&lt;br /&gt;
  finally show &amp;quot;nHojasAaux H n = nHojas H + n&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
next&lt;br /&gt;
  fix x :: &amp;#039;a and i d :: &amp;quot;&amp;#039;a arbol&amp;quot; and n :: nat&lt;br /&gt;
  assume HI1: &amp;quot;⋀n. nHojasAaux i n = nHojas i + n&amp;quot;&lt;br /&gt;
    and HI2: &amp;quot;⋀n. nHojasAaux d n = nHojas d + n&amp;quot;&lt;br /&gt;
  have &amp;quot;nHojasAaux (N x i d) n = nHojasAaux i (nHojasAaux d n)&amp;quot; &lt;br /&gt;
    by (simp only: nHojasAaux.simps(2))&lt;br /&gt;
  also have &amp;quot;… = nHojasAaux i (nHojas d + n)&amp;quot; &lt;br /&gt;
    by (simp only: HI2)&lt;br /&gt;
  also have &amp;quot;… = nHojas i + (nHojas d + n)&amp;quot; &lt;br /&gt;
    by (simp only: HI1)&lt;br /&gt;
  also have &amp;quot;… = (nHojas i + nHojas d) + n&amp;quot;&lt;br /&gt;
    by (simp only: add.commute)&lt;br /&gt;
  also have &amp;quot;… = nHojas (N x i d) + n&amp;quot; &lt;br /&gt;
    by (simp only: nHojas.simps(2))&lt;br /&gt;
  finally show &amp;quot;nHojasAaux (N x i d) n = nHojas (N x i d) + n&amp;quot;  &lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones del teorema nHojasA›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de nHojasA›&lt;br /&gt;
&lt;br /&gt;
theorem nHojasA_A:&lt;br /&gt;
  &amp;quot;nHojasA a = nHojas a&amp;quot;&lt;br /&gt;
  by (simp add: nHojasA_def nHojasAux)&lt;br /&gt;
&lt;br /&gt;
subsection &amp;quot;Demostración declarativa detallada de nHojasA&amp;quot;&lt;br /&gt;
&lt;br /&gt;
theorem nHojasA:&lt;br /&gt;
  &amp;quot;nHojasA a = nHojas a&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;nHojasA a = nHojasAaux a 0&amp;quot; &lt;br /&gt;
    by (simp only: nHojasA_def)&lt;br /&gt;
  also have &amp;quot;… = nHojas a + 0&amp;quot;&lt;br /&gt;
    by (simp only: nHojasAux)&lt;br /&gt;
  also have &amp;quot;... = nHojas a&amp;quot;&lt;br /&gt;
    by (simp only: add_0_right)&lt;br /&gt;
  finally show &amp;quot;nHojasA a = nHojas a&amp;quot;&lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Sea G un grupo. Demostrar detalladamente lo siguiente:&lt;br /&gt;
     x = y^ ⋅ z si y sólo si z = y ⋅ x&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: auto, blast, force,&lt;br /&gt;
  fast, arith o metis &lt;br /&gt;
  ------------------------------------------------------------------ ›&lt;br /&gt;
&lt;br /&gt;
locale grupo =&lt;br /&gt;
  fixes prod :: &amp;quot;[&amp;#039;a, &amp;#039;a] ⇒ &amp;#039;a&amp;quot; (infixl &amp;quot;⋅&amp;quot; 70)&lt;br /&gt;
    and neutro (&amp;quot;𝟭&amp;quot;) &lt;br /&gt;
    and inverso (&amp;quot;_^&amp;quot; [100] 100)&lt;br /&gt;
  assumes asociativa: &amp;quot;(x ⋅ y) ⋅ z = x ⋅ (y ⋅ z)&amp;quot;&lt;br /&gt;
      and neutro_i:   &amp;quot;𝟭 ⋅ x = x&amp;quot;&lt;br /&gt;
      and neutro_d:   &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
      and inverso_i:  &amp;quot;x^ ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Notas sobre notación:&lt;br /&gt;
   * El producto es ⋅ y se escribe con \ cdot (sin espacio entre ellos). &lt;br /&gt;
   * El neutro es 𝟭 y se escribe con \ y one (sin espacio entre ellos).&lt;br /&gt;
   * El inverso de x es x^ y se escribe pulsando 2 veces en ^. *)&lt;br /&gt;
&lt;br /&gt;
context grupo&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones de inverso_d›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de inverso_d›&lt;br /&gt;
&lt;br /&gt;
lemma inverso_d_A:&lt;br /&gt;
  &amp;quot;x ⋅ x^ = 𝟭&amp;quot;&lt;br /&gt;
  by (metis asociativa neutro_i inverso_i)&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración declarativa detallada de inverso_d›&lt;br /&gt;
&lt;br /&gt;
lemma inverso_d:&lt;br /&gt;
  &amp;quot;x ⋅ x^ = 𝟭&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;x ⋅ x^ = 𝟭 ⋅ (x ⋅ x^)&amp;quot; &lt;br /&gt;
    by (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;… = (𝟭 ⋅ x) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = (((x^)^ ⋅ x^) ⋅ x) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = ((x^)^ ⋅ (x^ ⋅ x)) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = ((x^)^ ⋅ 𝟭) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = (x^)^ ⋅ (𝟭 ⋅ x^)&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = (x^)^ ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;… = 𝟭&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  finally show ?thesis &lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones de condicion_necesaria›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de condicion_necesaria›&lt;br /&gt;
&lt;br /&gt;
lemma condicion_necesaria_A:&lt;br /&gt;
  assumes &amp;quot;x = y^ ⋅ z&amp;quot; &lt;br /&gt;
  shows   &amp;quot;z = y  ⋅ x&amp;quot; &lt;br /&gt;
  using assms&lt;br /&gt;
  by (metis asociativa neutro_i inverso_d)&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración declarativa detallada de condicion_necesaria›&lt;br /&gt;
&lt;br /&gt;
lemma condicion_necesaria:&lt;br /&gt;
  assumes &amp;quot;x = y^ ⋅ z&amp;quot; &lt;br /&gt;
  shows   &amp;quot;z = y  ⋅ x&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;y ⋅ x = y ⋅ (y^ ⋅ z)&amp;quot; &lt;br /&gt;
    using assms(1)&lt;br /&gt;
    by (rule arg_cong)&lt;br /&gt;
  also have &amp;quot;… = (y ⋅ y^) ⋅ z&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = 𝟭 ⋅ z&amp;quot; &lt;br /&gt;
    by (simp only: inverso_d)&lt;br /&gt;
  also have &amp;quot;… = z&amp;quot; &lt;br /&gt;
    by (simp only: neutro_i)&lt;br /&gt;
  finally have &amp;quot;y ⋅ x = z&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
  then show &amp;quot;z = y ⋅ x&amp;quot; &lt;br /&gt;
    by (rule sym)&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones de condicion_suficiente›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de condicion_suficiente›&lt;br /&gt;
&lt;br /&gt;
lemma condicion_suficiente_A:&lt;br /&gt;
  assumes &amp;quot;z = y  ⋅ x&amp;quot; &lt;br /&gt;
  shows   &amp;quot;x = y^ ⋅ z&amp;quot; &lt;br /&gt;
  using assms(1)&lt;br /&gt;
  by (metis asociativa neutro_i inverso_i)&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración declarativa detallada de condicion_suficiente›&lt;br /&gt;
&lt;br /&gt;
lemma condicion_suficiente:&lt;br /&gt;
  assumes &amp;quot;z = y  ⋅ x&amp;quot; &lt;br /&gt;
  shows   &amp;quot;x = y^ ⋅ z&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  have  &amp;quot;y^ ⋅ z = y^ ⋅ (y ⋅ x)&amp;quot;&lt;br /&gt;
    using assms(1)&lt;br /&gt;
    by (rule arg_cong)&lt;br /&gt;
  also have &amp;quot;… =  (y^ ⋅ y) ⋅ x&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = 𝟭 ⋅ x&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = x&amp;quot; &lt;br /&gt;
    by (simp only: neutro_i)&lt;br /&gt;
  finally have &amp;quot;y^ ⋅ z = x&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
  then show  &amp;quot;x = y^ ⋅ z&amp;quot; &lt;br /&gt;
    by (rule sym)&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones del teorema›&lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones automática del teorema›&lt;br /&gt;
&lt;br /&gt;
theorem condicion_necesaria_y_suficiente_A:&lt;br /&gt;
  &amp;quot;x = y^ ⋅ z ⟷ z = y  ⋅ x&amp;quot; &lt;br /&gt;
  using condicion_necesaria  &lt;br /&gt;
        condicion_suficiente &lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones declarativa detallada del teorema›&lt;br /&gt;
&lt;br /&gt;
theorem condicion_necesaria_y_suficiente:&lt;br /&gt;
  &amp;quot;x = y^ ⋅ z ⟷ z = y  ⋅ x&amp;quot; &lt;br /&gt;
proof (rule iffI)&lt;br /&gt;
  assume &amp;quot;x = y^ ⋅ z&amp;quot;&lt;br /&gt;
  then show &amp;quot;z = y ⋅ x&amp;quot;&lt;br /&gt;
    by (rule condicion_necesaria)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;z = y ⋅ x&amp;quot;&lt;br /&gt;
  then show &amp;quot;x = y^ ⋅ z&amp;quot;&lt;br /&gt;
    by (rule condicion_suficiente)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T5-1_sol&amp;diff=1257</id>
		<title>T5-1 sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T5-1_sol&amp;diff=1257"/>
		<updated>2020-06-17T15:36:45Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con «&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;  theory ej_2_jun_sol imports Main  begin  lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;   by auto  lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot; by auto  text ‹------…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
theory ej_2_jun_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Consideremos el árbol binario definido por&lt;br /&gt;
     datatype &amp;#039;a arbol = H  &lt;br /&gt;
                       | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  Por ejemplo, el árbol&lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
             &lt;br /&gt;
  se representa por &amp;quot;N e (N c H H) (N g H H)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Se define las funciones&lt;br /&gt;
    fun nHojas :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
      &amp;quot;nHojas H         = 1&amp;quot;&lt;br /&gt;
    | &amp;quot;nHojas (N x i d) = nHojas i + nHojas d&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    fun nHojasAaux :: &amp;quot;&amp;#039;a arbol ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
      &amp;quot;nHojasAaux H         n = n + 1&amp;quot;&lt;br /&gt;
    | &amp;quot;nHojasAaux (N x i d) n = nHojasAaux i (nHojasAaux d n)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    definition nHojasA :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
      &amp;quot;nHojasA a ≡ nHojasAaux a 0&amp;quot;&lt;br /&gt;
  tales que&lt;br /&gt;
  + (nHojas a) es el número de hojas del árbol a. Por ejemplo, &lt;br /&gt;
       nHojas (N e (N c H H) (N g H H)) = 4&lt;br /&gt;
  + (nHojasAA a) es el número de hojas del árbol a, calculado &lt;br /&gt;
    con la función auxiliar nHojasAaux que el el segundo argumento va&lt;br /&gt;
    acumulando el resultado. Por ejemplo, &lt;br /&gt;
       nHojasA (N e (N c H H) (N g H H)) = 4&lt;br /&gt;
 &lt;br /&gt;
  Demostrar detalladamente que las funciones nHojas y nHojasA son&lt;br /&gt;
  equivalentes; es decir,&lt;br /&gt;
     nHojasA a = nHojas a&lt;br /&gt;
&lt;br /&gt;
  Nota: Los únicos métodos que se pueden usar son induct y simp. &lt;br /&gt;
  -------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
section ‹Definiciones›&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = H  &lt;br /&gt;
                  | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun nHojas :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;nHojas H         = 1&amp;quot;&lt;br /&gt;
| &amp;quot;nHojas (N x i d) = nHojas i + nHojas d&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun nHojasAaux :: &amp;quot;&amp;#039;a arbol ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;nHojasAaux H         n = n + 1&amp;quot;&lt;br /&gt;
| &amp;quot;nHojasAaux (N x i d) n = nHojasAaux i (nHojasAaux d n)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
definition nHojasA :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;nHojasA a ≡ nHojasAaux a 0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;nHojas (N e (N c H H) (N g H H)) = 4&amp;quot;&lt;br /&gt;
value &amp;quot;nHojasA (N e (N c H H) (N g H H)) = 4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones del lema auxiliar nHojasAux›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración estructurada de nHojasAux›&lt;br /&gt;
&lt;br /&gt;
lemma nHojasAuxE:&lt;br /&gt;
  &amp;quot;nHojasAaux a n = nHojas a + n&amp;quot;&lt;br /&gt;
proof (induct a arbitrary: n)&lt;br /&gt;
  case H&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case (N x1 a1 a2)&lt;br /&gt;
  then show ?case by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de nHojasAux›&lt;br /&gt;
&lt;br /&gt;
lemma nHojasAuxA:&lt;br /&gt;
  &amp;quot;nHojasAaux a n = nHojas a + n&amp;quot;&lt;br /&gt;
  by (induct a arbitrary: n) simp_all&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración declarativa detallada de nHojasAux›&lt;br /&gt;
&lt;br /&gt;
lemma nHojasAux:&lt;br /&gt;
  &amp;quot;nHojasAaux a n = (nHojas a) + n&amp;quot;&lt;br /&gt;
proof (induct a arbitrary: n)&lt;br /&gt;
  fix n&lt;br /&gt;
  have &amp;quot;nHojasAaux H n = n + 1&amp;quot; &lt;br /&gt;
    by (simp only: nHojasAaux.simps(1))&lt;br /&gt;
  also have &amp;quot;… = nHojas H + n&amp;quot; &lt;br /&gt;
    by (simp only:nHojas.simps(1))&lt;br /&gt;
  finally show &amp;quot;nHojasAaux H n = nHojas H + n&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
next&lt;br /&gt;
  fix x :: &amp;#039;a and i d :: &amp;quot;&amp;#039;a arbol&amp;quot; and n :: nat&lt;br /&gt;
  assume HI1: &amp;quot;⋀n. nHojasAaux i n = nHojas i + n&amp;quot;&lt;br /&gt;
    and HI2: &amp;quot;⋀n. nHojasAaux d n = nHojas d + n&amp;quot;&lt;br /&gt;
  have &amp;quot;nHojasAaux (N x i d) n = nHojasAaux i (nHojasAaux d n)&amp;quot; &lt;br /&gt;
    by (simp only: nHojasAaux.simps(2))&lt;br /&gt;
  also have &amp;quot;… = nHojasAaux i (nHojas d + n)&amp;quot; &lt;br /&gt;
    by (simp only: HI2)&lt;br /&gt;
  also have &amp;quot;… = nHojas i + (nHojas d + n)&amp;quot; &lt;br /&gt;
    by (simp only: HI1)&lt;br /&gt;
  also have &amp;quot;… = (nHojas i + nHojas d) + n&amp;quot;&lt;br /&gt;
    by (simp only: add.commute)&lt;br /&gt;
  also have &amp;quot;… = nHojas (N x i d) + n&amp;quot; &lt;br /&gt;
    by (simp only: nHojas.simps(2))&lt;br /&gt;
  finally show &amp;quot;nHojasAaux (N x i d) n = nHojas (N x i d) + n&amp;quot;  &lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones del teorema nHojasA›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de nHojasA›&lt;br /&gt;
&lt;br /&gt;
theorem nHojasA_A:&lt;br /&gt;
  &amp;quot;nHojasA a = nHojas a&amp;quot;&lt;br /&gt;
  by (simp add: nHojasA_def nHojasAux)&lt;br /&gt;
&lt;br /&gt;
subsection &amp;quot;Demostración declarativa detallada de nHojasA&amp;quot;&lt;br /&gt;
&lt;br /&gt;
theorem nHojasA:&lt;br /&gt;
  &amp;quot;nHojasA a = nHojas a&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;nHojasA a = nHojasAaux a 0&amp;quot; &lt;br /&gt;
    by (simp only: nHojasA_def)&lt;br /&gt;
  also have &amp;quot;… = nHojas a + 0&amp;quot;&lt;br /&gt;
    by (simp only: nHojasAux)&lt;br /&gt;
  also have &amp;quot;... = nHojas a&amp;quot;&lt;br /&gt;
    by (simp only: add_0_right)&lt;br /&gt;
  finally show &amp;quot;nHojasA a = nHojas a&amp;quot;&lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Sea G un grupo. Demostrar detalladamente lo siguiente:&lt;br /&gt;
     x = y^ ⋅ z si y sólo si z = y ⋅ x&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: auto, blast, force,&lt;br /&gt;
  fast, arith o metis &lt;br /&gt;
  ------------------------------------------------------------------ ›&lt;br /&gt;
&lt;br /&gt;
locale grupo =&lt;br /&gt;
  fixes prod :: &amp;quot;[&amp;#039;a, &amp;#039;a] ⇒ &amp;#039;a&amp;quot; (infixl &amp;quot;⋅&amp;quot; 70)&lt;br /&gt;
    and neutro (&amp;quot;𝟭&amp;quot;) &lt;br /&gt;
    and inverso (&amp;quot;_^&amp;quot; [100] 100)&lt;br /&gt;
  assumes asociativa: &amp;quot;(x ⋅ y) ⋅ z = x ⋅ (y ⋅ z)&amp;quot;&lt;br /&gt;
      and neutro_i:   &amp;quot;𝟭 ⋅ x = x&amp;quot;&lt;br /&gt;
      and neutro_d:   &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
      and inverso_i:  &amp;quot;x^ ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Notas sobre notación:&lt;br /&gt;
   * El producto es ⋅ y se escribe con \ cdot (sin espacio entre ellos). &lt;br /&gt;
   * El neutro es 𝟭 y se escribe con \ y one (sin espacio entre ellos).&lt;br /&gt;
   * El inverso de x es x^ y se escribe pulsando 2 veces en ^. *)&lt;br /&gt;
&lt;br /&gt;
context grupo&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones de inverso_d›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de inverso_d›&lt;br /&gt;
&lt;br /&gt;
lemma inverso_d_A:&lt;br /&gt;
  &amp;quot;x ⋅ x^ = 𝟭&amp;quot;&lt;br /&gt;
  by (metis asociativa neutro_i inverso_i)&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración declarativa detallada de inverso_d›&lt;br /&gt;
&lt;br /&gt;
lemma inverso_d:&lt;br /&gt;
  &amp;quot;x ⋅ x^ = 𝟭&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;x ⋅ x^ = 𝟭 ⋅ (x ⋅ x^)&amp;quot; &lt;br /&gt;
    by (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;… = (𝟭 ⋅ x) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = (((x^)^ ⋅ x^) ⋅ x) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = ((x^)^ ⋅ (x^ ⋅ x)) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = ((x^)^ ⋅ 𝟭) ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = (x^)^ ⋅ (𝟭 ⋅ x^)&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = (x^)^ ⋅ x^&amp;quot; &lt;br /&gt;
    by (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;… = 𝟭&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  finally show ?thesis &lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones de condicion_necesaria›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de condicion_necesaria›&lt;br /&gt;
&lt;br /&gt;
lemma condicion_necesaria_A:&lt;br /&gt;
  assumes &amp;quot;x = y^ ⋅ z&amp;quot; &lt;br /&gt;
  shows   &amp;quot;z = y  ⋅ x&amp;quot; &lt;br /&gt;
  using assms&lt;br /&gt;
  by (metis asociativa neutro_i inverso_d)&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración declarativa detallada de condicion_necesaria›&lt;br /&gt;
&lt;br /&gt;
lemma condicion_necesaria:&lt;br /&gt;
  assumes &amp;quot;x = y^ ⋅ z&amp;quot; &lt;br /&gt;
  shows   &amp;quot;z = y  ⋅ x&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;y ⋅ x = y ⋅ (y^ ⋅ z)&amp;quot; &lt;br /&gt;
    using assms(1)&lt;br /&gt;
    by (rule arg_cong)&lt;br /&gt;
  also have &amp;quot;… = (y ⋅ y^) ⋅ z&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = 𝟭 ⋅ z&amp;quot; &lt;br /&gt;
    by (simp only: inverso_d)&lt;br /&gt;
  also have &amp;quot;… = z&amp;quot; &lt;br /&gt;
    by (simp only: neutro_i)&lt;br /&gt;
  finally have &amp;quot;y ⋅ x = z&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
  then show &amp;quot;z = y ⋅ x&amp;quot; &lt;br /&gt;
    by (rule sym)&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones de condicion_suficiente›&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración automática de condicion_suficiente›&lt;br /&gt;
&lt;br /&gt;
lemma condicion_suficiente_A:&lt;br /&gt;
  assumes &amp;quot;z = y  ⋅ x&amp;quot; &lt;br /&gt;
  shows   &amp;quot;x = y^ ⋅ z&amp;quot; &lt;br /&gt;
  using assms(1)&lt;br /&gt;
  by (metis asociativa neutro_i inverso_i)&lt;br /&gt;
&lt;br /&gt;
subsection ‹Demostración declarativa detallada de condicion_suficiente›&lt;br /&gt;
&lt;br /&gt;
lemma condicion_suficiente:&lt;br /&gt;
  assumes &amp;quot;z = y  ⋅ x&amp;quot; &lt;br /&gt;
  shows   &amp;quot;x = y^ ⋅ z&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  have  &amp;quot;y^ ⋅ z = y^ ⋅ (y ⋅ x)&amp;quot;&lt;br /&gt;
    using assms(1)&lt;br /&gt;
    by (rule arg_cong)&lt;br /&gt;
  also have &amp;quot;… =  (y^ ⋅ y) ⋅ x&amp;quot; &lt;br /&gt;
    by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = 𝟭 ⋅ x&amp;quot; &lt;br /&gt;
    by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = x&amp;quot; &lt;br /&gt;
    by (simp only: neutro_i)&lt;br /&gt;
  finally have &amp;quot;y^ ⋅ z = x&amp;quot; &lt;br /&gt;
    by this&lt;br /&gt;
  then show  &amp;quot;x = y^ ⋅ z&amp;quot; &lt;br /&gt;
    by (rule sym)&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones del teorema›&lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones automática del teorema›&lt;br /&gt;
&lt;br /&gt;
theorem condicion_necesaria_y_suficiente_A:&lt;br /&gt;
  &amp;quot;x = y^ ⋅ z ⟷ z = y  ⋅ x&amp;quot; &lt;br /&gt;
  using condicion_necesaria  &lt;br /&gt;
        condicion_suficiente &lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
section ‹Demostraciones declarativa detallada del teorema›&lt;br /&gt;
&lt;br /&gt;
theorem condicion_necesaria_y_suficiente:&lt;br /&gt;
  &amp;quot;x = y^ ⋅ z ⟷ z = y  ⋅ x&amp;quot; &lt;br /&gt;
proof (rule iffI)&lt;br /&gt;
  assume &amp;quot;x = y^ ⋅ z&amp;quot;&lt;br /&gt;
  then show &amp;quot;z = y ⋅ x&amp;quot;&lt;br /&gt;
    by (rule condicion_necesaria)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;z = y ⋅ x&amp;quot;&lt;br /&gt;
  then show &amp;quot;x = y^ ⋅ z&amp;quot;&lt;br /&gt;
    by (rule condicion_suficiente)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T5-1&amp;diff=1256</id>
		<title>T5-1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T5-1&amp;diff=1256"/>
		<updated>2020-06-17T15:36:03Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Protegió «T5-1» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
text ‹Ejercicio 5 de Lógica Matemática y Fundamentos (2-junio-2020)›&lt;br /&gt;
&lt;br /&gt;
theory ej_2_jun&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  Apellidos:&lt;br /&gt;
  Nombre: &lt;br /&gt;
› &lt;br /&gt;
&lt;br /&gt;
text ‹Sustituye la palabra ej_2_jun por tu usuario de la Universidad de&lt;br /&gt;
  Sevilla y graba el fichero con dicho usuario.thy› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 1: El tiempo de realización del ejercicio, incluida su&lt;br /&gt;
   entrega en la PEV, es de 15:30 a 17:30.› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 2: Además de las reglas básicas de deducción natural de la &lt;br /&gt;
  lógica proposicional y de primer orden, también se pueden usar las &lt;br /&gt;
  reglas notnotI y mt que demostramos a  continuación.›&lt;br /&gt;
&lt;br /&gt;
text ‹Nota 3: En el proceso de corrección del ejercicio, y antes de la&lt;br /&gt;
  publicación de las calificaciones del mismo, se podrá requerir&lt;br /&gt;
  aclaraciones sobre su respuesta. Estas aclaraciones se harán por &lt;br /&gt;
  alguno de los procedimientos virtuales previstos en la PEV. ›&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Consideremos el árbol binario definido por&lt;br /&gt;
     datatype &amp;#039;a arbol = H  &lt;br /&gt;
                       | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  Por ejemplo, el árbol&lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
             &lt;br /&gt;
  se representa por &amp;quot;N e (N c H H) (N g H H)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Se define las funciones&lt;br /&gt;
    fun nHojas :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
      &amp;quot;nHojas H         = 1&amp;quot;&lt;br /&gt;
    | &amp;quot;nHojas (N x i d) = nHojas i + nHojas d&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    fun nHojasAaux :: &amp;quot;&amp;#039;a arbol ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
      &amp;quot;nHojasAaux H         n = n + 1&amp;quot;&lt;br /&gt;
    | &amp;quot;nHojasAaux (N x i d) n = nHojasAaux i (nHojasAaux d n)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    definition nHojasA :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
      &amp;quot;nHojasA a ≡ nHojasAaux a 0&amp;quot;&lt;br /&gt;
  tales que&lt;br /&gt;
  + (nHojas a) es el número de hojas del árbol a. Por ejemplo, &lt;br /&gt;
       nHojas (N e (N c H H) (N g H H)) = 4&lt;br /&gt;
  + (nHojasAA a) es el número de hojas del árbol a, calculado &lt;br /&gt;
    con la función auxiliar nHojasAaux que el el segundo argumento va&lt;br /&gt;
    acumulando el resultado. Por ejemplo, &lt;br /&gt;
       nHojasA (N e (N c H H) (N g H H)) = 4&lt;br /&gt;
 &lt;br /&gt;
  Demostrar detalladamente que las funciones nHojas y nHojasA son&lt;br /&gt;
  equivalentes; es decir,&lt;br /&gt;
     nHojasA a = nHojas a&lt;br /&gt;
  -------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
section ‹Definiciones›&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = H  &lt;br /&gt;
                  | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun nHojas :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;nHojas H         = 1&amp;quot;&lt;br /&gt;
| &amp;quot;nHojas (N x i d) = nHojas i + nHojas d&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun nHojasAaux :: &amp;quot;&amp;#039;a arbol ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;nHojasAaux H         n = n + 1&amp;quot;&lt;br /&gt;
| &amp;quot;nHojasAaux (N x i d) n = nHojasAaux i (nHojasAaux d n)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
definition nHojasA :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;nHojasA a ≡ nHojasAaux a 0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;nHojas (N e (N c H H) (N g H H)) = 4&amp;quot;&lt;br /&gt;
value &amp;quot;nHojasA (N e (N c H H) (N g H H)) = 4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
― ‹Lema nHojasAux›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración en lenguaje natural›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada de nHojasAux›&lt;br /&gt;
&lt;br /&gt;
lemma nHojasAux:&lt;br /&gt;
  &amp;quot;nHojasAaux a n = (nHojas a) + n&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
― ‹Demostraciones de nHojasA›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración en lenguaje natural›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada›&lt;br /&gt;
&lt;br /&gt;
theorem nHojasA:&lt;br /&gt;
  &amp;quot;nHojasA a = nHojas a&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Sea G un grupo. Demostrar detalladamente lo siguiente:&lt;br /&gt;
     x = y^ ⋅ z si y sólo si z = y ⋅ x&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: auto, blast, force,&lt;br /&gt;
  fast, arith o metis &lt;br /&gt;
  ------------------------------------------------------------------ ›&lt;br /&gt;
&lt;br /&gt;
locale grupo =&lt;br /&gt;
  fixes prod :: &amp;quot;[&amp;#039;a, &amp;#039;a] ⇒ &amp;#039;a&amp;quot; (infixl &amp;quot;⋅&amp;quot; 70)&lt;br /&gt;
    and neutro (&amp;quot;𝟭&amp;quot;) &lt;br /&gt;
    and inverso (&amp;quot;_^&amp;quot; [100] 100)&lt;br /&gt;
  assumes asociativa: &amp;quot;(x ⋅ y) ⋅ z = x ⋅ (y ⋅ z)&amp;quot;&lt;br /&gt;
      and neutro_i:   &amp;quot;𝟭 ⋅ x = x&amp;quot;&lt;br /&gt;
      and neutro_d:   &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
      and inverso_i:  &amp;quot;x^ ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Notas sobre notación:&lt;br /&gt;
   * El producto es ⋅ y se escribe con \ cdot (sin espacio entre ellos). &lt;br /&gt;
   * El neutro es 𝟭 y se escribe con \ y one (sin espacio entre ellos).&lt;br /&gt;
   * El inverso de x es x^ y se escribe pulsando 2 veces en ^. *)&lt;br /&gt;
&lt;br /&gt;
context grupo&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada›&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  &amp;quot;x = y^ ⋅ z ⟷ z = y  ⋅ x&amp;quot; &lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T5-1&amp;diff=1255</id>
		<title>T5-1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T5-1&amp;diff=1255"/>
		<updated>2020-06-17T15:35:53Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con «&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;  text ‹Ejercicio 5 de Lógica Matemática y Fundamentos (2-junio-2020)›  theory ej_2_jun imports Main  begin  text ‹   Apellidos:   Nombre:…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
text ‹Ejercicio 5 de Lógica Matemática y Fundamentos (2-junio-2020)›&lt;br /&gt;
&lt;br /&gt;
theory ej_2_jun&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  Apellidos:&lt;br /&gt;
  Nombre: &lt;br /&gt;
› &lt;br /&gt;
&lt;br /&gt;
text ‹Sustituye la palabra ej_2_jun por tu usuario de la Universidad de&lt;br /&gt;
  Sevilla y graba el fichero con dicho usuario.thy› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 1: El tiempo de realización del ejercicio, incluida su&lt;br /&gt;
   entrega en la PEV, es de 15:30 a 17:30.› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 2: Además de las reglas básicas de deducción natural de la &lt;br /&gt;
  lógica proposicional y de primer orden, también se pueden usar las &lt;br /&gt;
  reglas notnotI y mt que demostramos a  continuación.›&lt;br /&gt;
&lt;br /&gt;
text ‹Nota 3: En el proceso de corrección del ejercicio, y antes de la&lt;br /&gt;
  publicación de las calificaciones del mismo, se podrá requerir&lt;br /&gt;
  aclaraciones sobre su respuesta. Estas aclaraciones se harán por &lt;br /&gt;
  alguno de los procedimientos virtuales previstos en la PEV. ›&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Consideremos el árbol binario definido por&lt;br /&gt;
     datatype &amp;#039;a arbol = H  &lt;br /&gt;
                       | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  Por ejemplo, el árbol&lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
             &lt;br /&gt;
  se representa por &amp;quot;N e (N c H H) (N g H H)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Se define las funciones&lt;br /&gt;
    fun nHojas :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
      &amp;quot;nHojas H         = 1&amp;quot;&lt;br /&gt;
    | &amp;quot;nHojas (N x i d) = nHojas i + nHojas d&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    fun nHojasAaux :: &amp;quot;&amp;#039;a arbol ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
      &amp;quot;nHojasAaux H         n = n + 1&amp;quot;&lt;br /&gt;
    | &amp;quot;nHojasAaux (N x i d) n = nHojasAaux i (nHojasAaux d n)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    definition nHojasA :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
      &amp;quot;nHojasA a ≡ nHojasAaux a 0&amp;quot;&lt;br /&gt;
  tales que&lt;br /&gt;
  + (nHojas a) es el número de hojas del árbol a. Por ejemplo, &lt;br /&gt;
       nHojas (N e (N c H H) (N g H H)) = 4&lt;br /&gt;
  + (nHojasAA a) es el número de hojas del árbol a, calculado &lt;br /&gt;
    con la función auxiliar nHojasAaux que el el segundo argumento va&lt;br /&gt;
    acumulando el resultado. Por ejemplo, &lt;br /&gt;
       nHojasA (N e (N c H H) (N g H H)) = 4&lt;br /&gt;
 &lt;br /&gt;
  Demostrar detalladamente que las funciones nHojas y nHojasA son&lt;br /&gt;
  equivalentes; es decir,&lt;br /&gt;
     nHojasA a = nHojas a&lt;br /&gt;
  -------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
section ‹Definiciones›&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = H  &lt;br /&gt;
                  | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun nHojas :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;nHojas H         = 1&amp;quot;&lt;br /&gt;
| &amp;quot;nHojas (N x i d) = nHojas i + nHojas d&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun nHojasAaux :: &amp;quot;&amp;#039;a arbol ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;nHojasAaux H         n = n + 1&amp;quot;&lt;br /&gt;
| &amp;quot;nHojasAaux (N x i d) n = nHojasAaux i (nHojasAaux d n)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
definition nHojasA :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;nHojasA a ≡ nHojasAaux a 0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;nHojas (N e (N c H H) (N g H H)) = 4&amp;quot;&lt;br /&gt;
value &amp;quot;nHojasA (N e (N c H H) (N g H H)) = 4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
― ‹Lema nHojasAux›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración en lenguaje natural›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada de nHojasAux›&lt;br /&gt;
&lt;br /&gt;
lemma nHojasAux:&lt;br /&gt;
  &amp;quot;nHojasAaux a n = (nHojas a) + n&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
― ‹Demostraciones de nHojasA›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración en lenguaje natural›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada›&lt;br /&gt;
&lt;br /&gt;
theorem nHojasA:&lt;br /&gt;
  &amp;quot;nHojasA a = nHojas a&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Sea G un grupo. Demostrar detalladamente lo siguiente:&lt;br /&gt;
     x = y^ ⋅ z si y sólo si z = y ⋅ x&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: auto, blast, force,&lt;br /&gt;
  fast, arith o metis &lt;br /&gt;
  ------------------------------------------------------------------ ›&lt;br /&gt;
&lt;br /&gt;
locale grupo =&lt;br /&gt;
  fixes prod :: &amp;quot;[&amp;#039;a, &amp;#039;a] ⇒ &amp;#039;a&amp;quot; (infixl &amp;quot;⋅&amp;quot; 70)&lt;br /&gt;
    and neutro (&amp;quot;𝟭&amp;quot;) &lt;br /&gt;
    and inverso (&amp;quot;_^&amp;quot; [100] 100)&lt;br /&gt;
  assumes asociativa: &amp;quot;(x ⋅ y) ⋅ z = x ⋅ (y ⋅ z)&amp;quot;&lt;br /&gt;
      and neutro_i:   &amp;quot;𝟭 ⋅ x = x&amp;quot;&lt;br /&gt;
      and neutro_d:   &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
      and inverso_i:  &amp;quot;x^ ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Notas sobre notación:&lt;br /&gt;
   * El producto es ⋅ y se escribe con \ cdot (sin espacio entre ellos). &lt;br /&gt;
   * El neutro es 𝟭 y se escribe con \ y one (sin espacio entre ellos).&lt;br /&gt;
   * El inverso de x es x^ y se escribe pulsando 2 veces en ^. *)&lt;br /&gt;
&lt;br /&gt;
context grupo&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada›&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  &amp;quot;x = y^ ⋅ z ⟷ z = y  ⋅ x&amp;quot; &lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Ejercicios&amp;diff=1254</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Ejercicios&amp;diff=1254"/>
		<updated>2020-06-17T15:34:26Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-19/ejercicios/ejercicios-LMF-2019-20.pdf libro de ejercicios].&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]], [[Relación 1 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R1_sol.pdf Una solución]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R2.thy Deducción natural proposicional con Isabelle] ([[R2 |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Rel 2 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R3.thy Deducción natural proposicional con Isabelle (II)] ([[R3 |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Rel 3 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4.thy Sintaxis y semántica de la lógica de primer orden.] ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4_sol.pdf Una solución]).).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R5.thy Deducción natural en lógica de primer orden.] ([[R5 |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Rel 5 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R6.thy Formalización y argumentación con Isabelle/HOL.] ([[R6 |Enunciado]], [[Relación 6 |Solución colaborativa]] , [[Rel 6 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R7.thy Deducción natural,formalización y argumentación en LPO con Isabelle/HOL.] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R8.thy Programación funcional en  Isabelle/HOL.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 8 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 8 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R9.thy Programación funcional en  Isabelle/HOL (II).] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 9 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 9 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1 (24-04-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T1 |Enunciado]], [[T1 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R10.thy Razonamiento sobre programas en Isabelle/HOL.] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 10 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL(II).] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 11 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R12.thy Razonamiento sobre programas en Isabelle/HOL(III).] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 12 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2 (12-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T2 |Enunciado]], [[T2 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R13.thy Recorridos de árboles.] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 13 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R14.thy Una axiomátización de la Geometría.] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 14 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3 (19-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T3 |Enunciado]], [[T3 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R15.thy Definiciones inductivas: clausuras.] ([[R15 |Enunciado]], [[Relación 15 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4 (26-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T4 |Enunciado]], [[T4 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 5 (02-06-2020)&amp;#039;&amp;#039;&amp;#039;: &lt;br /&gt;
** ([[T5-1 |Enunciado (1)]], [[T5-1 sol |Una solución]]).&lt;br /&gt;
** ([[T5-2 |Enunciado (2)]], [[T5-2 sol |Una solución]]).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Nota&amp;#039;&amp;#039;&amp;#039; Se pueden publicar las soluciones hasta el martes 31 de marzo.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]] y [[Sol 9 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R10.thy Programación funcional en Isabelle (2)] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]  y [[Sol 10 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]  y [[Sol 11 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R12.thy Recorridos de árboles en Isabelle/HOL] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]  y [[Sol 12 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R13.thy Definiciones inductivas: clausuras] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]  y [[Sol 13 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R14.thy Desarrollo de teorías axiomáticas] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]  y [[Sol 14 | una solución]]).&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T4_sol&amp;diff=1253</id>
		<title>T4 sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T4_sol&amp;diff=1253"/>
		<updated>2020-06-01T10:33:40Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Protegió «T4 sol» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
theory T4_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
  Se define la función&lt;br /&gt;
     elimina :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
  elementos de xs. Por ejemplo, &lt;br /&gt;
     elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n []           = []&amp;quot;&lt;br /&gt;
| &amp;quot;elimina 0 xs           = xs&amp;quot;&lt;br /&gt;
| &amp;quot;elimina (Suc n) (x#xs) = elimina n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio. Demostrar que &lt;br /&gt;
     length (elimina n xs) ≤ length xs - n&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Por inducción en n y xs según el esquema elimina.induct›&lt;br /&gt;
&lt;br /&gt;
― ‹Estructurada›&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof(induct n xs rule :elimina.induct)&lt;br /&gt;
  show &amp;quot;⋀n. length (elimina n []) ≤ length []&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
  show &amp;quot;⋀v va. length (elimina 0 (v # va)) ≤ length (v # va)&amp;quot;&lt;br /&gt;
  by simp&lt;br /&gt;
  next&lt;br /&gt;
  show &amp;quot;⋀n x xs.&lt;br /&gt;
       length (elimina n xs) ≤ length xs ⟹&lt;br /&gt;
       length (elimina (Suc n) (x # xs)) ≤ length (x # xs)&amp;quot;&lt;br /&gt;
       by simp&lt;br /&gt;
 qed&lt;br /&gt;
&lt;br /&gt;
― ‹Automática›&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  by (induct n xs rule :elimina.induct) simp_all&lt;br /&gt;
&lt;br /&gt;
― ‹Declarativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof(induct n xs rule :elimina.induct)&lt;br /&gt;
  fix n ::&amp;quot;nat&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina n []) ≤ length []&amp;quot; &lt;br /&gt;
    by (simp only: elimina.simps(1) list.size(3))&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and xs::&amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina 0 (x # xs)) ≤ length (x #xs)&amp;quot;&lt;br /&gt;
    by (simp only: elimina.simps(2) list.size(2))&lt;br /&gt;
next&lt;br /&gt;
  fix n ::&amp;quot;nat&amp;quot; and x::&amp;quot;&amp;#039;a&amp;quot; and xs::&amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume H:&amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length(elimina (Suc n) (x#xs)) = length(elimina n xs)&amp;quot;&lt;br /&gt;
    by (simp only: elimina.simps(3))&lt;br /&gt;
  also have &amp;quot;… ≤ length xs&amp;quot;&lt;br /&gt;
    using H by (simp only:)&lt;br /&gt;
  also have &amp;quot;… ≤ length (x#xs)&amp;quot;&lt;br /&gt;
    by (simp only: list.size(4))&lt;br /&gt;
  finally show &amp;quot;length(elimina (Suc n) (x#xs)) ≤ length (x#xs)&amp;quot;.&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
― ‹Aplicativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  apply (induct n xs rule :elimina.induct)&lt;br /&gt;
  apply (simp only: elimina.simps(1))&lt;br /&gt;
  apply (simp only: elimina.simps(2))&lt;br /&gt;
  apply (simp only: elimina.simps(3))&lt;br /&gt;
  apply (simp only: list.size)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹Por inducción en n con xs arbitrario›  &lt;br /&gt;
&lt;br /&gt;
― ‹Auxiliar›&lt;br /&gt;
lemma elimina0: &amp;quot;elimina 0 xs = xs&amp;quot;&lt;br /&gt;
  apply (cases xs) &lt;br /&gt;
  apply (simp only: elimina.simps(1))&lt;br /&gt;
  apply (simp only: elimina.simps(2))&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
― ‹Estructurada›  &lt;br /&gt;
lemma &amp;quot;length (elimina n xs) ≤ length xs - n&amp;quot;&lt;br /&gt;
proof (induct n arbitrary: xs)&lt;br /&gt;
   show &amp;quot;⋀xs. length (elimina 0 xs) ≤ length xs - 0&amp;quot; &lt;br /&gt;
   by (simp only: elimina0)&lt;br /&gt;
   next &lt;br /&gt;
    fix n :: nat and xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume HI: &amp;quot;⋀xs:: &amp;#039;a list. length (elimina n xs) ≤ length xs - n&amp;quot; &lt;br /&gt;
  show &amp;quot;length (elimina (Suc n) xs) ≤ length xs - (Suc n)&amp;quot;&lt;br /&gt;
  proof (cases xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  then show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
  case (Cons a list)&lt;br /&gt;
  then show ?thesis using HI by simp&lt;br /&gt;
  qed&lt;br /&gt;
 qed &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
― ‹Declarativa detallada›&lt;br /&gt;
lemma &amp;quot;length (elimina n xs) ≤ length xs - n&amp;quot;&lt;br /&gt;
proof (induct n arbitrary: xs)&lt;br /&gt;
  fix xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina 0 xs) ≤ length xs - 0&amp;quot; &lt;br /&gt;
    by (simp only: elimina0 list.size(3))&lt;br /&gt;
next&lt;br /&gt;
  fix n :: nat and xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume HI: &amp;quot;⋀xs:: &amp;#039;a list. length (elimina n xs) ≤ length xs - n&amp;quot; &lt;br /&gt;
  show &amp;quot;length (elimina (Suc n) xs) ≤ length xs - (Suc n)&amp;quot;&lt;br /&gt;
  proof (cases xs)&lt;br /&gt;
    assume &amp;quot;xs = []&amp;quot; &lt;br /&gt;
    then have &amp;quot;elimina (Suc n) xs = elimina (Suc n) []&amp;quot;&lt;br /&gt;
      by (rule arg_cong)&lt;br /&gt;
    also have &amp;quot;… = []&amp;quot; &lt;br /&gt;
      by (simp only: elimina.simps(1))&lt;br /&gt;
    finally have &amp;quot;elimina (Suc n) xs = []&amp;quot; &lt;br /&gt;
      by this&lt;br /&gt;
    then have &amp;quot;length (elimina (Suc n) xs) = 0&amp;quot; &lt;br /&gt;
      by (simp only: list.size(3)) &lt;br /&gt;
    then show &amp;quot;length (elimina (Suc n) xs) ≤ length xs - (Suc n)&amp;quot; &lt;br /&gt;
      by (simp only: list.size(3))&lt;br /&gt;
  next&lt;br /&gt;
    fix y:: &amp;quot;&amp;#039;a&amp;quot; and  ys :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
    assume 1: &amp;quot;xs = y # ys&amp;quot;&lt;br /&gt;
    have 2: &amp;quot;length (elimina n ys) ≤ length ys - n&amp;quot;&lt;br /&gt;
      using HI by this&lt;br /&gt;
    have &amp;quot;length (elimina (Suc n) xs) = length (elimina (Suc n) (y#ys))&amp;quot; &lt;br /&gt;
      using 1 by (rule arg_cong)&lt;br /&gt;
    also have &amp;quot;… = length (elimina n ys)&amp;quot; &lt;br /&gt;
      by (simp only: elimina.simps(3))&lt;br /&gt;
    also have &amp;quot;… ≤  length ys - n&amp;quot; &lt;br /&gt;
      using 2 by (simp only:)&lt;br /&gt;
    also have &amp;quot;… = 1 + length ys - (Suc n)&amp;quot; &lt;br /&gt;
      by (simp only: diff_Suc_Suc)&lt;br /&gt;
    also have &amp;quot;… = length (y#ys) - (Suc n)&amp;quot; &lt;br /&gt;
      by (simp only: list.size(4))&lt;br /&gt;
    also have &amp;quot;… = length xs - (Suc n)&amp;quot; &lt;br /&gt;
      using 1 by (simp only: list.size(4))&lt;br /&gt;
    finally show &amp;quot;length (elimina (Suc n) xs) ≤ length xs - (Suc n)&amp;quot; &lt;br /&gt;
      by this    &lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Aplicativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length (elimina n xs) ≤ length xs - n&amp;quot;&lt;br /&gt;
  apply (induct n arbitrary: xs)&lt;br /&gt;
   apply (simp only: elimina0)&lt;br /&gt;
  apply (case_tac xs)&lt;br /&gt;
   apply (simp only: elimina.simps)&lt;br /&gt;
   apply (simp only: list.size(3))&lt;br /&gt;
  apply (simp only: elimina.simps(3))&lt;br /&gt;
  apply (simp only: list.size(4))&lt;br /&gt;
  apply (simp only: add_Suc_right)&lt;br /&gt;
  apply (simp only: add.right_neutral)&lt;br /&gt;
  apply (simp only: diff_Suc_Suc)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración por inducción en xs con n arbitrario›&lt;br /&gt;
&lt;br /&gt;
― ‹Estructurada›&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs arbitrary: n)&lt;br /&gt;
  show &amp;quot;⋀n. length (elimina n []) ≤ length []&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
  fix n::&amp;quot;nat&amp;quot; and x::&amp;#039;a and xs:: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume HI: &amp;quot;  ⋀n. length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina n (x# xs)) ≤ length (x#xs)&amp;quot;&lt;br /&gt;
  proof(cases n)&lt;br /&gt;
  case 0&lt;br /&gt;
  then show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
  case (Suc nat)&lt;br /&gt;
  then show ?thesis using HI&lt;br /&gt;
  by (metis elimina.simps(3) list.size(4) trans_le_add1)&lt;br /&gt;
  qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
― ‹Declarativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs arbitrary: n)&lt;br /&gt;
  fix n::&amp;quot;nat&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina n []) ≤ length []&amp;quot; &lt;br /&gt;
     by (simp only: elimina.simps(1) list.size)&lt;br /&gt;
next&lt;br /&gt;
  fix n::&amp;quot;nat&amp;quot; and x::&amp;#039;a and xs:: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume HI: &amp;quot;  ⋀n. length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina n (x# xs)) ≤ length (x#xs)&amp;quot;&lt;br /&gt;
  proof(cases n)&lt;br /&gt;
    assume &amp;quot;n=0&amp;quot;&lt;br /&gt;
    then have &amp;quot;(elimina n (x# xs)) =(x#xs)&amp;quot; &lt;br /&gt;
      by (simp only: elimina.simps(2))&lt;br /&gt;
      then have &amp;quot;length (elimina n (x# xs)) = length (x#xs)&amp;quot;  &lt;br /&gt;
        by (rule arg_cong)&lt;br /&gt;
        then show  &amp;quot;length (elimina n (x# xs)) ≤ length (x#xs)&amp;quot; &lt;br /&gt;
          by (simp only: order_refl)&lt;br /&gt;
  next&lt;br /&gt;
    fix m:: nat&lt;br /&gt;
    assume &amp;quot;n=(Suc m)&amp;quot;&lt;br /&gt;
    then have &amp;quot;length (elimina n (x# xs)) = &lt;br /&gt;
               length (elimina (Suc m) (x# xs))&amp;quot; &lt;br /&gt;
                by (rule arg_cong)&lt;br /&gt;
    also have &amp;quot;… =length (elimina m xs)&amp;quot; &lt;br /&gt;
                by (simp only: elimina.simps(3))&lt;br /&gt;
    also have &amp;quot;… ≤ length xs&amp;quot; using HI by (simp only:)&lt;br /&gt;
    also have &amp;quot;… ≤ 1+length xs &amp;quot; by (simp only: le_add1)&lt;br /&gt;
    also have &amp;quot;…≤ length (x#xs)&amp;quot; by (simp only: list.size)&lt;br /&gt;
    finally show &amp;quot;length (elimina n (x# xs))≤length (x#xs)&amp;quot; &lt;br /&gt;
      by (simp only:)&lt;br /&gt;
  qed&lt;br /&gt;
  qed  &lt;br /&gt;
 &lt;br /&gt;
― ‹Aplicativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length (elimina n xs) ≤ length xs - n&amp;quot;&lt;br /&gt;
  apply (induct xs arbitrary: n)&lt;br /&gt;
  apply (simp only: elimina.simps(1) list.size)&lt;br /&gt;
  apply (case_tac n)&lt;br /&gt;
  apply (simp only: elimina.simps(2) list.size)&lt;br /&gt;
  apply (simp only: elimina.simps(3) list.size)&lt;br /&gt;
  apply (simp only:add_Suc_right)&lt;br /&gt;
  apply (simp only:add.right_neutral)&lt;br /&gt;
  apply (simp only: diff_Suc_Suc)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 2. Demostrar que si se verifica &lt;br /&gt;
     ∀x. (P x ⟶ (∃y. Q y))&lt;br /&gt;
  entonces se verifica &lt;br /&gt;
     ∀x. ∃y. (P x ⟶ Q y)&lt;br /&gt;
&lt;br /&gt;
  Nota: Hacer la demostración de forma detallada. Es opcional hacerla &lt;br /&gt;
  de forma declarativa o aplicativa.&lt;br /&gt;
  --------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración declarativa detallada›&lt;br /&gt;
  &lt;br /&gt;
lemma &lt;br /&gt;
    fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
    assumes &amp;quot;∀x. ∃y. (P x ⟶ Q y)&amp;quot;&lt;br /&gt;
    shows   &amp;quot;∀x. (P x ⟶ (∃y. Q y))&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;P x ⟶ (∃y. Q y)&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;P x&amp;quot;&lt;br /&gt;
    have &amp;quot; ∃y. (P x ⟶ Q y)&amp;quot; &lt;br /&gt;
      using assms by (rule allE)&lt;br /&gt;
    then obtain b where &amp;quot;P x ⟶ Q b&amp;quot; &lt;br /&gt;
      by (rule exE)&lt;br /&gt;
    then have &amp;quot;Q b&amp;quot; &lt;br /&gt;
      using ‹P x› by (rule mp)&lt;br /&gt;
    then show &amp;quot;∃y. Q y&amp;quot; &lt;br /&gt;
      by (rule exI) &lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración aplicativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
 &amp;quot;∀x. (P x ⟶ (∃y. Q y)) ⟹ ∀x. ∃y. (P x ⟶ Q y)&amp;quot;&lt;br /&gt;
  apply(rule allI)&lt;br /&gt;
  apply(erule_tac x = x in allE)&lt;br /&gt;
  apply(case_tac &amp;quot;P x&amp;quot;)&lt;br /&gt;
  apply(drule mp, assumption)&lt;br /&gt;
  apply(erule exE)&lt;br /&gt;
  apply (rule_tac x = y in exI)&lt;br /&gt;
  apply(rule impI, assumption)&lt;br /&gt;
  apply (rule exI)&lt;br /&gt;
  apply(rule impI)&lt;br /&gt;
  apply(erule notE, assumption)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T4&amp;diff=1252</id>
		<title>T4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T4&amp;diff=1252"/>
		<updated>2020-06-01T10:33:24Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Protegió «T4» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
text ‹Ejercicio 4 de Lógica Matemática y Fundamentos (26-mayo-2020)›&lt;br /&gt;
&lt;br /&gt;
theory uvus&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  Apellidos:&lt;br /&gt;
  Nombre: &lt;br /&gt;
› &lt;br /&gt;
&lt;br /&gt;
text ‹Sustituye la palabra uvus por tu usuario de la Universidad de&lt;br /&gt;
  Sevilla y graba el fichero con dicho usuario.thy› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 1: El tiempo de realización del ejercicio, incluida su&lt;br /&gt;
   entrega en la PEV, es de 15:30 a 16:30.› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 2: El segundo ejercicio se realizará de 16:00 a 17:00,&lt;br /&gt;
  estando disponible desde la PEV a partir de las 17:00 .› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 3: Además de las reglas básicas de deducción natural de la &lt;br /&gt;
  lógica proposicional y de primer orden, también se pueden usar las &lt;br /&gt;
  reglas notnotI y mt que demostramos a  continuación.›&lt;br /&gt;
&lt;br /&gt;
text ‹Nota 4: En el proceso de corrección del ejercicio, y antes de la&lt;br /&gt;
  publicación de las calificaciones del mismo, se podrá requerir&lt;br /&gt;
  aclaraciones sobre su respuesta. Estas aclaraciones se harán por &lt;br /&gt;
  alguno de los procedimientos virtuales previstos en la PEV. ›&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Se define la función&lt;br /&gt;
     elimina :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
  elementos de xs. Por ejemplo, &lt;br /&gt;
     elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n []           = []&amp;quot;&lt;br /&gt;
| &amp;quot;elimina 0 xs           = xs&amp;quot;&lt;br /&gt;
| &amp;quot;elimina (Suc n) (x#xs) = elimina n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio. Demostrar que &lt;br /&gt;
     length (elimina n xs) ≤ length xs&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración en lenguaje natural&lt;br /&gt;
&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada›&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 2. Demostrar que si se verifica &lt;br /&gt;
     ∀x. (P x ⟶ (∃y. Q y))&lt;br /&gt;
  entonces se verifica &lt;br /&gt;
     ∀x. ∃y. (P x ⟶ Q y)&lt;br /&gt;
&lt;br /&gt;
  Nota: Hacer la demostración de forma detallada. Es opcional hacerla &lt;br /&gt;
  de forma declarativa o aplicativa.&lt;br /&gt;
  --------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada›&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot;∀x. (P x ⟶ (∃y. Q y))&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. ∃y. (P x ⟶ Q y)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T4&amp;diff=1251</id>
		<title>T4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T4&amp;diff=1251"/>
		<updated>2020-06-01T10:33:15Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
text ‹Ejercicio 4 de Lógica Matemática y Fundamentos (26-mayo-2020)›&lt;br /&gt;
&lt;br /&gt;
theory uvus&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  Apellidos:&lt;br /&gt;
  Nombre: &lt;br /&gt;
› &lt;br /&gt;
&lt;br /&gt;
text ‹Sustituye la palabra uvus por tu usuario de la Universidad de&lt;br /&gt;
  Sevilla y graba el fichero con dicho usuario.thy› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 1: El tiempo de realización del ejercicio, incluida su&lt;br /&gt;
   entrega en la PEV, es de 15:30 a 16:30.› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 2: El segundo ejercicio se realizará de 16:00 a 17:00,&lt;br /&gt;
  estando disponible desde la PEV a partir de las 17:00 .› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 3: Además de las reglas básicas de deducción natural de la &lt;br /&gt;
  lógica proposicional y de primer orden, también se pueden usar las &lt;br /&gt;
  reglas notnotI y mt que demostramos a  continuación.›&lt;br /&gt;
&lt;br /&gt;
text ‹Nota 4: En el proceso de corrección del ejercicio, y antes de la&lt;br /&gt;
  publicación de las calificaciones del mismo, se podrá requerir&lt;br /&gt;
  aclaraciones sobre su respuesta. Estas aclaraciones se harán por &lt;br /&gt;
  alguno de los procedimientos virtuales previstos en la PEV. ›&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Se define la función&lt;br /&gt;
     elimina :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
  elementos de xs. Por ejemplo, &lt;br /&gt;
     elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n []           = []&amp;quot;&lt;br /&gt;
| &amp;quot;elimina 0 xs           = xs&amp;quot;&lt;br /&gt;
| &amp;quot;elimina (Suc n) (x#xs) = elimina n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio. Demostrar que &lt;br /&gt;
     length (elimina n xs) ≤ length xs&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración en lenguaje natural&lt;br /&gt;
&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada›&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 2. Demostrar que si se verifica &lt;br /&gt;
     ∀x. (P x ⟶ (∃y. Q y))&lt;br /&gt;
  entonces se verifica &lt;br /&gt;
     ∀x. ∃y. (P x ⟶ Q y)&lt;br /&gt;
&lt;br /&gt;
  Nota: Hacer la demostración de forma detallada. Es opcional hacerla &lt;br /&gt;
  de forma declarativa o aplicativa.&lt;br /&gt;
  --------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada›&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot;∀x. (P x ⟶ (∃y. Q y))&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. ∃y. (P x ⟶ Q y)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T4_sol&amp;diff=1250</id>
		<title>T4 sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T4_sol&amp;diff=1250"/>
		<updated>2020-06-01T10:29:44Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con «&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt; theory T4_sol imports Main  begin  lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;   by auto  lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;   by auto  text ‹-----------…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
theory T4_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
  Se define la función&lt;br /&gt;
     elimina :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
  elementos de xs. Por ejemplo, &lt;br /&gt;
     elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n []           = []&amp;quot;&lt;br /&gt;
| &amp;quot;elimina 0 xs           = xs&amp;quot;&lt;br /&gt;
| &amp;quot;elimina (Suc n) (x#xs) = elimina n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio. Demostrar que &lt;br /&gt;
     length (elimina n xs) ≤ length xs - n&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Por inducción en n y xs según el esquema elimina.induct›&lt;br /&gt;
&lt;br /&gt;
― ‹Estructurada›&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof(induct n xs rule :elimina.induct)&lt;br /&gt;
  show &amp;quot;⋀n. length (elimina n []) ≤ length []&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
  show &amp;quot;⋀v va. length (elimina 0 (v # va)) ≤ length (v # va)&amp;quot;&lt;br /&gt;
  by simp&lt;br /&gt;
  next&lt;br /&gt;
  show &amp;quot;⋀n x xs.&lt;br /&gt;
       length (elimina n xs) ≤ length xs ⟹&lt;br /&gt;
       length (elimina (Suc n) (x # xs)) ≤ length (x # xs)&amp;quot;&lt;br /&gt;
       by simp&lt;br /&gt;
 qed&lt;br /&gt;
&lt;br /&gt;
― ‹Automática›&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  by (induct n xs rule :elimina.induct) simp_all&lt;br /&gt;
&lt;br /&gt;
― ‹Declarativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof(induct n xs rule :elimina.induct)&lt;br /&gt;
  fix n ::&amp;quot;nat&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina n []) ≤ length []&amp;quot; &lt;br /&gt;
    by (simp only: elimina.simps(1) list.size(3))&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and xs::&amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina 0 (x # xs)) ≤ length (x #xs)&amp;quot;&lt;br /&gt;
    by (simp only: elimina.simps(2) list.size(2))&lt;br /&gt;
next&lt;br /&gt;
  fix n ::&amp;quot;nat&amp;quot; and x::&amp;quot;&amp;#039;a&amp;quot; and xs::&amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume H:&amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length(elimina (Suc n) (x#xs)) = length(elimina n xs)&amp;quot;&lt;br /&gt;
    by (simp only: elimina.simps(3))&lt;br /&gt;
  also have &amp;quot;… ≤ length xs&amp;quot;&lt;br /&gt;
    using H by (simp only:)&lt;br /&gt;
  also have &amp;quot;… ≤ length (x#xs)&amp;quot;&lt;br /&gt;
    by (simp only: list.size(4))&lt;br /&gt;
  finally show &amp;quot;length(elimina (Suc n) (x#xs)) ≤ length (x#xs)&amp;quot;.&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
― ‹Aplicativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  apply (induct n xs rule :elimina.induct)&lt;br /&gt;
  apply (simp only: elimina.simps(1))&lt;br /&gt;
  apply (simp only: elimina.simps(2))&lt;br /&gt;
  apply (simp only: elimina.simps(3))&lt;br /&gt;
  apply (simp only: list.size)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹Por inducción en n con xs arbitrario›  &lt;br /&gt;
&lt;br /&gt;
― ‹Auxiliar›&lt;br /&gt;
lemma elimina0: &amp;quot;elimina 0 xs = xs&amp;quot;&lt;br /&gt;
  apply (cases xs) &lt;br /&gt;
  apply (simp only: elimina.simps(1))&lt;br /&gt;
  apply (simp only: elimina.simps(2))&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
― ‹Estructurada›  &lt;br /&gt;
lemma &amp;quot;length (elimina n xs) ≤ length xs - n&amp;quot;&lt;br /&gt;
proof (induct n arbitrary: xs)&lt;br /&gt;
   show &amp;quot;⋀xs. length (elimina 0 xs) ≤ length xs - 0&amp;quot; &lt;br /&gt;
   by (simp only: elimina0)&lt;br /&gt;
   next &lt;br /&gt;
    fix n :: nat and xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume HI: &amp;quot;⋀xs:: &amp;#039;a list. length (elimina n xs) ≤ length xs - n&amp;quot; &lt;br /&gt;
  show &amp;quot;length (elimina (Suc n) xs) ≤ length xs - (Suc n)&amp;quot;&lt;br /&gt;
  proof (cases xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  then show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
  case (Cons a list)&lt;br /&gt;
  then show ?thesis using HI by simp&lt;br /&gt;
  qed&lt;br /&gt;
 qed &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
― ‹Declarativa detallada›&lt;br /&gt;
lemma &amp;quot;length (elimina n xs) ≤ length xs - n&amp;quot;&lt;br /&gt;
proof (induct n arbitrary: xs)&lt;br /&gt;
  fix xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina 0 xs) ≤ length xs - 0&amp;quot; &lt;br /&gt;
    by (simp only: elimina0 list.size(3))&lt;br /&gt;
next&lt;br /&gt;
  fix n :: nat and xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume HI: &amp;quot;⋀xs:: &amp;#039;a list. length (elimina n xs) ≤ length xs - n&amp;quot; &lt;br /&gt;
  show &amp;quot;length (elimina (Suc n) xs) ≤ length xs - (Suc n)&amp;quot;&lt;br /&gt;
  proof (cases xs)&lt;br /&gt;
    assume &amp;quot;xs = []&amp;quot; &lt;br /&gt;
    then have &amp;quot;elimina (Suc n) xs = elimina (Suc n) []&amp;quot;&lt;br /&gt;
      by (rule arg_cong)&lt;br /&gt;
    also have &amp;quot;… = []&amp;quot; &lt;br /&gt;
      by (simp only: elimina.simps(1))&lt;br /&gt;
    finally have &amp;quot;elimina (Suc n) xs = []&amp;quot; &lt;br /&gt;
      by this&lt;br /&gt;
    then have &amp;quot;length (elimina (Suc n) xs) = 0&amp;quot; &lt;br /&gt;
      by (simp only: list.size(3)) &lt;br /&gt;
    then show &amp;quot;length (elimina (Suc n) xs) ≤ length xs - (Suc n)&amp;quot; &lt;br /&gt;
      by (simp only: list.size(3))&lt;br /&gt;
  next&lt;br /&gt;
    fix y:: &amp;quot;&amp;#039;a&amp;quot; and  ys :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
    assume 1: &amp;quot;xs = y # ys&amp;quot;&lt;br /&gt;
    have 2: &amp;quot;length (elimina n ys) ≤ length ys - n&amp;quot;&lt;br /&gt;
      using HI by this&lt;br /&gt;
    have &amp;quot;length (elimina (Suc n) xs) = length (elimina (Suc n) (y#ys))&amp;quot; &lt;br /&gt;
      using 1 by (rule arg_cong)&lt;br /&gt;
    also have &amp;quot;… = length (elimina n ys)&amp;quot; &lt;br /&gt;
      by (simp only: elimina.simps(3))&lt;br /&gt;
    also have &amp;quot;… ≤  length ys - n&amp;quot; &lt;br /&gt;
      using 2 by (simp only:)&lt;br /&gt;
    also have &amp;quot;… = 1 + length ys - (Suc n)&amp;quot; &lt;br /&gt;
      by (simp only: diff_Suc_Suc)&lt;br /&gt;
    also have &amp;quot;… = length (y#ys) - (Suc n)&amp;quot; &lt;br /&gt;
      by (simp only: list.size(4))&lt;br /&gt;
    also have &amp;quot;… = length xs - (Suc n)&amp;quot; &lt;br /&gt;
      using 1 by (simp only: list.size(4))&lt;br /&gt;
    finally show &amp;quot;length (elimina (Suc n) xs) ≤ length xs - (Suc n)&amp;quot; &lt;br /&gt;
      by this    &lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Aplicativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length (elimina n xs) ≤ length xs - n&amp;quot;&lt;br /&gt;
  apply (induct n arbitrary: xs)&lt;br /&gt;
   apply (simp only: elimina0)&lt;br /&gt;
  apply (case_tac xs)&lt;br /&gt;
   apply (simp only: elimina.simps)&lt;br /&gt;
   apply (simp only: list.size(3))&lt;br /&gt;
  apply (simp only: elimina.simps(3))&lt;br /&gt;
  apply (simp only: list.size(4))&lt;br /&gt;
  apply (simp only: add_Suc_right)&lt;br /&gt;
  apply (simp only: add.right_neutral)&lt;br /&gt;
  apply (simp only: diff_Suc_Suc)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración por inducción en xs con n arbitrario›&lt;br /&gt;
&lt;br /&gt;
― ‹Estructurada›&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs arbitrary: n)&lt;br /&gt;
  show &amp;quot;⋀n. length (elimina n []) ≤ length []&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
  fix n::&amp;quot;nat&amp;quot; and x::&amp;#039;a and xs:: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume HI: &amp;quot;  ⋀n. length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina n (x# xs)) ≤ length (x#xs)&amp;quot;&lt;br /&gt;
  proof(cases n)&lt;br /&gt;
  case 0&lt;br /&gt;
  then show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
  case (Suc nat)&lt;br /&gt;
  then show ?thesis using HI&lt;br /&gt;
  by (metis elimina.simps(3) list.size(4) trans_le_add1)&lt;br /&gt;
  qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
― ‹Declarativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs arbitrary: n)&lt;br /&gt;
  fix n::&amp;quot;nat&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina n []) ≤ length []&amp;quot; &lt;br /&gt;
     by (simp only: elimina.simps(1) list.size)&lt;br /&gt;
next&lt;br /&gt;
  fix n::&amp;quot;nat&amp;quot; and x::&amp;#039;a and xs:: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume HI: &amp;quot;  ⋀n. length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina n (x# xs)) ≤ length (x#xs)&amp;quot;&lt;br /&gt;
  proof(cases n)&lt;br /&gt;
    assume &amp;quot;n=0&amp;quot;&lt;br /&gt;
    then have &amp;quot;(elimina n (x# xs)) =(x#xs)&amp;quot; &lt;br /&gt;
      by (simp only: elimina.simps(2))&lt;br /&gt;
      then have &amp;quot;length (elimina n (x# xs)) = length (x#xs)&amp;quot;  &lt;br /&gt;
        by (rule arg_cong)&lt;br /&gt;
        then show  &amp;quot;length (elimina n (x# xs)) ≤ length (x#xs)&amp;quot; &lt;br /&gt;
          by (simp only: order_refl)&lt;br /&gt;
  next&lt;br /&gt;
    fix m:: nat&lt;br /&gt;
    assume &amp;quot;n=(Suc m)&amp;quot;&lt;br /&gt;
    then have &amp;quot;length (elimina n (x# xs)) = &lt;br /&gt;
               length (elimina (Suc m) (x# xs))&amp;quot; &lt;br /&gt;
                by (rule arg_cong)&lt;br /&gt;
    also have &amp;quot;… =length (elimina m xs)&amp;quot; &lt;br /&gt;
                by (simp only: elimina.simps(3))&lt;br /&gt;
    also have &amp;quot;… ≤ length xs&amp;quot; using HI by (simp only:)&lt;br /&gt;
    also have &amp;quot;… ≤ 1+length xs &amp;quot; by (simp only: le_add1)&lt;br /&gt;
    also have &amp;quot;…≤ length (x#xs)&amp;quot; by (simp only: list.size)&lt;br /&gt;
    finally show &amp;quot;length (elimina n (x# xs))≤length (x#xs)&amp;quot; &lt;br /&gt;
      by (simp only:)&lt;br /&gt;
  qed&lt;br /&gt;
  qed  &lt;br /&gt;
 &lt;br /&gt;
― ‹Aplicativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length (elimina n xs) ≤ length xs - n&amp;quot;&lt;br /&gt;
  apply (induct xs arbitrary: n)&lt;br /&gt;
  apply (simp only: elimina.simps(1) list.size)&lt;br /&gt;
  apply (case_tac n)&lt;br /&gt;
  apply (simp only: elimina.simps(2) list.size)&lt;br /&gt;
  apply (simp only: elimina.simps(3) list.size)&lt;br /&gt;
  apply (simp only:add_Suc_right)&lt;br /&gt;
  apply (simp only:add.right_neutral)&lt;br /&gt;
  apply (simp only: diff_Suc_Suc)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 2. Demostrar que si se verifica &lt;br /&gt;
     ∀x. (P x ⟶ (∃y. Q y))&lt;br /&gt;
  entonces se verifica &lt;br /&gt;
     ∀x. ∃y. (P x ⟶ Q y)&lt;br /&gt;
&lt;br /&gt;
  Nota: Hacer la demostración de forma detallada. Es opcional hacerla &lt;br /&gt;
  de forma declarativa o aplicativa.&lt;br /&gt;
  --------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración declarativa detallada›&lt;br /&gt;
  &lt;br /&gt;
lemma &lt;br /&gt;
    fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
    assumes &amp;quot;∀x. ∃y. (P x ⟶ Q y)&amp;quot;&lt;br /&gt;
    shows   &amp;quot;∀x. (P x ⟶ (∃y. Q y))&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;P x ⟶ (∃y. Q y)&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;P x&amp;quot;&lt;br /&gt;
    have &amp;quot; ∃y. (P x ⟶ Q y)&amp;quot; &lt;br /&gt;
      using assms by (rule allE)&lt;br /&gt;
    then obtain b where &amp;quot;P x ⟶ Q b&amp;quot; &lt;br /&gt;
      by (rule exE)&lt;br /&gt;
    then have &amp;quot;Q b&amp;quot; &lt;br /&gt;
      using ‹P x› by (rule mp)&lt;br /&gt;
    then show &amp;quot;∃y. Q y&amp;quot; &lt;br /&gt;
      by (rule exI) &lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración aplicativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
 &amp;quot;∀x. (P x ⟶ (∃y. Q y)) ⟹ ∀x. ∃y. (P x ⟶ Q y)&amp;quot;&lt;br /&gt;
  apply(rule allI)&lt;br /&gt;
  apply(erule_tac x = x in allE)&lt;br /&gt;
  apply(case_tac &amp;quot;P x&amp;quot;)&lt;br /&gt;
  apply(drule mp, assumption)&lt;br /&gt;
  apply(erule exE)&lt;br /&gt;
  apply (rule_tac x = y in exI)&lt;br /&gt;
  apply(rule impI, assumption)&lt;br /&gt;
  apply (rule exI)&lt;br /&gt;
  apply(rule impI)&lt;br /&gt;
  apply(erule notE, assumption)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T4&amp;diff=1249</id>
		<title>T4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T4&amp;diff=1249"/>
		<updated>2020-06-01T10:28:35Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
theory T4_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
  Se define la función&lt;br /&gt;
     elimina :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
  elementos de xs. Por ejemplo, &lt;br /&gt;
     elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n []           = []&amp;quot;&lt;br /&gt;
| &amp;quot;elimina 0 xs           = xs&amp;quot;&lt;br /&gt;
| &amp;quot;elimina (Suc n) (x#xs) = elimina n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio. Demostrar que &lt;br /&gt;
     length (elimina n xs) ≤ length xs - n&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Por inducción en n y xs según el esquema elimina.induct›&lt;br /&gt;
&lt;br /&gt;
― ‹Estructurada›&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof(induct n xs rule :elimina.induct)&lt;br /&gt;
  show &amp;quot;⋀n. length (elimina n []) ≤ length []&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
  show &amp;quot;⋀v va. length (elimina 0 (v # va)) ≤ length (v # va)&amp;quot;&lt;br /&gt;
  by simp&lt;br /&gt;
  next&lt;br /&gt;
  show &amp;quot;⋀n x xs.&lt;br /&gt;
       length (elimina n xs) ≤ length xs ⟹&lt;br /&gt;
       length (elimina (Suc n) (x # xs)) ≤ length (x # xs)&amp;quot;&lt;br /&gt;
       by simp&lt;br /&gt;
 qed&lt;br /&gt;
&lt;br /&gt;
― ‹Automática›&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  by (induct n xs rule :elimina.induct) simp_all&lt;br /&gt;
&lt;br /&gt;
― ‹Declarativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof(induct n xs rule :elimina.induct)&lt;br /&gt;
  fix n ::&amp;quot;nat&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina n []) ≤ length []&amp;quot; &lt;br /&gt;
    by (simp only: elimina.simps(1) list.size(3))&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and xs::&amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina 0 (x # xs)) ≤ length (x #xs)&amp;quot;&lt;br /&gt;
    by (simp only: elimina.simps(2) list.size(2))&lt;br /&gt;
next&lt;br /&gt;
  fix n ::&amp;quot;nat&amp;quot; and x::&amp;quot;&amp;#039;a&amp;quot; and xs::&amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume H:&amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length(elimina (Suc n) (x#xs)) = length(elimina n xs)&amp;quot;&lt;br /&gt;
    by (simp only: elimina.simps(3))&lt;br /&gt;
  also have &amp;quot;… ≤ length xs&amp;quot;&lt;br /&gt;
    using H by (simp only:)&lt;br /&gt;
  also have &amp;quot;… ≤ length (x#xs)&amp;quot;&lt;br /&gt;
    by (simp only: list.size(4))&lt;br /&gt;
  finally show &amp;quot;length(elimina (Suc n) (x#xs)) ≤ length (x#xs)&amp;quot;.&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
― ‹Aplicativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  apply (induct n xs rule :elimina.induct)&lt;br /&gt;
  apply (simp only: elimina.simps(1))&lt;br /&gt;
  apply (simp only: elimina.simps(2))&lt;br /&gt;
  apply (simp only: elimina.simps(3))&lt;br /&gt;
  apply (simp only: list.size)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹Por inducción en n con xs arbitrario›  &lt;br /&gt;
&lt;br /&gt;
― ‹Auxiliar›&lt;br /&gt;
lemma elimina0: &amp;quot;elimina 0 xs = xs&amp;quot;&lt;br /&gt;
  apply (cases xs) &lt;br /&gt;
  apply (simp only: elimina.simps(1))&lt;br /&gt;
  apply (simp only: elimina.simps(2))&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
― ‹Estructurada›  &lt;br /&gt;
lemma &amp;quot;length (elimina n xs) ≤ length xs - n&amp;quot;&lt;br /&gt;
proof (induct n arbitrary: xs)&lt;br /&gt;
   show &amp;quot;⋀xs. length (elimina 0 xs) ≤ length xs - 0&amp;quot; &lt;br /&gt;
   by (simp only: elimina0)&lt;br /&gt;
   next &lt;br /&gt;
    fix n :: nat and xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume HI: &amp;quot;⋀xs:: &amp;#039;a list. length (elimina n xs) ≤ length xs - n&amp;quot; &lt;br /&gt;
  show &amp;quot;length (elimina (Suc n) xs) ≤ length xs - (Suc n)&amp;quot;&lt;br /&gt;
  proof (cases xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  then show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
  case (Cons a list)&lt;br /&gt;
  then show ?thesis using HI by simp&lt;br /&gt;
  qed&lt;br /&gt;
 qed &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
― ‹Declarativa detallada›&lt;br /&gt;
lemma &amp;quot;length (elimina n xs) ≤ length xs - n&amp;quot;&lt;br /&gt;
proof (induct n arbitrary: xs)&lt;br /&gt;
  fix xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina 0 xs) ≤ length xs - 0&amp;quot; &lt;br /&gt;
    by (simp only: elimina0 list.size(3))&lt;br /&gt;
next&lt;br /&gt;
  fix n :: nat and xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume HI: &amp;quot;⋀xs:: &amp;#039;a list. length (elimina n xs) ≤ length xs - n&amp;quot; &lt;br /&gt;
  show &amp;quot;length (elimina (Suc n) xs) ≤ length xs - (Suc n)&amp;quot;&lt;br /&gt;
  proof (cases xs)&lt;br /&gt;
    assume &amp;quot;xs = []&amp;quot; &lt;br /&gt;
    then have &amp;quot;elimina (Suc n) xs = elimina (Suc n) []&amp;quot;&lt;br /&gt;
      by (rule arg_cong)&lt;br /&gt;
    also have &amp;quot;… = []&amp;quot; &lt;br /&gt;
      by (simp only: elimina.simps(1))&lt;br /&gt;
    finally have &amp;quot;elimina (Suc n) xs = []&amp;quot; &lt;br /&gt;
      by this&lt;br /&gt;
    then have &amp;quot;length (elimina (Suc n) xs) = 0&amp;quot; &lt;br /&gt;
      by (simp only: list.size(3)) &lt;br /&gt;
    then show &amp;quot;length (elimina (Suc n) xs) ≤ length xs - (Suc n)&amp;quot; &lt;br /&gt;
      by (simp only: list.size(3))&lt;br /&gt;
  next&lt;br /&gt;
    fix y:: &amp;quot;&amp;#039;a&amp;quot; and  ys :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
    assume 1: &amp;quot;xs = y # ys&amp;quot;&lt;br /&gt;
    have 2: &amp;quot;length (elimina n ys) ≤ length ys - n&amp;quot;&lt;br /&gt;
      using HI by this&lt;br /&gt;
    have &amp;quot;length (elimina (Suc n) xs) = length (elimina (Suc n) (y#ys))&amp;quot; &lt;br /&gt;
      using 1 by (rule arg_cong)&lt;br /&gt;
    also have &amp;quot;… = length (elimina n ys)&amp;quot; &lt;br /&gt;
      by (simp only: elimina.simps(3))&lt;br /&gt;
    also have &amp;quot;… ≤  length ys - n&amp;quot; &lt;br /&gt;
      using 2 by (simp only:)&lt;br /&gt;
    also have &amp;quot;… = 1 + length ys - (Suc n)&amp;quot; &lt;br /&gt;
      by (simp only: diff_Suc_Suc)&lt;br /&gt;
    also have &amp;quot;… = length (y#ys) - (Suc n)&amp;quot; &lt;br /&gt;
      by (simp only: list.size(4))&lt;br /&gt;
    also have &amp;quot;… = length xs - (Suc n)&amp;quot; &lt;br /&gt;
      using 1 by (simp only: list.size(4))&lt;br /&gt;
    finally show &amp;quot;length (elimina (Suc n) xs) ≤ length xs - (Suc n)&amp;quot; &lt;br /&gt;
      by this    &lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Aplicativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length (elimina n xs) ≤ length xs - n&amp;quot;&lt;br /&gt;
  apply (induct n arbitrary: xs)&lt;br /&gt;
   apply (simp only: elimina0)&lt;br /&gt;
  apply (case_tac xs)&lt;br /&gt;
   apply (simp only: elimina.simps)&lt;br /&gt;
   apply (simp only: list.size(3))&lt;br /&gt;
  apply (simp only: elimina.simps(3))&lt;br /&gt;
  apply (simp only: list.size(4))&lt;br /&gt;
  apply (simp only: add_Suc_right)&lt;br /&gt;
  apply (simp only: add.right_neutral)&lt;br /&gt;
  apply (simp only: diff_Suc_Suc)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración por inducción en xs con n arbitrario›&lt;br /&gt;
&lt;br /&gt;
― ‹Estructurada›&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs arbitrary: n)&lt;br /&gt;
  show &amp;quot;⋀n. length (elimina n []) ≤ length []&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
  fix n::&amp;quot;nat&amp;quot; and x::&amp;#039;a and xs:: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume HI: &amp;quot;  ⋀n. length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina n (x# xs)) ≤ length (x#xs)&amp;quot;&lt;br /&gt;
  proof(cases n)&lt;br /&gt;
  case 0&lt;br /&gt;
  then show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
  case (Suc nat)&lt;br /&gt;
  then show ?thesis using HI&lt;br /&gt;
  by (metis elimina.simps(3) list.size(4) trans_le_add1)&lt;br /&gt;
  qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
― ‹Declarativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs arbitrary: n)&lt;br /&gt;
  fix n::&amp;quot;nat&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina n []) ≤ length []&amp;quot; &lt;br /&gt;
     by (simp only: elimina.simps(1) list.size)&lt;br /&gt;
next&lt;br /&gt;
  fix n::&amp;quot;nat&amp;quot; and x::&amp;#039;a and xs:: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume HI: &amp;quot;  ⋀n. length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina n (x# xs)) ≤ length (x#xs)&amp;quot;&lt;br /&gt;
  proof(cases n)&lt;br /&gt;
    assume &amp;quot;n=0&amp;quot;&lt;br /&gt;
    then have &amp;quot;(elimina n (x# xs)) =(x#xs)&amp;quot; &lt;br /&gt;
      by (simp only: elimina.simps(2))&lt;br /&gt;
      then have &amp;quot;length (elimina n (x# xs)) = length (x#xs)&amp;quot;  &lt;br /&gt;
        by (rule arg_cong)&lt;br /&gt;
        then show  &amp;quot;length (elimina n (x# xs)) ≤ length (x#xs)&amp;quot; &lt;br /&gt;
          by (simp only: order_refl)&lt;br /&gt;
  next&lt;br /&gt;
    fix m:: nat&lt;br /&gt;
    assume &amp;quot;n=(Suc m)&amp;quot;&lt;br /&gt;
    then have &amp;quot;length (elimina n (x# xs)) = &lt;br /&gt;
               length (elimina (Suc m) (x# xs))&amp;quot; &lt;br /&gt;
                by (rule arg_cong)&lt;br /&gt;
    also have &amp;quot;… =length (elimina m xs)&amp;quot; &lt;br /&gt;
                by (simp only: elimina.simps(3))&lt;br /&gt;
    also have &amp;quot;… ≤ length xs&amp;quot; using HI by (simp only:)&lt;br /&gt;
    also have &amp;quot;… ≤ 1+length xs &amp;quot; by (simp only: le_add1)&lt;br /&gt;
    also have &amp;quot;…≤ length (x#xs)&amp;quot; by (simp only: list.size)&lt;br /&gt;
    finally show &amp;quot;length (elimina n (x# xs))≤length (x#xs)&amp;quot; &lt;br /&gt;
      by (simp only:)&lt;br /&gt;
  qed&lt;br /&gt;
  qed  &lt;br /&gt;
 &lt;br /&gt;
― ‹Aplicativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length (elimina n xs) ≤ length xs - n&amp;quot;&lt;br /&gt;
  apply (induct xs arbitrary: n)&lt;br /&gt;
  apply (simp only: elimina.simps(1) list.size)&lt;br /&gt;
  apply (case_tac n)&lt;br /&gt;
  apply (simp only: elimina.simps(2) list.size)&lt;br /&gt;
  apply (simp only: elimina.simps(3) list.size)&lt;br /&gt;
  apply (simp only:add_Suc_right)&lt;br /&gt;
  apply (simp only:add.right_neutral)&lt;br /&gt;
  apply (simp only: diff_Suc_Suc)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 2. Demostrar que si se verifica &lt;br /&gt;
     ∀x. (P x ⟶ (∃y. Q y))&lt;br /&gt;
  entonces se verifica &lt;br /&gt;
     ∀x. ∃y. (P x ⟶ Q y)&lt;br /&gt;
&lt;br /&gt;
  Nota: Hacer la demostración de forma detallada. Es opcional hacerla &lt;br /&gt;
  de forma declarativa o aplicativa.&lt;br /&gt;
  --------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración declarativa detallada›&lt;br /&gt;
  &lt;br /&gt;
lemma &lt;br /&gt;
    fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
    assumes &amp;quot;∀x. ∃y. (P x ⟶ Q y)&amp;quot;&lt;br /&gt;
    shows   &amp;quot;∀x. (P x ⟶ (∃y. Q y))&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;P x ⟶ (∃y. Q y)&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;P x&amp;quot;&lt;br /&gt;
    have &amp;quot; ∃y. (P x ⟶ Q y)&amp;quot; &lt;br /&gt;
      using assms by (rule allE)&lt;br /&gt;
    then obtain b where &amp;quot;P x ⟶ Q b&amp;quot; &lt;br /&gt;
      by (rule exE)&lt;br /&gt;
    then have &amp;quot;Q b&amp;quot; &lt;br /&gt;
      using ‹P x› by (rule mp)&lt;br /&gt;
    then show &amp;quot;∃y. Q y&amp;quot; &lt;br /&gt;
      by (rule exI) &lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración aplicativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
 &amp;quot;∀x. (P x ⟶ (∃y. Q y)) ⟹ ∀x. ∃y. (P x ⟶ Q y)&amp;quot;&lt;br /&gt;
  apply(rule allI)&lt;br /&gt;
  apply(erule_tac x = x in allE)&lt;br /&gt;
  apply(case_tac &amp;quot;P x&amp;quot;)&lt;br /&gt;
  apply(drule mp, assumption)&lt;br /&gt;
  apply(erule exE)&lt;br /&gt;
  apply (rule_tac x = y in exI)&lt;br /&gt;
  apply(rule impI, assumption)&lt;br /&gt;
  apply (rule exI)&lt;br /&gt;
  apply(rule impI)&lt;br /&gt;
  apply(erule notE, assumption)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/source&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T4&amp;diff=1248</id>
		<title>T4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T4&amp;diff=1248"/>
		<updated>2020-06-01T10:28:17Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con «&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt; theory T4_sol imports Main  begin  lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;   by auto  lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;   by auto  text ‹-----------…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
theory T4_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
  Se define la función&lt;br /&gt;
     elimina :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
  elementos de xs. Por ejemplo, &lt;br /&gt;
     elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n []           = []&amp;quot;&lt;br /&gt;
| &amp;quot;elimina 0 xs           = xs&amp;quot;&lt;br /&gt;
| &amp;quot;elimina (Suc n) (x#xs) = elimina n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio. Demostrar que &lt;br /&gt;
     length (elimina n xs) ≤ length xs - n&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Por inducción en n y xs según el esquema elimina.induct›&lt;br /&gt;
&lt;br /&gt;
― ‹Estructurada›&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof(induct n xs rule :elimina.induct)&lt;br /&gt;
  show &amp;quot;⋀n. length (elimina n []) ≤ length []&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
  show &amp;quot;⋀v va. length (elimina 0 (v # va)) ≤ length (v # va)&amp;quot;&lt;br /&gt;
  by simp&lt;br /&gt;
  next&lt;br /&gt;
  show &amp;quot;⋀n x xs.&lt;br /&gt;
       length (elimina n xs) ≤ length xs ⟹&lt;br /&gt;
       length (elimina (Suc n) (x # xs)) ≤ length (x # xs)&amp;quot;&lt;br /&gt;
       by simp&lt;br /&gt;
 qed&lt;br /&gt;
&lt;br /&gt;
― ‹Automática›&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  by (induct n xs rule :elimina.induct) simp_all&lt;br /&gt;
&lt;br /&gt;
― ‹Declarativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof(induct n xs rule :elimina.induct)&lt;br /&gt;
  fix n ::&amp;quot;nat&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina n []) ≤ length []&amp;quot; &lt;br /&gt;
    by (simp only: elimina.simps(1) list.size(3))&lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; and xs::&amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina 0 (x # xs)) ≤ length (x #xs)&amp;quot;&lt;br /&gt;
    by (simp only: elimina.simps(2) list.size(2))&lt;br /&gt;
next&lt;br /&gt;
  fix n ::&amp;quot;nat&amp;quot; and x::&amp;quot;&amp;#039;a&amp;quot; and xs::&amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume H:&amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  have &amp;quot;length(elimina (Suc n) (x#xs)) = length(elimina n xs)&amp;quot;&lt;br /&gt;
    by (simp only: elimina.simps(3))&lt;br /&gt;
  also have &amp;quot;… ≤ length xs&amp;quot;&lt;br /&gt;
    using H by (simp only:)&lt;br /&gt;
  also have &amp;quot;… ≤ length (x#xs)&amp;quot;&lt;br /&gt;
    by (simp only: list.size(4))&lt;br /&gt;
  finally show &amp;quot;length(elimina (Suc n) (x#xs)) ≤ length (x#xs)&amp;quot;.&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
― ‹Aplicativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  apply (induct n xs rule :elimina.induct)&lt;br /&gt;
  apply (simp only: elimina.simps(1))&lt;br /&gt;
  apply (simp only: elimina.simps(2))&lt;br /&gt;
  apply (simp only: elimina.simps(3))&lt;br /&gt;
  apply (simp only: list.size)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹Por inducción en n con xs arbitrario›  &lt;br /&gt;
&lt;br /&gt;
― ‹Auxiliar›&lt;br /&gt;
lemma elimina0: &amp;quot;elimina 0 xs = xs&amp;quot;&lt;br /&gt;
  apply (cases xs) &lt;br /&gt;
  apply (simp only: elimina.simps(1))&lt;br /&gt;
  apply (simp only: elimina.simps(2))&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
― ‹Estructurada›  &lt;br /&gt;
lemma &amp;quot;length (elimina n xs) ≤ length xs - n&amp;quot;&lt;br /&gt;
proof (induct n arbitrary: xs)&lt;br /&gt;
   show &amp;quot;⋀xs. length (elimina 0 xs) ≤ length xs - 0&amp;quot; &lt;br /&gt;
   by (simp only: elimina0)&lt;br /&gt;
   next &lt;br /&gt;
    fix n :: nat and xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume HI: &amp;quot;⋀xs:: &amp;#039;a list. length (elimina n xs) ≤ length xs - n&amp;quot; &lt;br /&gt;
  show &amp;quot;length (elimina (Suc n) xs) ≤ length xs - (Suc n)&amp;quot;&lt;br /&gt;
  proof (cases xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  then show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
  case (Cons a list)&lt;br /&gt;
  then show ?thesis using HI by simp&lt;br /&gt;
  qed&lt;br /&gt;
 qed &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
― ‹Declarativa detallada›&lt;br /&gt;
lemma &amp;quot;length (elimina n xs) ≤ length xs - n&amp;quot;&lt;br /&gt;
proof (induct n arbitrary: xs)&lt;br /&gt;
  fix xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina 0 xs) ≤ length xs - 0&amp;quot; &lt;br /&gt;
    by (simp only: elimina0 list.size(3))&lt;br /&gt;
next&lt;br /&gt;
  fix n :: nat and xs :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume HI: &amp;quot;⋀xs:: &amp;#039;a list. length (elimina n xs) ≤ length xs - n&amp;quot; &lt;br /&gt;
  show &amp;quot;length (elimina (Suc n) xs) ≤ length xs - (Suc n)&amp;quot;&lt;br /&gt;
  proof (cases xs)&lt;br /&gt;
    assume &amp;quot;xs = []&amp;quot; &lt;br /&gt;
    then have &amp;quot;elimina (Suc n) xs = elimina (Suc n) []&amp;quot;&lt;br /&gt;
      by (rule arg_cong)&lt;br /&gt;
    also have &amp;quot;… = []&amp;quot; &lt;br /&gt;
      by (simp only: elimina.simps(1))&lt;br /&gt;
    finally have &amp;quot;elimina (Suc n) xs = []&amp;quot; &lt;br /&gt;
      by this&lt;br /&gt;
    then have &amp;quot;length (elimina (Suc n) xs) = 0&amp;quot; &lt;br /&gt;
      by (simp only: list.size(3)) &lt;br /&gt;
    then show &amp;quot;length (elimina (Suc n) xs) ≤ length xs - (Suc n)&amp;quot; &lt;br /&gt;
      by (simp only: list.size(3))&lt;br /&gt;
  next&lt;br /&gt;
    fix y:: &amp;quot;&amp;#039;a&amp;quot; and  ys :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
    assume 1: &amp;quot;xs = y # ys&amp;quot;&lt;br /&gt;
    have 2: &amp;quot;length (elimina n ys) ≤ length ys - n&amp;quot;&lt;br /&gt;
      using HI by this&lt;br /&gt;
    have &amp;quot;length (elimina (Suc n) xs) = length (elimina (Suc n) (y#ys))&amp;quot; &lt;br /&gt;
      using 1 by (rule arg_cong)&lt;br /&gt;
    also have &amp;quot;… = length (elimina n ys)&amp;quot; &lt;br /&gt;
      by (simp only: elimina.simps(3))&lt;br /&gt;
    also have &amp;quot;… ≤  length ys - n&amp;quot; &lt;br /&gt;
      using 2 by (simp only:)&lt;br /&gt;
    also have &amp;quot;… = 1 + length ys - (Suc n)&amp;quot; &lt;br /&gt;
      by (simp only: diff_Suc_Suc)&lt;br /&gt;
    also have &amp;quot;… = length (y#ys) - (Suc n)&amp;quot; &lt;br /&gt;
      by (simp only: list.size(4))&lt;br /&gt;
    also have &amp;quot;… = length xs - (Suc n)&amp;quot; &lt;br /&gt;
      using 1 by (simp only: list.size(4))&lt;br /&gt;
    finally show &amp;quot;length (elimina (Suc n) xs) ≤ length xs - (Suc n)&amp;quot; &lt;br /&gt;
      by this    &lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Aplicativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length (elimina n xs) ≤ length xs - n&amp;quot;&lt;br /&gt;
  apply (induct n arbitrary: xs)&lt;br /&gt;
   apply (simp only: elimina0)&lt;br /&gt;
  apply (case_tac xs)&lt;br /&gt;
   apply (simp only: elimina.simps)&lt;br /&gt;
   apply (simp only: list.size(3))&lt;br /&gt;
  apply (simp only: elimina.simps(3))&lt;br /&gt;
  apply (simp only: list.size(4))&lt;br /&gt;
  apply (simp only: add_Suc_right)&lt;br /&gt;
  apply (simp only: add.right_neutral)&lt;br /&gt;
  apply (simp only: diff_Suc_Suc)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración por inducción en xs con n arbitrario›&lt;br /&gt;
&lt;br /&gt;
― ‹Estructurada›&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs arbitrary: n)&lt;br /&gt;
  show &amp;quot;⋀n. length (elimina n []) ≤ length []&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
  fix n::&amp;quot;nat&amp;quot; and x::&amp;#039;a and xs:: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume HI: &amp;quot;  ⋀n. length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina n (x# xs)) ≤ length (x#xs)&amp;quot;&lt;br /&gt;
  proof(cases n)&lt;br /&gt;
  case 0&lt;br /&gt;
  then show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
  case (Suc nat)&lt;br /&gt;
  then show ?thesis using HI&lt;br /&gt;
  by (metis elimina.simps(3) list.size(4) trans_le_add1)&lt;br /&gt;
  qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
― ‹Declarativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma  &amp;quot;length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
proof (induct xs arbitrary: n)&lt;br /&gt;
  fix n::&amp;quot;nat&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina n []) ≤ length []&amp;quot; &lt;br /&gt;
     by (simp only: elimina.simps(1) list.size)&lt;br /&gt;
next&lt;br /&gt;
  fix n::&amp;quot;nat&amp;quot; and x::&amp;#039;a and xs:: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  assume HI: &amp;quot;  ⋀n. length (elimina n xs) ≤ length xs&amp;quot;&lt;br /&gt;
  show &amp;quot;length (elimina n (x# xs)) ≤ length (x#xs)&amp;quot;&lt;br /&gt;
  proof(cases n)&lt;br /&gt;
    assume &amp;quot;n=0&amp;quot;&lt;br /&gt;
    then have &amp;quot;(elimina n (x# xs)) =(x#xs)&amp;quot; &lt;br /&gt;
      by (simp only: elimina.simps(2))&lt;br /&gt;
      then have &amp;quot;length (elimina n (x# xs)) = length (x#xs)&amp;quot;  &lt;br /&gt;
        by (rule arg_cong)&lt;br /&gt;
        then show  &amp;quot;length (elimina n (x# xs)) ≤ length (x#xs)&amp;quot; &lt;br /&gt;
          by (simp only: order_refl)&lt;br /&gt;
  next&lt;br /&gt;
    fix m:: nat&lt;br /&gt;
    assume &amp;quot;n=(Suc m)&amp;quot;&lt;br /&gt;
    then have &amp;quot;length (elimina n (x# xs)) = &lt;br /&gt;
               length (elimina (Suc m) (x# xs))&amp;quot; &lt;br /&gt;
                by (rule arg_cong)&lt;br /&gt;
    also have &amp;quot;… =length (elimina m xs)&amp;quot; &lt;br /&gt;
                by (simp only: elimina.simps(3))&lt;br /&gt;
    also have &amp;quot;… ≤ length xs&amp;quot; using HI by (simp only:)&lt;br /&gt;
    also have &amp;quot;… ≤ 1+length xs &amp;quot; by (simp only: le_add1)&lt;br /&gt;
    also have &amp;quot;…≤ length (x#xs)&amp;quot; by (simp only: list.size)&lt;br /&gt;
    finally show &amp;quot;length (elimina n (x# xs))≤length (x#xs)&amp;quot; &lt;br /&gt;
      by (simp only:)&lt;br /&gt;
  qed&lt;br /&gt;
  qed  &lt;br /&gt;
 &lt;br /&gt;
― ‹Aplicativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;length (elimina n xs) ≤ length xs - n&amp;quot;&lt;br /&gt;
  apply (induct xs arbitrary: n)&lt;br /&gt;
  apply (simp only: elimina.simps(1) list.size)&lt;br /&gt;
  apply (case_tac n)&lt;br /&gt;
  apply (simp only: elimina.simps(2) list.size)&lt;br /&gt;
  apply (simp only: elimina.simps(3) list.size)&lt;br /&gt;
  apply (simp only:add_Suc_right)&lt;br /&gt;
  apply (simp only:add.right_neutral)&lt;br /&gt;
  apply (simp only: diff_Suc_Suc)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 2. Demostrar que si se verifica &lt;br /&gt;
     ∀x. (P x ⟶ (∃y. Q y))&lt;br /&gt;
  entonces se verifica &lt;br /&gt;
     ∀x. ∃y. (P x ⟶ Q y)&lt;br /&gt;
&lt;br /&gt;
  Nota: Hacer la demostración de forma detallada. Es opcional hacerla &lt;br /&gt;
  de forma declarativa o aplicativa.&lt;br /&gt;
  --------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración declarativa detallada›&lt;br /&gt;
  &lt;br /&gt;
lemma &lt;br /&gt;
    fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
    assumes &amp;quot;∀x. ∃y. (P x ⟶ Q y)&amp;quot;&lt;br /&gt;
    shows   &amp;quot;∀x. (P x ⟶ (∃y. Q y))&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;P x ⟶ (∃y. Q y)&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;P x&amp;quot;&lt;br /&gt;
    have &amp;quot; ∃y. (P x ⟶ Q y)&amp;quot; &lt;br /&gt;
      using assms by (rule allE)&lt;br /&gt;
    then obtain b where &amp;quot;P x ⟶ Q b&amp;quot; &lt;br /&gt;
      by (rule exE)&lt;br /&gt;
    then have &amp;quot;Q b&amp;quot; &lt;br /&gt;
      using ‹P x› by (rule mp)&lt;br /&gt;
    then show &amp;quot;∃y. Q y&amp;quot; &lt;br /&gt;
      by (rule exI) &lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración aplicativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
 &amp;quot;∀x. (P x ⟶ (∃y. Q y)) ⟹ ∀x. ∃y. (P x ⟶ Q y)&amp;quot;&lt;br /&gt;
  apply(rule allI)&lt;br /&gt;
  apply(erule_tac x = x in allE)&lt;br /&gt;
  apply(case_tac &amp;quot;P x&amp;quot;)&lt;br /&gt;
  apply(drule mp, assumption)&lt;br /&gt;
  apply(erule exE)&lt;br /&gt;
  apply (rule_tac x = y in exI)&lt;br /&gt;
  apply(rule impI, assumption)&lt;br /&gt;
  apply (rule exI)&lt;br /&gt;
  apply(rule impI)&lt;br /&gt;
  apply(erule notE, assumption)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/isabelle&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Ejercicios&amp;diff=1247</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Ejercicios&amp;diff=1247"/>
		<updated>2020-06-01T10:05:05Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-19/ejercicios/ejercicios-LMF-2019-20.pdf libro de ejercicios].&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]], [[Relación 1 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R1_sol.pdf Una solución]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R2.thy Deducción natural proposicional con Isabelle] ([[R2 |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Rel 2 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R3.thy Deducción natural proposicional con Isabelle (II)] ([[R3 |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Rel 3 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4.thy Sintaxis y semántica de la lógica de primer orden.] ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4_sol.pdf Una solución]).).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R5.thy Deducción natural en lógica de primer orden.] ([[R5 |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Rel 5 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R6.thy Formalización y argumentación con Isabelle/HOL.] ([[R6 |Enunciado]], [[Relación 6 |Solución colaborativa]] , [[Rel 6 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R7.thy Deducción natural,formalización y argumentación en LPO con Isabelle/HOL.] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R8.thy Programación funcional en  Isabelle/HOL.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 8 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 8 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R9.thy Programación funcional en  Isabelle/HOL (II).] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 9 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 9 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1 (24-04-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T1 |Enunciado]], [[T1 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R10.thy Razonamiento sobre programas en Isabelle/HOL.] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 10 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL(II).] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 11 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R12.thy Razonamiento sobre programas en Isabelle/HOL(III).] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 12 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2 (12-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T2 |Enunciado]], [[T2 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R13.thy Recorridos de árboles.] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 13 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R14.thy Una axiomátización de la Geometría.] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 14 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3 (19-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T3 |Enunciado]], [[T3 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R15.thy Definiciones inductivas: clausuras.] ([[R15 |Enunciado]], [[Relación 15 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4 (26-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T4 |Enunciado]], [[T4 sol |Una solución]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Nota&amp;#039;&amp;#039;&amp;#039; Se pueden publicar las soluciones hasta el martes 31 de marzo.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]] y [[Sol 9 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R10.thy Programación funcional en Isabelle (2)] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]  y [[Sol 10 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]  y [[Sol 11 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R12.thy Recorridos de árboles en Isabelle/HOL] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]  y [[Sol 12 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R13.thy Definiciones inductivas: clausuras] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]  y [[Sol 13 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R14.thy Desarrollo de teorías axiomáticas] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]  y [[Sol 14 | una solución]]).&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T3_sol&amp;diff=1245</id>
		<title>T3 sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T3_sol&amp;diff=1245"/>
		<updated>2020-05-28T09:39:28Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Protegió «T3 sol» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
text ‹Ejercicio 3 de Lógica Matemática y Fundamentos (19-mayo-2020)›&lt;br /&gt;
&lt;br /&gt;
theory uvus_3_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  Apellidos:&lt;br /&gt;
  Nombre: &lt;br /&gt;
› &lt;br /&gt;
&lt;br /&gt;
text ‹Sustituye la palabra uvus por tu usuario de la Universidad de&lt;br /&gt;
  Sevilla y graba el fichero con dicho usuario.thy› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 1: El tiempo de realización del ejercicio es de 15:30 a 17:00.&lt;br /&gt;
  A continuación, se dispone de 30 minutos para su entrega en la PEV.› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 2: Además de las reglas básicas de deducción natural de la &lt;br /&gt;
  lógica proposicional y de primer orden, también se pueden usar las &lt;br /&gt;
  reglas notnotI y mt que demostramos a  continuación.›&lt;br /&gt;
&lt;br /&gt;
text ‹Nota 3: En el proceso de corrección del ejercicio, y antes de la&lt;br /&gt;
  publicación de las calificaciones del mismo, se podrá requerir&lt;br /&gt;
  aclaraciones sobre su respuesta. Estas aclaraciones se harán por &lt;br /&gt;
  alguno de los procedimientos virtuales previstos en la PEV.›&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Se define la función&lt;br /&gt;
     elimina :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
  elementos de xs. Por ejemplo, &lt;br /&gt;
     elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n []             = []&amp;quot;&lt;br /&gt;
| &amp;quot;elimina 0 xs             = xs&amp;quot;&lt;br /&gt;
| &amp;quot;elimina (Suc n) (x # xs) = elimina n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina 2 [a,c,d,b,e] = [d,b,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Se define la función&lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x []       = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a # xs) = (a = x ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1: Demostrar que&lt;br /&gt;
     estaEn x (elimina n xs) ⟶ estaEn x xs&lt;br /&gt;
&lt;br /&gt;
  + En lenguaje natural&lt;br /&gt;
  + En Isabelle/HOL, de forma detallada. Es opcional hacerlo de forma&lt;br /&gt;
    declarativa o aplicativa.&lt;br /&gt;
&lt;br /&gt;
  Nota: Es recomendable pasar de la demostración en lenguaje natural a la &lt;br /&gt;
  demostración estructurada. Y, a continuación, detallar los pasos de &lt;br /&gt;
  simplificación hasta llegar a usar sólo el método (simp only:..).&lt;br /&gt;
 ----------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración declarativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;estaEn x (elimina n xs) ⟶ estaEn x xs&amp;quot;&lt;br /&gt;
proof (induct rule: elimina.induct)&lt;br /&gt;
  fix n &lt;br /&gt;
  show &amp;quot;estaEn x (elimina n []) ⟶ estaEn x []&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;estaEn x (elimina n [])&amp;quot;&lt;br /&gt;
    then show &amp;quot;estaEn x []&amp;quot; &lt;br /&gt;
      by (simp only: elimina.simps(1))&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  fix y ys&lt;br /&gt;
  show &amp;quot;estaEn x (elimina 0 (y # ys)) ⟶ estaEn x (y # ys)&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;estaEn x (elimina 0 (y # ys))&amp;quot;&lt;br /&gt;
    then show &amp;quot;estaEn x (y # ys)&amp;quot; &lt;br /&gt;
      by (simp only: elimina.simps(2))&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  fix n y ys&lt;br /&gt;
  assume 1: &amp;quot;estaEn x (elimina n ys) ⟶ estaEn x ys&amp;quot;&lt;br /&gt;
  show &amp;quot;estaEn x (elimina (Suc n) (y # ys)) ⟶ estaEn x (y # ys)&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;estaEn x (elimina (Suc n) (y # ys))&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn x (elimina n ys)&amp;quot; &lt;br /&gt;
      by (simp only: elimina.simps(3))&lt;br /&gt;
    with 1 have &amp;quot;estaEn x ys&amp;quot; &lt;br /&gt;
      by (rule mp)&lt;br /&gt;
    then have &amp;quot;y = x ∨ estaEn x ys&amp;quot; &lt;br /&gt;
      by (rule disjI2)&lt;br /&gt;
    then show &amp;quot;estaEn x (y # ys)&amp;quot; &lt;br /&gt;
      by (simp only: estaEn.simps(2))&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración aplicativa detallada (1)›&lt;br /&gt;
lemma eliminaEsta:&lt;br /&gt;
  &amp;quot;estaEn x (elimina n xs) ⟹ estaEn x xs&amp;quot;&lt;br /&gt;
  apply (induct rule: elimina.induct)&lt;br /&gt;
    apply (simp only: elimina.simps(1))&lt;br /&gt;
   apply (simp only: elimina.simps(2) estaEn.simps(1))&lt;br /&gt;
  apply (simp only: elimina.simps(3))&lt;br /&gt;
  apply (simp only: estaEn.simps(2))&lt;br /&gt;
  apply (rule disjI2)&lt;br /&gt;
  apply (simp only: implies_True_equals)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;estaEn x (elimina n xs) ⟶ estaEn x xs&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (simp only: eliminaEsta)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración aplicativa detallada (2)›&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;estaEn x (elimina n xs) ⟶ estaEn x xs&amp;quot;&lt;br /&gt;
  apply (induct rule: elimina.induct)&lt;br /&gt;
    apply (simp only: elimina.simps(1) estaEn.simps(1))&lt;br /&gt;
    apply (rule impI, assumption)&lt;br /&gt;
   apply (simp only: elimina.simps(2) estaEn.simps(1))&lt;br /&gt;
   apply (rule impI, assumption)&lt;br /&gt;
  apply (simp only: elimina.simps(3))&lt;br /&gt;
  apply (simp only: estaEn.simps(2))&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule disjI2)&lt;br /&gt;
  apply (erule mp, assumption)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 2. Demostrar que si la relación binaria R verifica la &lt;br /&gt;
  siguiente condición&lt;br /&gt;
     ∃y z. (∀x. ¬R(x, y)) ∨ (∀x. ¬R(x, z)))&lt;br /&gt;
  entonces no se verifica que&lt;br /&gt;
    ∀y z. ∃x. (R(x,y) ∧ R(x,z)))&lt;br /&gt;
  --------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración declarativa detallada›&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;(∃y z. ((∀x. ¬R(x, y)) ∨ (∀x. ¬R(x, z))))&lt;br /&gt;
  ⟶ ¬ (∀y z. ∃x. (R(x,y) ∧ R(x,z)))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 0: &amp;quot;∃y z. ((∀x. ¬R(x, y)) ∨ (∀x. ¬R(x, z)))&amp;quot;&lt;br /&gt;
  show &amp;quot;¬ (∀y z. ∃x. (R(x,y) ∧ R(x,z)))&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume 1: &amp;quot;∀y. ∀z. ∃x. (R(x,y) ∧ R(x,z))&amp;quot;&lt;br /&gt;
    obtain b where &amp;quot;∃z. ((∀x. ¬R(x, b)) ∨ (∀x. ¬R(x, z)))&amp;quot; &lt;br /&gt;
      using 0 by (rule exE)&lt;br /&gt;
    then obtain c where 2: &amp;quot;((∀x. ¬R(x, b)) ∨ (∀x. ¬R(x, c)))&amp;quot; &lt;br /&gt;
      by (rule exE)&lt;br /&gt;
    have &amp;quot;∀z. ∃x. (R(x,b) ∧ R(x,z))&amp;quot; &lt;br /&gt;
      using 1 by (rule allE)&lt;br /&gt;
    then have &amp;quot;∃x. (R(x,b) ∧ R(x,c))&amp;quot; &lt;br /&gt;
      by (rule allE)&lt;br /&gt;
    then obtain a where 3 :&amp;quot;R(a,b) ∧ R(a,c)&amp;quot; &lt;br /&gt;
      by (rule exE)&lt;br /&gt;
    show False&lt;br /&gt;
      using 2&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
      assume &amp;quot;∀x. ¬ R (x, b)&amp;quot;&lt;br /&gt;
      then have &amp;quot;¬R(a,b)&amp;quot; &lt;br /&gt;
        by (rule allE)&lt;br /&gt;
      have &amp;quot;R(a,b)&amp;quot; &lt;br /&gt;
        using 3 by (rule conjunct1)&lt;br /&gt;
      with `¬R(a,b)` show False&lt;br /&gt;
        by (rule notE)&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;∀x. ¬ R (x, c)&amp;quot;&lt;br /&gt;
      then have &amp;quot;¬R(a,c)&amp;quot; &lt;br /&gt;
        by (rule allE)&lt;br /&gt;
      have &amp;quot;R(a,c)&amp;quot; &lt;br /&gt;
        using 3 by (rule conjunct2)&lt;br /&gt;
      with `¬R(a,c)` show False &lt;br /&gt;
        by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración aplicativa detallada›&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;(∃y z. ((∀x. ¬R(x,y)) ∨ (∀x. ¬R(x,z)))) &lt;br /&gt;
  ⟶ ¬( ∀y z. ∃x. (R(x,y) ∧ R(x,z)))&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule exE)+&lt;br /&gt;
  apply (erule_tac x = y in allE)&lt;br /&gt;
  apply (erule_tac x = z in allE)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule exE)&lt;br /&gt;
   apply (erule_tac x = x in allE)&lt;br /&gt;
   apply (erule notE)&lt;br /&gt;
   apply (erule conjunct1)&lt;br /&gt;
  apply (erule exE)&lt;br /&gt;
  apply (erule_tac x = x in allE)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply (erule conjunct2)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T3_sol&amp;diff=1244</id>
		<title>T3 sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T3_sol&amp;diff=1244"/>
		<updated>2020-05-28T09:39:19Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con «&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;  text ‹Ejercicio 3 de Lógica Matemática y Fundamentos (19-mayo-2020)›  theory uvus_3_sol imports Main  begin  text ‹   Apellidos:   Nombr…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
text ‹Ejercicio 3 de Lógica Matemática y Fundamentos (19-mayo-2020)›&lt;br /&gt;
&lt;br /&gt;
theory uvus_3_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  Apellidos:&lt;br /&gt;
  Nombre: &lt;br /&gt;
› &lt;br /&gt;
&lt;br /&gt;
text ‹Sustituye la palabra uvus por tu usuario de la Universidad de&lt;br /&gt;
  Sevilla y graba el fichero con dicho usuario.thy› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 1: El tiempo de realización del ejercicio es de 15:30 a 17:00.&lt;br /&gt;
  A continuación, se dispone de 30 minutos para su entrega en la PEV.› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 2: Además de las reglas básicas de deducción natural de la &lt;br /&gt;
  lógica proposicional y de primer orden, también se pueden usar las &lt;br /&gt;
  reglas notnotI y mt que demostramos a  continuación.›&lt;br /&gt;
&lt;br /&gt;
text ‹Nota 3: En el proceso de corrección del ejercicio, y antes de la&lt;br /&gt;
  publicación de las calificaciones del mismo, se podrá requerir&lt;br /&gt;
  aclaraciones sobre su respuesta. Estas aclaraciones se harán por &lt;br /&gt;
  alguno de los procedimientos virtuales previstos en la PEV.›&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Se define la función&lt;br /&gt;
     elimina :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
  elementos de xs. Por ejemplo, &lt;br /&gt;
     elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n []             = []&amp;quot;&lt;br /&gt;
| &amp;quot;elimina 0 xs             = xs&amp;quot;&lt;br /&gt;
| &amp;quot;elimina (Suc n) (x # xs) = elimina n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina 2 [a,c,d,b,e] = [d,b,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Se define la función&lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x []       = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a # xs) = (a = x ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1: Demostrar que&lt;br /&gt;
     estaEn x (elimina n xs) ⟶ estaEn x xs&lt;br /&gt;
&lt;br /&gt;
  + En lenguaje natural&lt;br /&gt;
  + En Isabelle/HOL, de forma detallada. Es opcional hacerlo de forma&lt;br /&gt;
    declarativa o aplicativa.&lt;br /&gt;
&lt;br /&gt;
  Nota: Es recomendable pasar de la demostración en lenguaje natural a la &lt;br /&gt;
  demostración estructurada. Y, a continuación, detallar los pasos de &lt;br /&gt;
  simplificación hasta llegar a usar sólo el método (simp only:..).&lt;br /&gt;
 ----------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración declarativa detallada›&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;estaEn x (elimina n xs) ⟶ estaEn x xs&amp;quot;&lt;br /&gt;
proof (induct rule: elimina.induct)&lt;br /&gt;
  fix n &lt;br /&gt;
  show &amp;quot;estaEn x (elimina n []) ⟶ estaEn x []&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;estaEn x (elimina n [])&amp;quot;&lt;br /&gt;
    then show &amp;quot;estaEn x []&amp;quot; &lt;br /&gt;
      by (simp only: elimina.simps(1))&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  fix y ys&lt;br /&gt;
  show &amp;quot;estaEn x (elimina 0 (y # ys)) ⟶ estaEn x (y # ys)&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;estaEn x (elimina 0 (y # ys))&amp;quot;&lt;br /&gt;
    then show &amp;quot;estaEn x (y # ys)&amp;quot; &lt;br /&gt;
      by (simp only: elimina.simps(2))&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  fix n y ys&lt;br /&gt;
  assume 1: &amp;quot;estaEn x (elimina n ys) ⟶ estaEn x ys&amp;quot;&lt;br /&gt;
  show &amp;quot;estaEn x (elimina (Suc n) (y # ys)) ⟶ estaEn x (y # ys)&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;estaEn x (elimina (Suc n) (y # ys))&amp;quot;&lt;br /&gt;
    then have &amp;quot;estaEn x (elimina n ys)&amp;quot; &lt;br /&gt;
      by (simp only: elimina.simps(3))&lt;br /&gt;
    with 1 have &amp;quot;estaEn x ys&amp;quot; &lt;br /&gt;
      by (rule mp)&lt;br /&gt;
    then have &amp;quot;y = x ∨ estaEn x ys&amp;quot; &lt;br /&gt;
      by (rule disjI2)&lt;br /&gt;
    then show &amp;quot;estaEn x (y # ys)&amp;quot; &lt;br /&gt;
      by (simp only: estaEn.simps(2))&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración aplicativa detallada (1)›&lt;br /&gt;
lemma eliminaEsta:&lt;br /&gt;
  &amp;quot;estaEn x (elimina n xs) ⟹ estaEn x xs&amp;quot;&lt;br /&gt;
  apply (induct rule: elimina.induct)&lt;br /&gt;
    apply (simp only: elimina.simps(1))&lt;br /&gt;
   apply (simp only: elimina.simps(2) estaEn.simps(1))&lt;br /&gt;
  apply (simp only: elimina.simps(3))&lt;br /&gt;
  apply (simp only: estaEn.simps(2))&lt;br /&gt;
  apply (rule disjI2)&lt;br /&gt;
  apply (simp only: implies_True_equals)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;estaEn x (elimina n xs) ⟶ estaEn x xs&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (simp only: eliminaEsta)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración aplicativa detallada (2)›&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;estaEn x (elimina n xs) ⟶ estaEn x xs&amp;quot;&lt;br /&gt;
  apply (induct rule: elimina.induct)&lt;br /&gt;
    apply (simp only: elimina.simps(1) estaEn.simps(1))&lt;br /&gt;
    apply (rule impI, assumption)&lt;br /&gt;
   apply (simp only: elimina.simps(2) estaEn.simps(1))&lt;br /&gt;
   apply (rule impI, assumption)&lt;br /&gt;
  apply (simp only: elimina.simps(3))&lt;br /&gt;
  apply (simp only: estaEn.simps(2))&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule disjI2)&lt;br /&gt;
  apply (erule mp, assumption)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 2. Demostrar que si la relación binaria R verifica la &lt;br /&gt;
  siguiente condición&lt;br /&gt;
     ∃y z. (∀x. ¬R(x, y)) ∨ (∀x. ¬R(x, z)))&lt;br /&gt;
  entonces no se verifica que&lt;br /&gt;
    ∀y z. ∃x. (R(x,y) ∧ R(x,z)))&lt;br /&gt;
  --------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración declarativa detallada›&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;(∃y z. ((∀x. ¬R(x, y)) ∨ (∀x. ¬R(x, z))))&lt;br /&gt;
  ⟶ ¬ (∀y z. ∃x. (R(x,y) ∧ R(x,z)))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 0: &amp;quot;∃y z. ((∀x. ¬R(x, y)) ∨ (∀x. ¬R(x, z)))&amp;quot;&lt;br /&gt;
  show &amp;quot;¬ (∀y z. ∃x. (R(x,y) ∧ R(x,z)))&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume 1: &amp;quot;∀y. ∀z. ∃x. (R(x,y) ∧ R(x,z))&amp;quot;&lt;br /&gt;
    obtain b where &amp;quot;∃z. ((∀x. ¬R(x, b)) ∨ (∀x. ¬R(x, z)))&amp;quot; &lt;br /&gt;
      using 0 by (rule exE)&lt;br /&gt;
    then obtain c where 2: &amp;quot;((∀x. ¬R(x, b)) ∨ (∀x. ¬R(x, c)))&amp;quot; &lt;br /&gt;
      by (rule exE)&lt;br /&gt;
    have &amp;quot;∀z. ∃x. (R(x,b) ∧ R(x,z))&amp;quot; &lt;br /&gt;
      using 1 by (rule allE)&lt;br /&gt;
    then have &amp;quot;∃x. (R(x,b) ∧ R(x,c))&amp;quot; &lt;br /&gt;
      by (rule allE)&lt;br /&gt;
    then obtain a where 3 :&amp;quot;R(a,b) ∧ R(a,c)&amp;quot; &lt;br /&gt;
      by (rule exE)&lt;br /&gt;
    show False&lt;br /&gt;
      using 2&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
      assume &amp;quot;∀x. ¬ R (x, b)&amp;quot;&lt;br /&gt;
      then have &amp;quot;¬R(a,b)&amp;quot; &lt;br /&gt;
        by (rule allE)&lt;br /&gt;
      have &amp;quot;R(a,b)&amp;quot; &lt;br /&gt;
        using 3 by (rule conjunct1)&lt;br /&gt;
      with `¬R(a,b)` show False&lt;br /&gt;
        by (rule notE)&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;∀x. ¬ R (x, c)&amp;quot;&lt;br /&gt;
      then have &amp;quot;¬R(a,c)&amp;quot; &lt;br /&gt;
        by (rule allE)&lt;br /&gt;
      have &amp;quot;R(a,c)&amp;quot; &lt;br /&gt;
        using 3 by (rule conjunct2)&lt;br /&gt;
      with `¬R(a,c)` show False &lt;br /&gt;
        by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración aplicativa detallada›&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;(∃y z. ((∀x. ¬R(x,y)) ∨ (∀x. ¬R(x,z)))) &lt;br /&gt;
  ⟶ ¬( ∀y z. ∃x. (R(x,y) ∧ R(x,z)))&amp;quot;&lt;br /&gt;
  apply (rule impI)&lt;br /&gt;
  apply (rule notI)&lt;br /&gt;
  apply (erule exE)+&lt;br /&gt;
  apply (erule_tac x = y in allE)&lt;br /&gt;
  apply (erule_tac x = z in allE)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (erule exE)&lt;br /&gt;
   apply (erule_tac x = x in allE)&lt;br /&gt;
   apply (erule notE)&lt;br /&gt;
   apply (erule conjunct1)&lt;br /&gt;
  apply (erule exE)&lt;br /&gt;
  apply (erule_tac x = x in allE)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
  apply (erule conjunct2)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T3&amp;diff=1243</id>
		<title>T3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T3&amp;diff=1243"/>
		<updated>2020-05-28T09:38:36Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Protegió «T3» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
text ‹Ejercicio 3 de Lógica Matemática y Fundamentos (19-mayo-2020)›&lt;br /&gt;
&lt;br /&gt;
theory uvus_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  Apellidos:&lt;br /&gt;
  Nombre: &lt;br /&gt;
› &lt;br /&gt;
&lt;br /&gt;
text ‹Sustituye la palabra uvus por tu usuario de la Universidad de&lt;br /&gt;
  Sevilla y graba el fichero con dicho usuario.thy› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 1: El tiempo de realización del ejercicio es de 15:30 a 17:00.&lt;br /&gt;
  A continuación, se dispone de 30 minutos para su entrega en la PEV.› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 2: Además de las reglas básicas de deducción natural de la &lt;br /&gt;
  lógica proposicional y de primer orden, también se pueden usar las &lt;br /&gt;
  reglas notnotI y mt que demostramos a  continuación.›&lt;br /&gt;
&lt;br /&gt;
text ‹Nota 3: En el proceso de corrección del ejercicio, y antes de la&lt;br /&gt;
  publicación de las calificaciones del mismo, se podrá requerir&lt;br /&gt;
  aclaraciones sobre su respuesta. Estas aclaraciones se harán por &lt;br /&gt;
  alguno de los procedimientos virtuales previstos en la PEV. ›&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Se define la función&lt;br /&gt;
     elimina :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
  elementos de xs. Por ejemplo, &lt;br /&gt;
     elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n []             = []&amp;quot;&lt;br /&gt;
| &amp;quot;elimina 0 xs             = xs&amp;quot;&lt;br /&gt;
| &amp;quot;elimina (Suc n) (x # xs) = elimina n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Se define la función&lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x []       = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a # xs) = (a = x ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio: Demostrar que&lt;br /&gt;
     estaEn x (elimina n xs) ⟶ estaEn x xs&lt;br /&gt;
&lt;br /&gt;
  + En lenguaje natural&lt;br /&gt;
  + En Isabelle/HOL, de forma detallada. Es opcional hacerlo de forma&lt;br /&gt;
    declarativa o aplicativa.&lt;br /&gt;
&lt;br /&gt;
  Nota: Es recomendable pasar de la demostración en lenguaje natural a la &lt;br /&gt;
  demostración estructurada. Y, a continuación, detallar los pasos de &lt;br /&gt;
  simplificación hasta llegar a usar sólo el método (simp only:..).&lt;br /&gt;
 ----------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración en lenguaje natural&lt;br /&gt;
&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada›&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;estaEn x (elimina n xs) ⟶ estaEn x xs&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 2. Demostrar que si la relación binaria R verifica la &lt;br /&gt;
  siguiente condición&lt;br /&gt;
     ∃y z. (∀x. ¬R(x, y)) ∨ (∀x. ¬R(x, z)))&lt;br /&gt;
  entonces no se verifica que&lt;br /&gt;
    ∀y z. ∃x. (R(x,y) ∧ R(x,z)))&lt;br /&gt;
&lt;br /&gt;
  Nota: Hacer la demostración de forma detallada. Es opcional hacerla &lt;br /&gt;
  de forma declarativa o aplicativa.&lt;br /&gt;
  --------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada›&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;(∃y z. ((∀x. ¬R(x, y)) ∨ (∀x. ¬R(x, z))))&lt;br /&gt;
  ⟶ ¬ (∀y z. ∃x. (R(x,y) ∧ R(x,z)))&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T3&amp;diff=1242</id>
		<title>T3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=T3&amp;diff=1242"/>
		<updated>2020-05-28T09:38:25Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con «&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt; text ‹Ejercicio 3 de Lógica Matemática y Fundamentos (19-mayo-2020)›  theory uvus_3 imports Main  begin  text ‹   Apellidos:   Nombre:…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
text ‹Ejercicio 3 de Lógica Matemática y Fundamentos (19-mayo-2020)›&lt;br /&gt;
&lt;br /&gt;
theory uvus_3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  Apellidos:&lt;br /&gt;
  Nombre: &lt;br /&gt;
› &lt;br /&gt;
&lt;br /&gt;
text ‹Sustituye la palabra uvus por tu usuario de la Universidad de&lt;br /&gt;
  Sevilla y graba el fichero con dicho usuario.thy› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 1: El tiempo de realización del ejercicio es de 15:30 a 17:00.&lt;br /&gt;
  A continuación, se dispone de 30 minutos para su entrega en la PEV.› &lt;br /&gt;
&lt;br /&gt;
text ‹Nota 2: Además de las reglas básicas de deducción natural de la &lt;br /&gt;
  lógica proposicional y de primer orden, también se pueden usar las &lt;br /&gt;
  reglas notnotI y mt que demostramos a  continuación.›&lt;br /&gt;
&lt;br /&gt;
text ‹Nota 3: En el proceso de corrección del ejercicio, y antes de la&lt;br /&gt;
  publicación de las calificaciones del mismo, se podrá requerir&lt;br /&gt;
  aclaraciones sobre su respuesta. Estas aclaraciones se harán por &lt;br /&gt;
  alguno de los procedimientos virtuales previstos en la PEV. ›&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
  by auto&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Se define la función&lt;br /&gt;
     elimina :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
  elementos de xs. Por ejemplo, &lt;br /&gt;
     elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n []             = []&amp;quot;&lt;br /&gt;
| &amp;quot;elimina 0 xs             = xs&amp;quot;&lt;br /&gt;
| &amp;quot;elimina (Suc n) (x # xs) = elimina n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Se define la función&lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x []       = False&amp;quot;&lt;br /&gt;
| &amp;quot;estaEn x (a # xs) = (a = x ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio: Demostrar que&lt;br /&gt;
     estaEn x (elimina n xs) ⟶ estaEn x xs&lt;br /&gt;
&lt;br /&gt;
  + En lenguaje natural&lt;br /&gt;
  + En Isabelle/HOL, de forma detallada. Es opcional hacerlo de forma&lt;br /&gt;
    declarativa o aplicativa.&lt;br /&gt;
&lt;br /&gt;
  Nota: Es recomendable pasar de la demostración en lenguaje natural a la &lt;br /&gt;
  demostración estructurada. Y, a continuación, detallar los pasos de &lt;br /&gt;
  simplificación hasta llegar a usar sólo el método (simp only:..).&lt;br /&gt;
 ----------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración en lenguaje natural&lt;br /&gt;
&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada›&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;estaEn x (elimina n xs) ⟶ estaEn x xs&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------ &lt;br /&gt;
  Ejercicio 2. Demostrar que si la relación binaria R verifica la &lt;br /&gt;
  siguiente condición&lt;br /&gt;
     ∃y z. (∀x. ¬R(x, y)) ∨ (∀x. ¬R(x, z)))&lt;br /&gt;
  entonces no se verifica que&lt;br /&gt;
    ∀y z. ∃x. (R(x,y) ∧ R(x,z)))&lt;br /&gt;
&lt;br /&gt;
  Nota: Hacer la demostración de forma detallada. Es opcional hacerla &lt;br /&gt;
  de forma declarativa o aplicativa.&lt;br /&gt;
  --------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada›&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;(∃y z. ((∀x. ¬R(x, y)) ∨ (∀x. ¬R(x, z))))&lt;br /&gt;
  ⟶ ¬ (∀y z. ∃x. (R(x,y) ∧ R(x,z)))&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Ejercicios&amp;diff=1241</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Ejercicios&amp;diff=1241"/>
		<updated>2020-05-28T09:37:48Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-19/ejercicios/ejercicios-LMF-2019-20.pdf libro de ejercicios].&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]], [[Relación 1 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R1_sol.pdf Una solución]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R2.thy Deducción natural proposicional con Isabelle] ([[R2 |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Rel 2 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R3.thy Deducción natural proposicional con Isabelle (II)] ([[R3 |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Rel 3 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4.thy Sintaxis y semántica de la lógica de primer orden.] ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4_sol.pdf Una solución]).).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R5.thy Deducción natural en lógica de primer orden.] ([[R5 |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Rel 5 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R6.thy Formalización y argumentación con Isabelle/HOL.] ([[R6 |Enunciado]], [[Relación 6 |Solución colaborativa]] , [[Rel 6 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R7.thy Deducción natural,formalización y argumentación en LPO con Isabelle/HOL.] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R8.thy Programación funcional en  Isabelle/HOL.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 8 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 8 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R9.thy Programación funcional en  Isabelle/HOL (II).] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 9 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 9 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1 (24-04-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T1 |Enunciado]], [[T1 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R10.thy Razonamiento sobre programas en Isabelle/HOL.] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 10 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL(II).] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 11 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R12.thy Razonamiento sobre programas en Isabelle/HOL(III).] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 12 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2 (12-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T2 |Enunciado]], [[T2 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R13.thy Recorridos de árboles.] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 13 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R14.thy Una axiomátización de la Geometría.] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 14 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3 (19-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T3 |Enunciado]], [[T3 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R15.thy Definiciones inductivas: clausuras.] ([[R15 |Enunciado]], [[Relación 15 |Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Nota&amp;#039;&amp;#039;&amp;#039; Se pueden publicar las soluciones hasta el martes 31 de marzo.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]] y [[Sol 9 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R10.thy Programación funcional en Isabelle (2)] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]  y [[Sol 10 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]  y [[Sol 11 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R12.thy Recorridos de árboles en Isabelle/HOL] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]  y [[Sol 12 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R13.thy Definiciones inductivas: clausuras] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]  y [[Sol 13 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R14.thy Desarrollo de teorías axiomáticas] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]  y [[Sol 14 | una solución]]).&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=R15&amp;diff=1239</id>
		<title>R15</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=R15&amp;diff=1239"/>
		<updated>2020-05-28T06:58:39Z</updated>

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

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

		<summary type="html">&lt;p&gt;Mjoseh: Protegió «Rel 14 (sol)» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
theory R14_sol&lt;br /&gt;
imports Main&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Hilbert publicó una axiomatización de la geometría que &lt;br /&gt;
  incluía los siguientes  axiomas:&lt;br /&gt;
  1. Por dos puntos distintos pasa una línea recta.&lt;br /&gt;
  2. Por dos puntos distintos no pasa más de una línea recta.&lt;br /&gt;
  3. Toda línea tiene al menos dos puntos.&lt;br /&gt;
  4. Existen al menos tres puntos no alineados.&lt;br /&gt;
&lt;br /&gt;
  Usando la relacion en(p,l) para representar que el punto p está en &lt;br /&gt;
  la línea l, definir el entorno local Geom en el que se verifiquen los &lt;br /&gt;
  4 axiomas anteriores.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
locale Geom =&lt;br /&gt;
  fixes en :: &amp;quot;&amp;#039;p ⇒ &amp;#039;l ⇒ bool&amp;quot;&lt;br /&gt;
  assumes linea_por_dos_puntos:       &lt;br /&gt;
            &amp;quot;a ≠ b ⟹ ∃l. en a l ∧ en b l&amp;quot; &lt;br /&gt;
      and linea_por_dos_puntos_unica: &lt;br /&gt;
            &amp;quot;⟦a ≠ b; en a l; en b l; en a m; en b m⟧ ⟹ l = m&amp;quot;&lt;br /&gt;
      and dos_puntos_de_la_linea:     &lt;br /&gt;
            &amp;quot;∃a b. a ≠ b ∧ en a l ∧ en b l&amp;quot;&lt;br /&gt;
      and tres_puntos_no_alineados:   &lt;br /&gt;
            &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ &lt;br /&gt;
                     ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
  &lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Demostrar que&lt;br /&gt;
    ∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot;&lt;br /&gt;
  using tres_puntos_no_alineados by auto&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma tres_puntos_no_alineados_alt:&lt;br /&gt;
  &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain a b c where distintos: &amp;quot;a ≠ b ∧ a ≠ c ∧ b ≠ c&amp;quot; &lt;br /&gt;
                                 &amp;quot;¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    using tres_puntos_no_alineados by blast&lt;br /&gt;
  then have &amp;quot;∀l. en a l ∧ en b l ⟶ ¬ en c l&amp;quot;&lt;br /&gt;
    by blast&lt;br /&gt;
  then show ?thesis &lt;br /&gt;
    using distintos by blast&lt;br /&gt;
qed        &lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración detallada ›&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 1: &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    by (rule tres_puntos_no_alineados)&lt;br /&gt;
  obtain a b c where 2: &amp;quot;a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ &lt;br /&gt;
                         ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    using 1 by (elim exE)&lt;br /&gt;
  then have 3: &amp;quot;a ≠ b&amp;quot; &lt;br /&gt;
    by (rule conjE)&lt;br /&gt;
  have 4: &amp;quot;a ≠ c ∧ b ≠ c ∧ ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    using 2 by (rule conjE)&lt;br /&gt;
  then have 5: &amp;quot;a ≠ c&amp;quot; &lt;br /&gt;
    by (rule conjE)&lt;br /&gt;
  have 6: &amp;quot;b ≠ c ∧ ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    using 4 by (rule conjE)&lt;br /&gt;
  then have 7: &amp;quot;b ≠ c&amp;quot; &lt;br /&gt;
    by (rule conjE)&lt;br /&gt;
  with 5 have 8: &amp;quot;a ≠ c ∧ b ≠ c&amp;quot;  &lt;br /&gt;
    by (rule conjI)&lt;br /&gt;
  with 3 have 9: &amp;quot;a ≠ b ∧ a ≠ c ∧ b ≠ c&amp;quot;  &lt;br /&gt;
    by (rule conjI)&lt;br /&gt;
  have  10: &amp;quot; ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    using 6 by (rule conjE)&lt;br /&gt;
  have 12: &amp;quot;∀l. en a l ∧ en b l ⟶ ¬ en c l&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
    fix l&lt;br /&gt;
    show &amp;quot;en a l ∧ en b l ⟶ ¬ en c l&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume 11: &amp;quot;en a l ∧ en b l&amp;quot;&lt;br /&gt;
      show &amp;quot;¬ en c l&amp;quot;&lt;br /&gt;
      proof (rule notI)&lt;br /&gt;
        assume &amp;quot;en c l&amp;quot;&lt;br /&gt;
        hence &amp;quot;en a l ∧ en b l ∧ en c l&amp;quot; &lt;br /&gt;
          using 11 by blast&lt;br /&gt;
        hence &amp;quot;∃l. en a l ∧ en b l ∧ en c l&amp;quot; &lt;br /&gt;
          by (rule exI)&lt;br /&gt;
        with 10 show False &lt;br /&gt;
          by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  have &amp;quot;a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot; &lt;br /&gt;
    using 9 12 by blast&lt;br /&gt;
  then show &lt;br /&gt;
    &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot; &lt;br /&gt;
    by (intro exI)&lt;br /&gt;
qed      &lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. Demostrar que no todos los puntos pertenecen a la misma &lt;br /&gt;
  línea.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración automática›&lt;br /&gt;
lemma &amp;quot;∀l. ∃x. ¬ en x l&amp;quot;&lt;br /&gt;
  using tres_puntos_no_alineados_alt by auto&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma punto_no_en_linea: &amp;quot;∀l. ∃x. ¬ en x l&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  fix l&lt;br /&gt;
  obtain a b c where l3: &amp;quot;¬ (en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    using tres_puntos_no_alineados by blast &lt;br /&gt;
  then show &amp;quot;∃x. ¬ en x l&amp;quot; by blast &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada ›&lt;br /&gt;
lemma &amp;quot;∀l. ∃x. ¬ en x l&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
  fix l&lt;br /&gt;
  have &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c &lt;br /&gt;
                ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot; &lt;br /&gt;
    by (rule tres_puntos_no_alineados_alt)&lt;br /&gt;
  then obtain a b c where &amp;quot;a ≠ b ∧ a ≠ c ∧ b ≠ c &lt;br /&gt;
                           ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot; &lt;br /&gt;
    by (elim exE)&lt;br /&gt;
  then have &amp;quot;∀l. en a l ∧ en b l ⟶ ¬ en c l&amp;quot; &lt;br /&gt;
    by (elim conjE)&lt;br /&gt;
  then have 1:&amp;quot;en a l ∧ en b l ⟶ ¬ en c l&amp;quot; &lt;br /&gt;
    by (rule allE)&lt;br /&gt;
  show &amp;quot;∃x. ¬ en x l&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume &amp;quot;¬ en a l&amp;quot; then show &amp;quot;∃x. ¬ en x l&amp;quot; &lt;br /&gt;
      by (rule exI)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬ ¬ en a l&amp;quot;&lt;br /&gt;
    then have &amp;quot;en a l&amp;quot; &lt;br /&gt;
      by (rule notnotD)&lt;br /&gt;
    then show &amp;quot;∃x. ¬ en x l&amp;quot;&lt;br /&gt;
    proof (cases)&lt;br /&gt;
      assume &amp;quot;en b l&amp;quot;&lt;br /&gt;
      with ‹en a l› have &amp;quot;en a l ∧ en b l&amp;quot; &lt;br /&gt;
        by (rule conjI)&lt;br /&gt;
      with 1 have &amp;quot;¬ en c l&amp;quot; &lt;br /&gt;
        by (rule mp)&lt;br /&gt;
      then show &amp;quot;∃x. ¬ en x l&amp;quot; &lt;br /&gt;
        by (rule exI)&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;¬ en b l&amp;quot; then show &amp;quot;∃x. ¬ en x l&amp;quot; &lt;br /&gt;
        by (rule exI)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
                    &lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 4. Demostrar que por cada punto pasa más de una línea.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma &amp;quot;∃l m. en x l ∧ en x m ∧ l ≠ m&amp;quot;&lt;br /&gt;
  by (metis linea_por_dos_puntos tres_puntos_no_alineados_alt)&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma dos_lineas_por_punto: &amp;quot;∃l m. en x l ∧ en x m ∧ l ≠ m&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain z where &amp;quot;z ≠ x&amp;quot; using dos_puntos_de_la_linea &lt;br /&gt;
    by metis&lt;br /&gt;
  then obtain l where xl: &amp;quot;en x l&amp;quot; and zl: &amp;quot;en z l&amp;quot; &lt;br /&gt;
    using linea_por_dos_puntos by blast &lt;br /&gt;
  obtain w where n_wl: &amp;quot;¬ en w l&amp;quot; &lt;br /&gt;
    using punto_no_en_linea by blast&lt;br /&gt;
  obtain m where wm: &amp;quot;en x m&amp;quot; and zm: &amp;quot;en w m&amp;quot; &lt;br /&gt;
    using linea_por_dos_puntos xl by metis&lt;br /&gt;
  then have &amp;quot;l ≠ m&amp;quot; &lt;br /&gt;
    using n_wl by blast  &lt;br /&gt;
  then show ?thesis &lt;br /&gt;
    using wm xl by blast &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 5. Demostrar que dos líneas distintas no pueden tener más &lt;br /&gt;
  de un punto común.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma  &lt;br /&gt;
   assumes &amp;quot;l ≠ m&amp;quot; &lt;br /&gt;
           &amp;quot;en x l&amp;quot; &lt;br /&gt;
           &amp;quot;en x m&amp;quot; &lt;br /&gt;
           &amp;quot;en y l&amp;quot; &lt;br /&gt;
           &amp;quot;en y m&amp;quot; &lt;br /&gt;
   shows &amp;quot;x = y&amp;quot;&lt;br /&gt;
  using assms linea_por_dos_puntos_unica by blast&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma interseccion_lineas_distintas: &lt;br /&gt;
   assumes &amp;quot;l ≠ m&amp;quot; &lt;br /&gt;
           &amp;quot;en x l&amp;quot; &lt;br /&gt;
           &amp;quot;en x m&amp;quot; &lt;br /&gt;
           &amp;quot;en y l&amp;quot; &lt;br /&gt;
           &amp;quot;en y m&amp;quot; &lt;br /&gt;
   shows &amp;quot;x = y&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;x ≠ y&amp;quot; &lt;br /&gt;
  then have &amp;quot;l = m&amp;quot; &lt;br /&gt;
    using linea_por_dos_puntos_unica assms(2-5) by simp&lt;br /&gt;
  then show &amp;quot;False&amp;quot; &lt;br /&gt;
    using assms(1) by simp&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 6. Extender el ámbito (&amp;quot;locale&amp;quot;) Geom definiendo la relación &lt;br /&gt;
  colineal tal que (colineal a b c) se verifica si existe una línea &lt;br /&gt;
  recta que pasa por los puntos a, b y c.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
definition (in Geom) &lt;br /&gt;
  colineal :: &amp;quot;&amp;#039;p ⇒ &amp;#039;p ⇒ &amp;#039;p ⇒ bool&amp;quot; &lt;br /&gt;
  where &amp;quot;colineal a b c ≡ ∃l. en a l ∧ en b l ∧ en c l&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 7. Demostrar que existen tres puntos a, b y c tales que&lt;br /&gt;
     ¬ colineal a b c&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma (in Geom) &amp;quot;∃a b c. ¬ colineal a b c&amp;quot;&lt;br /&gt;
  using colineal_def tres_puntos_no_alineados by blast&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma (in Geom) &amp;quot;∃a b c. ¬ colineal a b c&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ &lt;br /&gt;
                ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    by (rule tres_puntos_no_alineados)&lt;br /&gt;
  then have &amp;quot;∃a b c. ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    by blast&lt;br /&gt;
  then show ?thesis &lt;br /&gt;
    by (simp add: colineal_def)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Rel_14_(sol)&amp;diff=1236</id>
		<title>Rel 14 (sol)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Rel_14_(sol)&amp;diff=1236"/>
		<updated>2020-05-28T06:56:05Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con «&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt; theory R14_sol imports Main  begin   text ‹------------------------------------------------------------------   Ejercicio 1. Hilbert publicó u…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
theory R14_sol&lt;br /&gt;
imports Main&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Hilbert publicó una axiomatización de la geometría que &lt;br /&gt;
  incluía los siguientes  axiomas:&lt;br /&gt;
  1. Por dos puntos distintos pasa una línea recta.&lt;br /&gt;
  2. Por dos puntos distintos no pasa más de una línea recta.&lt;br /&gt;
  3. Toda línea tiene al menos dos puntos.&lt;br /&gt;
  4. Existen al menos tres puntos no alineados.&lt;br /&gt;
&lt;br /&gt;
  Usando la relacion en(p,l) para representar que el punto p está en &lt;br /&gt;
  la línea l, definir el entorno local Geom en el que se verifiquen los &lt;br /&gt;
  4 axiomas anteriores.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
locale Geom =&lt;br /&gt;
  fixes en :: &amp;quot;&amp;#039;p ⇒ &amp;#039;l ⇒ bool&amp;quot;&lt;br /&gt;
  assumes linea_por_dos_puntos:       &lt;br /&gt;
            &amp;quot;a ≠ b ⟹ ∃l. en a l ∧ en b l&amp;quot; &lt;br /&gt;
      and linea_por_dos_puntos_unica: &lt;br /&gt;
            &amp;quot;⟦a ≠ b; en a l; en b l; en a m; en b m⟧ ⟹ l = m&amp;quot;&lt;br /&gt;
      and dos_puntos_de_la_linea:     &lt;br /&gt;
            &amp;quot;∃a b. a ≠ b ∧ en a l ∧ en b l&amp;quot;&lt;br /&gt;
      and tres_puntos_no_alineados:   &lt;br /&gt;
            &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ &lt;br /&gt;
                     ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
  &lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Demostrar que&lt;br /&gt;
    ∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot;&lt;br /&gt;
  using tres_puntos_no_alineados by auto&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma tres_puntos_no_alineados_alt:&lt;br /&gt;
  &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain a b c where distintos: &amp;quot;a ≠ b ∧ a ≠ c ∧ b ≠ c&amp;quot; &lt;br /&gt;
                                 &amp;quot;¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    using tres_puntos_no_alineados by blast&lt;br /&gt;
  then have &amp;quot;∀l. en a l ∧ en b l ⟶ ¬ en c l&amp;quot;&lt;br /&gt;
    by blast&lt;br /&gt;
  then show ?thesis &lt;br /&gt;
    using distintos by blast&lt;br /&gt;
qed        &lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración detallada ›&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 1: &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    by (rule tres_puntos_no_alineados)&lt;br /&gt;
  obtain a b c where 2: &amp;quot;a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ &lt;br /&gt;
                         ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    using 1 by (elim exE)&lt;br /&gt;
  then have 3: &amp;quot;a ≠ b&amp;quot; &lt;br /&gt;
    by (rule conjE)&lt;br /&gt;
  have 4: &amp;quot;a ≠ c ∧ b ≠ c ∧ ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    using 2 by (rule conjE)&lt;br /&gt;
  then have 5: &amp;quot;a ≠ c&amp;quot; &lt;br /&gt;
    by (rule conjE)&lt;br /&gt;
  have 6: &amp;quot;b ≠ c ∧ ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    using 4 by (rule conjE)&lt;br /&gt;
  then have 7: &amp;quot;b ≠ c&amp;quot; &lt;br /&gt;
    by (rule conjE)&lt;br /&gt;
  with 5 have 8: &amp;quot;a ≠ c ∧ b ≠ c&amp;quot;  &lt;br /&gt;
    by (rule conjI)&lt;br /&gt;
  with 3 have 9: &amp;quot;a ≠ b ∧ a ≠ c ∧ b ≠ c&amp;quot;  &lt;br /&gt;
    by (rule conjI)&lt;br /&gt;
  have  10: &amp;quot; ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    using 6 by (rule conjE)&lt;br /&gt;
  have 12: &amp;quot;∀l. en a l ∧ en b l ⟶ ¬ en c l&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
    fix l&lt;br /&gt;
    show &amp;quot;en a l ∧ en b l ⟶ ¬ en c l&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume 11: &amp;quot;en a l ∧ en b l&amp;quot;&lt;br /&gt;
      show &amp;quot;¬ en c l&amp;quot;&lt;br /&gt;
      proof (rule notI)&lt;br /&gt;
        assume &amp;quot;en c l&amp;quot;&lt;br /&gt;
        hence &amp;quot;en a l ∧ en b l ∧ en c l&amp;quot; &lt;br /&gt;
          using 11 by blast&lt;br /&gt;
        hence &amp;quot;∃l. en a l ∧ en b l ∧ en c l&amp;quot; &lt;br /&gt;
          by (rule exI)&lt;br /&gt;
        with 10 show False &lt;br /&gt;
          by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  have &amp;quot;a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot; &lt;br /&gt;
    using 9 12 by blast&lt;br /&gt;
  then show &lt;br /&gt;
    &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot; &lt;br /&gt;
    by (intro exI)&lt;br /&gt;
qed      &lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. Demostrar que no todos los puntos pertenecen a la misma &lt;br /&gt;
  línea.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración automática›&lt;br /&gt;
lemma &amp;quot;∀l. ∃x. ¬ en x l&amp;quot;&lt;br /&gt;
  using tres_puntos_no_alineados_alt by auto&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma punto_no_en_linea: &amp;quot;∀l. ∃x. ¬ en x l&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  fix l&lt;br /&gt;
  obtain a b c where l3: &amp;quot;¬ (en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    using tres_puntos_no_alineados by blast &lt;br /&gt;
  then show &amp;quot;∃x. ¬ en x l&amp;quot; by blast &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹Demostración detallada ›&lt;br /&gt;
lemma &amp;quot;∀l. ∃x. ¬ en x l&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
  fix l&lt;br /&gt;
  have &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c &lt;br /&gt;
                ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot; &lt;br /&gt;
    by (rule tres_puntos_no_alineados_alt)&lt;br /&gt;
  then obtain a b c where &amp;quot;a ≠ b ∧ a ≠ c ∧ b ≠ c &lt;br /&gt;
                           ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot; &lt;br /&gt;
    by (elim exE)&lt;br /&gt;
  then have &amp;quot;∀l. en a l ∧ en b l ⟶ ¬ en c l&amp;quot; &lt;br /&gt;
    by (elim conjE)&lt;br /&gt;
  then have 1:&amp;quot;en a l ∧ en b l ⟶ ¬ en c l&amp;quot; &lt;br /&gt;
    by (rule allE)&lt;br /&gt;
  show &amp;quot;∃x. ¬ en x l&amp;quot;&lt;br /&gt;
  proof (cases)&lt;br /&gt;
    assume &amp;quot;¬ en a l&amp;quot; then show &amp;quot;∃x. ¬ en x l&amp;quot; &lt;br /&gt;
      by (rule exI)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬ ¬ en a l&amp;quot;&lt;br /&gt;
    then have &amp;quot;en a l&amp;quot; &lt;br /&gt;
      by (rule notnotD)&lt;br /&gt;
    then show &amp;quot;∃x. ¬ en x l&amp;quot;&lt;br /&gt;
    proof (cases)&lt;br /&gt;
      assume &amp;quot;en b l&amp;quot;&lt;br /&gt;
      with ‹en a l› have &amp;quot;en a l ∧ en b l&amp;quot; &lt;br /&gt;
        by (rule conjI)&lt;br /&gt;
      with 1 have &amp;quot;¬ en c l&amp;quot; &lt;br /&gt;
        by (rule mp)&lt;br /&gt;
      then show &amp;quot;∃x. ¬ en x l&amp;quot; &lt;br /&gt;
        by (rule exI)&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;¬ en b l&amp;quot; then show &amp;quot;∃x. ¬ en x l&amp;quot; &lt;br /&gt;
        by (rule exI)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
                    &lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 4. Demostrar que por cada punto pasa más de una línea.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma &amp;quot;∃l m. en x l ∧ en x m ∧ l ≠ m&amp;quot;&lt;br /&gt;
  by (metis linea_por_dos_puntos tres_puntos_no_alineados_alt)&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma dos_lineas_por_punto: &amp;quot;∃l m. en x l ∧ en x m ∧ l ≠ m&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain z where &amp;quot;z ≠ x&amp;quot; using dos_puntos_de_la_linea &lt;br /&gt;
    by metis&lt;br /&gt;
  then obtain l where xl: &amp;quot;en x l&amp;quot; and zl: &amp;quot;en z l&amp;quot; &lt;br /&gt;
    using linea_por_dos_puntos by blast &lt;br /&gt;
  obtain w where n_wl: &amp;quot;¬ en w l&amp;quot; &lt;br /&gt;
    using punto_no_en_linea by blast&lt;br /&gt;
  obtain m where wm: &amp;quot;en x m&amp;quot; and zm: &amp;quot;en w m&amp;quot; &lt;br /&gt;
    using linea_por_dos_puntos xl by metis&lt;br /&gt;
  then have &amp;quot;l ≠ m&amp;quot; &lt;br /&gt;
    using n_wl by blast  &lt;br /&gt;
  then show ?thesis &lt;br /&gt;
    using wm xl by blast &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 5. Demostrar que dos líneas distintas no pueden tener más &lt;br /&gt;
  de un punto común.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma  &lt;br /&gt;
   assumes &amp;quot;l ≠ m&amp;quot; &lt;br /&gt;
           &amp;quot;en x l&amp;quot; &lt;br /&gt;
           &amp;quot;en x m&amp;quot; &lt;br /&gt;
           &amp;quot;en y l&amp;quot; &lt;br /&gt;
           &amp;quot;en y m&amp;quot; &lt;br /&gt;
   shows &amp;quot;x = y&amp;quot;&lt;br /&gt;
  using assms linea_por_dos_puntos_unica by blast&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma interseccion_lineas_distintas: &lt;br /&gt;
   assumes &amp;quot;l ≠ m&amp;quot; &lt;br /&gt;
           &amp;quot;en x l&amp;quot; &lt;br /&gt;
           &amp;quot;en x m&amp;quot; &lt;br /&gt;
           &amp;quot;en y l&amp;quot; &lt;br /&gt;
           &amp;quot;en y m&amp;quot; &lt;br /&gt;
   shows &amp;quot;x = y&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;x ≠ y&amp;quot; &lt;br /&gt;
  then have &amp;quot;l = m&amp;quot; &lt;br /&gt;
    using linea_por_dos_puntos_unica assms(2-5) by simp&lt;br /&gt;
  then show &amp;quot;False&amp;quot; &lt;br /&gt;
    using assms(1) by simp&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 6. Extender el ámbito (&amp;quot;locale&amp;quot;) Geom definiendo la relación &lt;br /&gt;
  colineal tal que (colineal a b c) se verifica si existe una línea &lt;br /&gt;
  recta que pasa por los puntos a, b y c.&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
definition (in Geom) &lt;br /&gt;
  colineal :: &amp;quot;&amp;#039;p ⇒ &amp;#039;p ⇒ &amp;#039;p ⇒ bool&amp;quot; &lt;br /&gt;
  where &amp;quot;colineal a b c ≡ ∃l. en a l ∧ en b l ∧ en c l&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 7. Demostrar que existen tres puntos a, b y c tales que&lt;br /&gt;
     ¬ colineal a b c&lt;br /&gt;
  ---------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma (in Geom) &amp;quot;∃a b c. ¬ colineal a b c&amp;quot;&lt;br /&gt;
  using colineal_def tres_puntos_no_alineados by blast&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma (in Geom) &amp;quot;∃a b c. ¬ colineal a b c&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ &lt;br /&gt;
                ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    by (rule tres_puntos_no_alineados)&lt;br /&gt;
  then have &amp;quot;∃a b c. ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot; &lt;br /&gt;
    by blast&lt;br /&gt;
  then show ?thesis &lt;br /&gt;
    by (simp add: colineal_def)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Ejercicios&amp;diff=1235</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=Ejercicios&amp;diff=1235"/>
		<updated>2020-05-28T06:54:50Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se encuentran los ejercicios para resolver de manera colaborativa que complementan al [https://www.cs.us.es/~jalonso/cursos/lmf-19/ejercicios/ejercicios-LMF-2019-20.pdf libro de ejercicios].&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional. ([[R1 |Enunciado]], [[Relación 1 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R1_sol.pdf Una solución]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R2.thy Deducción natural proposicional con Isabelle] ([[R2 |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Rel 2 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R3.thy Deducción natural proposicional con Isabelle (II)] ([[R3 |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Rel 3 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4.thy Sintaxis y semántica de la lógica de primer orden.] ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]], [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R4_sol.pdf Una solución]).).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R5.thy Deducción natural en lógica de primer orden.] ([[R5 |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Rel 5 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R6.thy Formalización y argumentación con Isabelle/HOL.] ([[R6 |Enunciado]], [[Relación 6 |Solución colaborativa]] , [[Rel 6 |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R7.thy Deducción natural,formalización y argumentación en LPO con Isabelle/HOL.] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R8.thy Programación funcional en  Isabelle/HOL.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 8 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 8 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R9.thy Programación funcional en  Isabelle/HOL (II).] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 9 (rev 1) | Primera corrección]]&lt;br /&gt;
** [[Rel 9 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1 (24-04-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T1 |Enunciado]], [[T1 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R10.thy Razonamiento sobre programas en Isabelle/HOL.] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 10 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL(II).] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 11 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R12.thy Razonamiento sobre programas en Isabelle/HOL(III).] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 12 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2 (12-05-2020)&amp;#039;&amp;#039;&amp;#039;: ([[T2 |Enunciado]], [[T2 sol |Una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R13.thy Recorridos de árboles.] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 13 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R14.thy Una axiomátización de la Geometría.] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]).&lt;br /&gt;
** [[Rel 14 (sol) | Una solución]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-19/relaciones-ejercicios/R15.thy Definiciones inductivas: clausuras.] ([[R15 |Enunciado]], [[Relación 15 |Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Nota&amp;#039;&amp;#039;&amp;#039; Se pueden publicar las soluciones hasta el martes 31 de marzo.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional. ([[R2 |Enunciado]] y [[Relación 2 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional (II). ([[R3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica proposicional con Isabelle ([[R4 |Enunciado]], [[Relación 4 |Solución colaborativa]] y [[Sol 4 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica de primer orden. ([[R5 |Enunciado]] y [[Relación 5 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R6.thy Deducción natural en lógica de primer orden con Isabelle] ([[R6 |Enunciado]], [[Relación  |Solución colaborativa]] y [[Sol 6 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R7.thy Deducción natural en lógica proposicional con Isabelle basada en tácticas] ([[R7 |Enunciado]], [[Relación 7 |Solución colaborativa]] y [[Sol 7 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7b&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer orden con Isabelle basada en tácticas. ([[Sol 7b | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R8.thy Argumentación en lógica de primer orden con Isabelle.] ([[R8 |Enunciado]], [[Relación 8 |Solución colaborativa]] y [[Sol 8 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R9.thy Programación funcional en Isabelle] ([[R9 |Enunciado]], [[Relación 9 |Solución colaborativa]] y [[Sol 9 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R10.thy Programación funcional en Isabelle (2)] ([[R10 |Enunciado]], [[Relación 10 |Solución colaborativa]]  y [[Sol 10 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R11.thy Razonamiento sobre programas en Isabelle/HOL] ([[R11 |Enunciado]], [[Relación 11 |Solución colaborativa]]  y [[Sol 11 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R12.thy Recorridos de árboles en Isabelle/HOL] ([[R12 |Enunciado]], [[Relación 12 |Solución colaborativa]]  y [[Sol 12 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R13.thy Definiciones inductivas: clausuras] ([[R13 |Enunciado]], [[Relación 13 |Solución colaborativa]]  y [[Sol 13 | una solución]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: [https://www.cs.us.es/~mjoseh/cursos/lmf-18/relaciones_ejercicios/R14.thy Desarrollo de teorías axiomáticas] ([[R14 |Enunciado]], [[Relación 14 |Solución colaborativa]]  y [[Sol 14 | una solución]]).&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=R14&amp;diff=1218</id>
		<title>R14</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=R14&amp;diff=1218"/>
		<updated>2020-05-21T14:47:02Z</updated>

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

		<summary type="html">&lt;p&gt;Mjoseh: Protegió «R14» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter ‹R14: Una axiomatización de la Geometría›&lt;br /&gt;
&lt;br /&gt;
theory R14&lt;br /&gt;
imports Main&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Hilbert publicó una axiomatización de la geometría que incluía los siguientes &lt;br /&gt;
  axiomas:&lt;br /&gt;
  1. Por dos puntos distintos pasa una línea recta.&lt;br /&gt;
  2. Por dos puntos distintos no pasa más de una línea recta.&lt;br /&gt;
  3. Toda línea tiene al menos dos puntos.&lt;br /&gt;
  4. Existen al menos tres puntos no alineados.&lt;br /&gt;
&lt;br /&gt;
  Usando la relacion en(p,l) para representar que el punto p está en la línea l, definir el entorno &lt;br /&gt;
  local Geom en el que se verifiquen los 4 axiomas anteriores.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
locale Geom =&lt;br /&gt;
  fixes en :: &amp;quot;&amp;#039;p ⇒ &amp;#039;l ⇒ bool&amp;quot;&lt;br /&gt;
  assumes linea_por_dos_puntos:       &amp;quot;a ≠ b ⟹ ∃l. en a l ∧ en b l&amp;quot; &lt;br /&gt;
      and linea_por_dos_puntos_unica: &amp;quot;⟦a ≠ b; en a l; en b l; en a m; en b m⟧ ⟹ l = m&amp;quot;&lt;br /&gt;
      and dos_puntos_de_la_linea:     &amp;quot;∃a b. a ≠ b ∧ en a l ∧ en b l&amp;quot;&lt;br /&gt;
      and tres_puntos_no_alineados:   &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ &lt;br /&gt;
                                               ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Nota: En los ejercicios siguientes se pide la demostración&lt;br /&gt;
  estructurada con el menor número de métodos automáticos posibles.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Demostrar que&lt;br /&gt;
    ∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma tres_puntos_no_alineados_alt:&lt;br /&gt;
  &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot;&lt;br /&gt;
oops       &lt;br /&gt;
  &lt;br /&gt;
text ‹&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. Demostrar que no todos los puntos pertenecen a la misma línea.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma &amp;quot;∀l. ∃x. ¬ en x l&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma punto_no_en_linea: &amp;quot;∀l. ∃x. ¬ en x l&amp;quot;&lt;br /&gt;
oops &lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 4. Demostrar que por cada punto pasa más de una línea.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma &amp;quot;∃l m. en x l ∧ en x m ∧ l ≠ m&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma dos_lineas_por_punto: &amp;quot;∃l m. en x l ∧ en x m ∧ l ≠ m&amp;quot;&lt;br /&gt;
 oops &lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 5. Demostrar que dos líneas distintas no pueden tener más de un punto común.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma  &lt;br /&gt;
   assumes &amp;quot;l ≠ m&amp;quot; &lt;br /&gt;
           &amp;quot;en x l&amp;quot; &lt;br /&gt;
           &amp;quot;en x m&amp;quot; &lt;br /&gt;
           &amp;quot;en y l&amp;quot; &lt;br /&gt;
           &amp;quot;en y m&amp;quot; &lt;br /&gt;
   shows &amp;quot;x = y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma interseccion_lineas_distintas: &lt;br /&gt;
   assumes &amp;quot;l ≠ m&amp;quot; &lt;br /&gt;
           &amp;quot;en x l&amp;quot; &lt;br /&gt;
           &amp;quot;en x m&amp;quot; &lt;br /&gt;
           &amp;quot;en y l&amp;quot; &lt;br /&gt;
           &amp;quot;en y m&amp;quot; &lt;br /&gt;
   shows &amp;quot;x = y&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 6. Extender el ámbito (&amp;quot;locale&amp;quot;) Geom definiendo la relación colineal tal que&lt;br /&gt;
  (colineal a b c) se verifica si existe una línea recta que pasa por los puntos a, b y c.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
definition (in Geom) &lt;br /&gt;
  colineal :: &amp;quot;&amp;#039;p ⇒ &amp;#039;p ⇒ &amp;#039;p ⇒ bool&amp;quot; &lt;br /&gt;
  where &amp;quot;colineal a b c ≡ ∃l. en a l ∧ en b l ∧ en c l&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 7. Demostrar que existen tres puntos a, b y c tales que&lt;br /&gt;
     ¬ colineal a b c&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma (in Geom) &amp;quot;∃a b c. ¬ colineal a b c&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
  ― ‹ Demostración estructurada ›&lt;br /&gt;
lemma (in Geom) &amp;quot;∃a b c. ¬ colineal a b c&amp;quot;&lt;br /&gt;
oops &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2020/index.php?title=R14&amp;diff=1214</id>
		<title>R14</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2020/index.php?title=R14&amp;diff=1214"/>
		<updated>2020-05-21T09:56:54Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con «&amp;lt;source lang &amp;quot;isabelle&amp;quot;&amp;gt; chapter ‹R14: Una axiomatización de la Geometría›  theory R14 imports Main  begin  text ‹   -----------------------------------------------…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang &amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter ‹R14: Una axiomatización de la Geometría›&lt;br /&gt;
&lt;br /&gt;
theory R14&lt;br /&gt;
imports Main&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Hilbert publicó una axiomatización de la geometría que incluía los siguientes &lt;br /&gt;
  axiomas:&lt;br /&gt;
  1. Por dos puntos distintos pasa una línea recta.&lt;br /&gt;
  2. Por dos puntos distintos no pasa más de una línea recta.&lt;br /&gt;
  3. Toda línea tiene al menos dos puntos.&lt;br /&gt;
  4. Existen al menos tres puntos no alineados.&lt;br /&gt;
&lt;br /&gt;
  Usando la relacion en(p,l) para representar que el punto p está en la línea l, definir el entorno &lt;br /&gt;
  local Geom en el que se verifiquen los 4 axiomas anteriores.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
locale Geom =&lt;br /&gt;
  fixes en :: &amp;quot;&amp;#039;p ⇒ &amp;#039;l ⇒ bool&amp;quot;&lt;br /&gt;
  assumes linea_por_dos_puntos:       &amp;quot;a ≠ b ⟹ ∃l. en a l ∧ en b l&amp;quot; &lt;br /&gt;
      and linea_por_dos_puntos_unica: &amp;quot;⟦a ≠ b; en a l; en b l; en a m; en b m⟧ ⟹ l = m&amp;quot;&lt;br /&gt;
      and dos_puntos_de_la_linea:     &amp;quot;∃a b. a ≠ b ∧ en a l ∧ en b l&amp;quot;&lt;br /&gt;
      and tres_puntos_no_alineados:   &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ &lt;br /&gt;
                                               ¬ (∃l. en a l ∧ en b l ∧ en c l)&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Nota: En los ejercicios siguientes se pide la demostración&lt;br /&gt;
  estructurada con el menor número de métodos automáticos posibles.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. Demostrar que&lt;br /&gt;
    ∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma tres_puntos_no_alineados_alt:&lt;br /&gt;
  &amp;quot;∃a b c. a ≠ b ∧ a ≠ c ∧ b ≠ c ∧ (∀l. en a l ∧ en b l ⟶ ¬ en c l)&amp;quot;&lt;br /&gt;
oops       &lt;br /&gt;
  &lt;br /&gt;
text ‹&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. Demostrar que no todos los puntos pertenecen a la misma línea.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma &amp;quot;∀l. ∃x. ¬ en x l&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma punto_no_en_linea: &amp;quot;∀l. ∃x. ¬ en x l&amp;quot;&lt;br /&gt;
oops &lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 4. Demostrar que por cada punto pasa más de una línea.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma &amp;quot;∃l m. en x l ∧ en x m ∧ l ≠ m&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma dos_lineas_por_punto: &amp;quot;∃l m. en x l ∧ en x m ∧ l ≠ m&amp;quot;&lt;br /&gt;
 oops &lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 5. Demostrar que dos líneas distintas no pueden tener más de un punto común.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma  &lt;br /&gt;
   assumes &amp;quot;l ≠ m&amp;quot; &lt;br /&gt;
           &amp;quot;en x l&amp;quot; &lt;br /&gt;
           &amp;quot;en x m&amp;quot; &lt;br /&gt;
           &amp;quot;en y l&amp;quot; &lt;br /&gt;
           &amp;quot;en y m&amp;quot; &lt;br /&gt;
   shows &amp;quot;x = y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración estructurada ›&lt;br /&gt;
lemma interseccion_lineas_distintas: &lt;br /&gt;
   assumes &amp;quot;l ≠ m&amp;quot; &lt;br /&gt;
           &amp;quot;en x l&amp;quot; &lt;br /&gt;
           &amp;quot;en x m&amp;quot; &lt;br /&gt;
           &amp;quot;en y l&amp;quot; &lt;br /&gt;
           &amp;quot;en y m&amp;quot; &lt;br /&gt;
   shows &amp;quot;x = y&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 6. Extender el ámbito (&amp;quot;locale&amp;quot;) Geom definiendo la relación colineal tal que&lt;br /&gt;
  (colineal a b c) se verifica si existe una línea recta que pasa por los puntos a, b y c.&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
definition (in Geom) &lt;br /&gt;
  colineal :: &amp;quot;&amp;#039;p ⇒ &amp;#039;p ⇒ &amp;#039;p ⇒ bool&amp;quot; &lt;br /&gt;
  where &amp;quot;colineal a b c ≡ ∃l. en a l ∧ en b l ∧ en c l&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text ‹&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
  Ejercicio 7. Demostrar que existen tres puntos a, b y c tales que&lt;br /&gt;
     ¬ colineal a b c&lt;br /&gt;
  --------------------------------------------------------------------------------------------------&lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
― ‹ Demostración automática ›&lt;br /&gt;
lemma (in Geom) &amp;quot;∃a b c. ¬ colineal a b c&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
  ― ‹ Demostración estructurada ›&lt;br /&gt;
lemma (in Geom) &amp;quot;∃a b c. ¬ colineal a b c&amp;quot;&lt;br /&gt;
oops &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
</feed>