<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/LMF2013/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mjoseh</id>
	<title>Lógica matemática y fundamentos (2012-13) - Contribuciones del usuario [es]</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/LMF2013/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mjoseh"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php/Especial:Contribuciones/Mjoseh"/>
	<updated>2026-07-19T13:43:12Z</updated>
	<subtitle>Contribuciones del usuario</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=559</id>
		<title>Lógica matemática y fundamentos</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=559"/>
		<updated>2014-03-05T08:39:21Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios y sus soluciones colaborativas.&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Iniciación a la programación con Haskell ([[Media:Rel_1.hs |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional en Haskell. ([[Media:Rel_2.hs |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 proposicional con Isabelle/HOL. ([[Rel_3 |Enunciado]]). &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Argumentación proposicional con Isabelle/HOL. ([[Rel_4 |Enunciado]] y [[Relación 4 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de conectivas. ([[Rel_5 |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;: Formalización de argumentos en lógica de primer orden. ([[Rel_6 |Enunciado]] y [[Relación 6 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer con Isabelle/HOL. ([[Rel_7 |Enunciado]] y [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Tableros semánticos proposicionales en Haskell. ([[Media:Rel_8.hs |Enunciado]] y [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Formas normales en lógica proposicional en Haskell ([[Media:FormasNormales.hs |Enunciado]] y [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Cláusulas proposicionales en Haskell. ([[Media:Clausulas.hs |Enunciado]] y [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Resolución proposicional en Haskell. ([[Media:ResolucionProposicional.hs |Enunciado]] y [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la Lógica Proposicional en Haskell. ([[Media:AplicacionesLP.hs |Enunciado]] y [[AplicacionesLP |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: Programación funcional en Isabelle/HOL. ([[Media:R13.thy |Enunciado]] y [[Relación 13 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Razonamiento sobre programas con Isabelle/HOL. ([[Media:R14.thy |Enunciado]] y [[Relación 14 |Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
=== Teorías Isabelle/HOL ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 2&amp;#039;&amp;#039;&amp;#039;: [[Tema 2 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 8&amp;#039;&amp;#039;&amp;#039;: [[Tema 8 | Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 14&amp;#039;&amp;#039;&amp;#039;: [[Tema 14 | Programación funcional en Isabelle/HOL]] ([[Media:T14.thy |Teoría]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 15&amp;#039;&amp;#039;&amp;#039;: [[Tema 15 | Razonamiento sobre programas con Isabelle/HOL]] ([[Media:T15.thy |Teoría]]).&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios evaluables ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1&amp;#039;&amp;#039;&amp;#039;: [[Relación 3 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 2 |Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nota al ejercicio 2&amp;#039;&amp;#039;&amp;#039;: los lemas auxiliares que se usen en una demostración por deducción natural han de ser probados de forma no automática. Se amplía el plazo hasta el viernes 3 de mayo para que se envíe el ejercicio 2 teniendo en cuenta esta aclaración.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 3 |Argumentación, deducción natural en lógica de primer orden con Isabelle/HOL y tableros semánticos]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 4 | Algoritmos de lógica proposicional en Haskell]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 5 (opcional)&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 5 | Formas normales condicionales (Haskell e Isabelle/HOL)]].&lt;br /&gt;
&lt;br /&gt;
=== Problemas semanales ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 1&amp;#039;&amp;#039;&amp;#039;: [[Problema 1 | Inducción sobre fórmulas]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 2&amp;#039;&amp;#039;&amp;#039;: [[Problema 2 | Subconjuntos inconsistentes]].&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=558</id>
		<title>Lógica matemática y fundamentos</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=558"/>
		<updated>2014-03-05T08:17:28Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios y sus soluciones colaborativas.&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Iniciación a la programación con Haskell ([[Media:Rel_1.hs |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional en Haskell. ([[Media:Rel_2.hs |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 proposicional con Isabelle/HOL. ([[Rel_3 |Enunciado]] y [[Relación 3 |Solución colaborativa]]).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Argumentación proposicional con Isabelle/HOL. ([[Rel_4 |Enunciado]] y [[Relación 4 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de conectivas. ([[Rel_5 |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;: Formalización de argumentos en lógica de primer orden. ([[Rel_6 |Enunciado]] y [[Relación 6 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer con Isabelle/HOL. ([[Rel_7 |Enunciado]] y [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Tableros semánticos proposicionales en Haskell. ([[Media:Rel_8.hs |Enunciado]] y [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Formas normales en lógica proposicional en Haskell ([[Media:FormasNormales.hs |Enunciado]] y [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Cláusulas proposicionales en Haskell. ([[Media:Clausulas.hs |Enunciado]] y [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Resolución proposicional en Haskell. ([[Media:ResolucionProposicional.hs |Enunciado]] y [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la Lógica Proposicional en Haskell. ([[Media:AplicacionesLP.hs |Enunciado]] y [[AplicacionesLP |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: Programación funcional en Isabelle/HOL. ([[Media:R13.thy |Enunciado]] y [[Relación 13 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Razonamiento sobre programas con Isabelle/HOL. ([[Media:R14.thy |Enunciado]] y [[Relación 14 |Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
=== Teorías Isabelle/HOL ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 2&amp;#039;&amp;#039;&amp;#039;: [[Tema 2 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 8&amp;#039;&amp;#039;&amp;#039;: [[Tema 8 | Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 14&amp;#039;&amp;#039;&amp;#039;: [[Tema 14 | Programación funcional en Isabelle/HOL]] ([[Media:T14.thy |Teoría]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 15&amp;#039;&amp;#039;&amp;#039;: [[Tema 15 | Razonamiento sobre programas con Isabelle/HOL]] ([[Media:T15.thy |Teoría]]).&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios evaluables ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1&amp;#039;&amp;#039;&amp;#039;: [[Relación 3 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 2 |Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nota al ejercicio 2&amp;#039;&amp;#039;&amp;#039;: los lemas auxiliares que se usen en una demostración por deducción natural han de ser probados de forma no automática. Se amplía el plazo hasta el viernes 3 de mayo para que se envíe el ejercicio 2 teniendo en cuenta esta aclaración.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 3 |Argumentación, deducción natural en lógica de primer orden con Isabelle/HOL y tableros semánticos]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 4 | Algoritmos de lógica proposicional en Haskell]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 5 (opcional)&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 5 | Formas normales condicionales (Haskell e Isabelle/HOL)]].&lt;br /&gt;
&lt;br /&gt;
=== Problemas semanales ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 1&amp;#039;&amp;#039;&amp;#039;: [[Problema 1 | Inducción sobre fórmulas]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 2&amp;#039;&amp;#039;&amp;#039;: [[Problema 2 | Subconjuntos inconsistentes]].&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Ejercicio_5&amp;diff=554</id>
		<title>Ejercicio 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Ejercicio_5&amp;diff=554"/>
		<updated>2013-06-10T11:22:38Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunciado ==&lt;br /&gt;
El quinto ejercicio evaluable consiste en realizar dos casos de estudio, las expresiones booleanas y las expresiones condicionales. Concretamente:&lt;br /&gt;
&lt;br /&gt;
* Especificación en Haskell de las expresiones booleanaas y de las expresiones condicionales. Funciones que transforman una expresión booleana en una expresión condicional normalizada.&lt;br /&gt;
&lt;br /&gt;
* Demostración de la corrección de la función de transformación, usando Isabelle/HOL.&lt;br /&gt;
&lt;br /&gt;
Los ficheros correspondientes son: ([[Media: Expresiones_If_p.hs |Enunciado en Haskell]] y [[Media: Expresiones_If_p.thy |Enunciado en Isabelle/HOL]]).&lt;br /&gt;
&lt;br /&gt;
Los ficheros con las soluciones (usuario_5.hs y usuario_5.thy) se enviarán a mjoseh@us.es antes del lunes 17 de junio.&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Ejercicio_5&amp;diff=553</id>
		<title>Ejercicio 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Ejercicio_5&amp;diff=553"/>
		<updated>2013-06-06T07:45:53Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunciado ==&lt;br /&gt;
El quinto ejercicio evaluable consiste en realizar dos casos de estudio, las expresiones booleanas y las expresiones condicionales. Concretamente:&lt;br /&gt;
&lt;br /&gt;
* Especificación en Haskell de las expresiones booleanaas y de las expresiones condicionales. Funciones que transforman una expresión booleana en una expresión condicional normalizada.&lt;br /&gt;
&lt;br /&gt;
* Demostración de la corrección de la función de transformación, usando Isabelle/HOL.&lt;br /&gt;
&lt;br /&gt;
Los ficheros correspondientes son: ([[Media: Expresiones_If_p.hs |Enunciado en Haskell]] y [[Media: Expresiones_If_p.thy |Enunciado en Isabelle/HOL]]).&lt;br /&gt;
&lt;br /&gt;
Los ficheros con las soluciones (usuario_5.hs y usuario_5.thy) se enviarán a mjoseh@us.es antes del lunes 14 de junio.&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:Expresiones_If_p.thy&amp;diff=552</id>
		<title>Archivo:Expresiones If p.thy</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:Expresiones_If_p.thy&amp;diff=552"/>
		<updated>2013-06-05T08:02:33Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:Expresiones_If_p.hs&amp;diff=551</id>
		<title>Archivo:Expresiones If p.hs</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:Expresiones_If_p.hs&amp;diff=551"/>
		<updated>2013-06-05T08:02:15Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Ejercicio_5&amp;diff=550</id>
		<title>Ejercicio 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Ejercicio_5&amp;diff=550"/>
		<updated>2013-06-05T08:01:32Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con &amp;#039;== Enunciado == El quinto ejercicio evaluable consiste en realizar dos casos de estudio, las expresiones booleanas y las expresiones condicionales. Concretamente:  * Especificac...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunciado ==&lt;br /&gt;
El quinto ejercicio evaluable consiste en realizar dos casos de estudio, las expresiones booleanas y las expresiones condicionales. Concretamente:&lt;br /&gt;
&lt;br /&gt;
* Especificación en Haskell de las expresiones booleanaas y de las expresiones condicionales. Funciones que transforman una expresión booleana en una expresión condicional normalizada.&lt;br /&gt;
&lt;br /&gt;
* Demostración de la corrección de la función de transformación, usando Isabelle/HOL.&lt;br /&gt;
&lt;br /&gt;
Los ficheros correspondientes son: ([[Media: Expresiones_If_p.hs |Enunciado en Haskell]] y [[Media: Expresiones_If_p.thy |Enunciado en Isabelle/HOL]]).&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=549</id>
		<title>Lógica matemática y fundamentos</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=549"/>
		<updated>2013-06-05T07:48:04Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios y sus soluciones colaborativas.&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Iniciación a la programación con Haskell ([[Media:Rel_1.hs |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional en Haskell. ([[Media:Rel_2.hs |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 proposicional con Isabelle/HOL. ([[Rel_3 |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;: Argumentación proposicional con Isabelle/HOL. ([[Rel_4 |Enunciado]] y [[Relación 4 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de conectivas. ([[Rel_5 |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;: Formalización de argumentos en lógica de primer orden. ([[Rel_6 |Enunciado]] y [[Relación 6 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer con Isabelle/HOL. ([[Rel_7 |Enunciado]] y [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Tableros semánticos proposicionales en Haskell. ([[Media:Rel_8.hs |Enunciado]] y [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Formas normales en lógica proposicional en Haskell ([[Media:FormasNormales.hs |Enunciado]] y [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Cláusulas proposicionales en Haskell. ([[Media:Clausulas.hs |Enunciado]] y [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Resolución proposicional en Haskell. ([[Media:ResolucionProposicional.hs |Enunciado]] y [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la Lógica Proposicional en Haskell. ([[Media:AplicacionesLP.hs |Enunciado]] y [[AplicacionesLP |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: Programación funcional en Isabelle/HOL. ([[Media:R13.thy |Enunciado]] y [[Relación 13 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Razonamiento sobre programas con Isabelle/HOL. ([[Media:R14.thy |Enunciado]] y [[Relación 14 |Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
=== Teorías Isabelle/HOL ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 2&amp;#039;&amp;#039;&amp;#039;: [[Tema 2 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 8&amp;#039;&amp;#039;&amp;#039;: [[Tema 8 | Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 14&amp;#039;&amp;#039;&amp;#039;: [[Tema 14 | Programación funcional en Isabelle/HOL]] ([[Media:T14.thy |Teoría]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 15&amp;#039;&amp;#039;&amp;#039;: [[Tema 15 | Razonamiento sobre programas con Isabelle/HOL]] ([[Media:T15.thy |Teoría]]).&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios evaluables ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 1 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 2 |Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nota al ejercicio 2&amp;#039;&amp;#039;&amp;#039;: los lemas auxiliares que se usen en una demostración por deducción natural han de ser probados de forma no automática. Se amplía el plazo hasta el viernes 3 de mayo para que se envíe el ejercicio 2 teniendo en cuenta esta aclaración.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 3 |Argumentación, deducción natural en lógica de primer orden con Isabelle/HOL y tableros semánticos]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 4 | Algoritmos de lógica proposicional en Haskell]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 5 (opcional)&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 5 | Formas normales condicionales (Haskell e Isabelle/HOL)]].&lt;br /&gt;
&lt;br /&gt;
=== Problemas semanales ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 1&amp;#039;&amp;#039;&amp;#039;: [[Problema 1 | Inducción sobre fórmulas]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 2&amp;#039;&amp;#039;&amp;#039;: [[Problema 2 | Subconjuntos inconsistentes]].&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Relaci%C3%B3n_14&amp;diff=547</id>
		<title>Relación 14</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Relaci%C3%B3n_14&amp;diff=547"/>
		<updated>2013-05-29T09:32:35Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con &amp;#039;&amp;lt;source lang = &amp;quot;Isar&amp;quot;&amp;gt; header {* R14: Razonamiento sobre programas en Isabelle/HOL *}   theory R14 imports Main  begin   text {* ------------------------------------------------...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;Isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R14: Razonamiento sobre programas en Isabelle/HOL *}&lt;br /&gt;
 &lt;br /&gt;
theory R14&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     sumaImpares :: nat ⇒ nat&lt;br /&gt;
  tal que (sumaImpares n) es la suma de los n primeros números&lt;br /&gt;
  impares. Por ejemplo,&lt;br /&gt;
     sumaImpares 5  =  25&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun sumaImpares :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares n = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;sumaImpares 5&amp;quot; -- &amp;quot;= 25&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que &lt;br /&gt;
     sumaImpares n = n*n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: nat ⇒ nat&lt;br /&gt;
  tal que &lt;br /&gt;
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaPotenciasDeDosMasUno 3  =  16&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno n = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;sumaPotenciasDeDosMasUno 3&amp;quot; -- &amp;quot;= 16&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar que &lt;br /&gt;
     sumaPotenciasDeDosMasUno n = 2^(n+1)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     copia :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (copia n x) es la lista formado por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     copia 3 x = [x,x,x]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun copia :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia n x = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;copia 3 x&amp;quot; -- &amp;quot;= [x,x,x]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&lt;br /&gt;
     todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&lt;br /&gt;
  Nota: La conjunción se representa por ∧&lt;br /&gt;
  ----------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p xs = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(1::nat)) [2,6,4]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(2::nat)) [2,6,4]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que todos los elementos de (copia n x) son&lt;br /&gt;
  iguales a x. &lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la función&lt;br /&gt;
    factR :: nat ⇒ nat&lt;br /&gt;
  tal que (factR n) es el factorial de n. Por ejemplo,&lt;br /&gt;
    factR 4 = 24&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun factR :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factR n = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;factR 4&amp;quot; -- &amp;quot;= 24&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Se considera la siguiente definición iterativa de la&lt;br /&gt;
  función factorial &lt;br /&gt;
     factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI n = factI&amp;#039; n 1&lt;br /&gt;
 &lt;br /&gt;
     factI&amp;#039; :: nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI&amp;#039; 0       x = x&lt;br /&gt;
     factI&amp;#039; (Suc n) x = factI&amp;#039; n (Suc n)*x&lt;br /&gt;
  Demostrar que, para todo n y todo x, se tiene &lt;br /&gt;
     factI&amp;#039; n x = x * factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
fun factI&amp;#039; :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI&amp;#039; 0       x = x&amp;quot;&lt;br /&gt;
| &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (Suc n)*x&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
fun factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI n = factI&amp;#039; n 1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;factI 4&amp;quot; -- &amp;quot;= 24&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
lemma fact: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que&lt;br /&gt;
     factI n = factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
corollary &amp;quot;factI n = factR n&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir, recursivamente y sin usar (@), la función&lt;br /&gt;
     amplia :: &amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al&lt;br /&gt;
  final de la lista xs. Por ejemplo,&lt;br /&gt;
     amplia [d,a] t = [d,a,t]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
 &lt;br /&gt;
fun amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;amplia xs y = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;amplia [d,a] t&amp;quot; -- &amp;quot;= [d,a,t]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar que &lt;br /&gt;
     amplia xs y = xs @ [y]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
 &lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&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/LMF2013/index.php?title=Archivo:R14.thy&amp;diff=546</id>
		<title>Archivo:R14.thy</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:R14.thy&amp;diff=546"/>
		<updated>2013-05-29T09:31:44Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=545</id>
		<title>Lógica matemática y fundamentos</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=545"/>
		<updated>2013-05-29T09:31:14Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios y sus soluciones colaborativas.&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Iniciación a la programación con Haskell ([[Media:Rel_1.hs |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional en Haskell. ([[Media:Rel_2.hs |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 proposicional con Isabelle/HOL. ([[Rel_3 |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;: Argumentación proposicional con Isabelle/HOL. ([[Rel_4 |Enunciado]] y [[Relación 4 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de conectivas. ([[Rel_5 |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;: Formalización de argumentos en lógica de primer orden. ([[Rel_6 |Enunciado]] y [[Relación 6 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer con Isabelle/HOL. ([[Rel_7 |Enunciado]] y [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Tableros semánticos proposicionales en Haskell. ([[Media:Rel_8.hs |Enunciado]] y [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Formas normales en lógica proposicional en Haskell ([[Media:FormasNormales.hs |Enunciado]] y [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Cláusulas proposicionales en Haskell. ([[Media:Clausulas.hs |Enunciado]] y [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Resolución proposicional en Haskell. ([[Media:ResolucionProposicional.hs |Enunciado]] y [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la Lógica Proposicional en Haskell. ([[Media:AplicacionesLP.hs |Enunciado]] y [[AplicacionesLP |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: Programación funcional en Isabelle/HOL. ([[Media:R13.thy |Enunciado]] y [[Relación 13 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Razonamiento sobre programas con Isabelle/HOL. ([[Media:R14.thy |Enunciado]] y [[Relación 14 |Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
=== Teorías Isabelle/HOL ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 2&amp;#039;&amp;#039;&amp;#039;: [[Tema 2 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 8&amp;#039;&amp;#039;&amp;#039;: [[Tema 8 | Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 14&amp;#039;&amp;#039;&amp;#039;: [[Tema 14 | Programación funcional en Isabelle/HOL]] ([[Media:T14.thy |Teoría]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 15&amp;#039;&amp;#039;&amp;#039;: [[Tema 15 | Razonamiento sobre programas con Isabelle/HOL]] ([[Media:T15.thy |Teoría]]).&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios evaluables ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 1 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 2 |Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nota al ejercicio 2&amp;#039;&amp;#039;&amp;#039;: los lemas auxiliares que se usen en una demostración por deducción natural han de ser probados de forma no automática. Se amplía el plazo hasta el viernes 3 de mayo para que se envíe el ejercicio 2 teniendo en cuenta esta aclaración.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 3 |Argumentación, deducción natural en lógica de primer orden con Isabelle/HOL y tableros semánticos]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 4 | Algoritmos de lógica proposicional en Haskell]].&lt;br /&gt;
&lt;br /&gt;
=== Problemas semanales ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 1&amp;#039;&amp;#039;&amp;#039;: [[Problema 1 | Inducción sobre fórmulas]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 2&amp;#039;&amp;#039;&amp;#039;: [[Problema 2 | Subconjuntos inconsistentes]].&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_15&amp;diff=544</id>
		<title>Tema 15</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_15&amp;diff=544"/>
		<updated>2013-05-27T07:10:21Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;Isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 15: Razonamiento sobre programas en Isabelle *}&lt;br /&gt;
&lt;br /&gt;
theory T15&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En este tema se demuestra con Isabelle las propiedades de los&lt;br /&gt;
  programas funcionales como se expone en el tema 8 del curso&lt;br /&gt;
  &amp;quot;Informática&amp;quot; que puede leerse en&lt;br /&gt;
  http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-8t.pdf&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Razonamiento ecuacional *}&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Definir, por recursión, la función&lt;br /&gt;
     longitud :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  tal que (longitud xs) es la longitud de la listas xs. Por ejemplo,&lt;br /&gt;
     longitud [4,2,5] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
fun longitud :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;longitud []     = 0&amp;quot;&lt;br /&gt;
| &amp;quot;longitud (x#xs) = 1 + longitud xs&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
value &amp;quot;longitud [4,2,5]&amp;quot; -- &amp;quot;= 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que &lt;br /&gt;
     longitud [4,2,5] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud [4,2,5] = 3&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     fun intercambia :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (intercambia p) es el par obtenido intercambiando las&lt;br /&gt;
  componentes del par p. Por ejemplo,&lt;br /&gt;
     &amp;quot;intercambia (2,3) = (3,2)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun intercambia :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;intercambia (x,y) = (y,x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;intercambia (2,3)&amp;quot; -- &amp;quot;= (3,2)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar que &lt;br /&gt;
     intercambia (intercambia (x,y)) = (x,y)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;intercambia (intercambia (x,y)) = (x,y)&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir, por recursión, la función&lt;br /&gt;
     inversa :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (inversa xs) es la lista obtenida invirtiendo el orden de los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     inversa [3,2,5] = [5,2,3]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversa :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;inversa (x#xs) = inversa xs @ [x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa [3,2,5]&amp;quot; -- &amp;quot;= [5,2,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que &lt;br /&gt;
     inversa [x] = [x]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;inversa [x] = [x]&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     repite :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  tal que . Por ejemplo,&lt;br /&gt;
     repite 3 5 = [5,5,5]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun repite :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite 0 x = []&amp;quot;&lt;br /&gt;
| &amp;quot;repite (Suc n) x = x # (repite n x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;repite 3 5&amp;quot; -- &amp;quot;= [5,5,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que &lt;br /&gt;
     longitud (repite n x) = n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
apply (induct_tac n) &lt;br /&gt;
apply (auto)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
lemma longitud_repite:&lt;br /&gt;
  &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;longitud (repite 0 x) = 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume hi: &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
  show &amp;quot;longitud (repite (Suc n) x) = Suc n&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;longitud (repite (Suc n) x) = longitud (x # (repite n x))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 +  longitud (repite n x)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + n&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = Suc n&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función&lt;br /&gt;
     fun conc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que . Por ejemplo,&lt;br /&gt;
     conc [2,3] [4,3,5] = [2,3,4,3,5]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun conc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc []     ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;conc (x#xs) ys = x # (conc xs ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc [2,3] [4,3,5]&amp;quot; -- &amp;quot;= [2,3,4,3,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que &lt;br /&gt;
     conc xs (conc ys zs) = (conc xs ys) zs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc xs (conc ys zs) = conc (conc xs ys) zs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
lemma conc_asociativa:&lt;br /&gt;
  &amp;quot;conc xs (conc ys zs) = conc (conc xs ys) zs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;conc [] (conc ys zs) = conc (conc [] ys) zs&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;conc xs (conc ys zs) = conc (conc xs ys) zs&amp;quot;&lt;br /&gt;
  show &amp;quot;conc (x # xs) (conc ys zs) = conc (conc (x # xs) ys) zs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;conc (x # xs) (conc ys zs) = x # (conc xs (conc ys zs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x # (conc (conc xs ys) zs)&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = conc (x#(conc xs ys)) zs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = conc (conc (x # xs) ys) zs&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Refutar que &lt;br /&gt;
     conc xs ys = conc ys xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc xs ys = conc ys xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* Encuentra el contraejemplo, &lt;br /&gt;
  xs = [a\&amp;lt;^isub&amp;gt;2]&lt;br /&gt;
  ys = [a\&amp;lt;^isub&amp;gt;1] *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar que &lt;br /&gt;
     conc xs [] = xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc xs [] = xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar que &lt;br /&gt;
     longitud (conc xs ys) = longitud xs + longitud ys&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (conc xs ys) = longitud xs + longitud ys&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
lemma long_conc:&lt;br /&gt;
  &amp;quot;longitud (conc xs ys) = longitud xs + longitud ys&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;longitud (conc [] ys) = longitud [] + longitud ys&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;longitud (conc xs ys) = longitud xs + longitud ys&amp;quot;&lt;br /&gt;
  show &amp;quot;longitud (conc (x # xs) ys) = longitud (x # xs) + longitud ys&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;longitud (conc (x # xs) ys) = longitud (x # (conc xs ys))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + longitud (conc xs ys)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + (longitud xs + longitud ys)&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = (1+ longitud xs) + longitud ys&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = longitud (x # xs) + longitud ys&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Definir la función&lt;br /&gt;
     coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (coge n xs) es la lista de los n primeros elementos de xs. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     coge 2 [3,7,5,4] = [3,7]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge n [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;coge 0 xs = []&amp;quot;&lt;br /&gt;
| &amp;quot;coge (Suc n) (x#xs) = x # (coge n xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge 2 [3,7,5,4]&amp;quot; -- &amp;quot;= [3,7]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función&lt;br /&gt;
     elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (coge n xs) es la lista de los n primeros elementos de xs. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     elimina 2 [3,7,5,4] = [5,4]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;elimina 0 xs = xs&amp;quot;&lt;br /&gt;
| &amp;quot;elimina (Suc n) (x#xs) = elimina n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina 2 [3,7,5,4]&amp;quot; -- &amp;quot;= [5,4]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar que &lt;br /&gt;
     conc (coge n xs) (elimina n xs) = xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
by (induct rule: coge.induct) auto&lt;br /&gt;
&lt;br /&gt;
text {* coge.induct es el esquema de inducción asociado a la definición&lt;br /&gt;
  de la función coge. Puede verse como sigue: *}&lt;br /&gt;
&lt;br /&gt;
thm coge.induct&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
by (induct rule: elimina.induct) auto&lt;br /&gt;
&lt;br /&gt;
thm elimina.induct&lt;br /&gt;
&lt;br /&gt;
lemma conc_coge_elimina:&lt;br /&gt;
  &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
proof (induct rule: coge.induct) &lt;br /&gt;
  show &amp;quot;⋀n. conc (coge n []) (elimina n []) = []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;⋀v va. conc (coge 0 (v # va)) (elimina 0 (v # va)) = v # va&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs n &lt;br /&gt;
  assume hi: &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
  show &amp;quot;conc (coge (Suc n) (x # xs)) (elimina (Suc n) (x # xs)) = x # xs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;conc (coge (Suc n) (x # xs)) (elimina (Suc n) (x # xs)) = conc (coge (Suc n) (x # xs)) (elimina n xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = conc (x# (coge n xs)) (elimina n xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x#(conc (coge n xs) (elimina n xs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (x#xs)&amp;quot; using hi by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función&lt;br /&gt;
     esVacia :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot;&lt;br /&gt;
  tal que (esVacia xs) se verifica si xs es la lista vacía. Por ejemplo, &lt;br /&gt;
     esVacia []  = True&lt;br /&gt;
     esVacia [1] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun esVacia :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;esVacia (x#xs) = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;esVacia []&amp;quot;  -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;esVacia [1]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar que &lt;br /&gt;
     esVacia xs = esVacia (conc xs xs)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
lemma vacia_conc:&lt;br /&gt;
  &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;esVacia [] = esVacia (conc [] [])&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
    fix x xs&lt;br /&gt;
    assume hi: &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
    show &amp;quot;esVacia (x # xs) = esVacia (conc (x # xs) (x # xs))&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
      have &amp;quot;esVacia (conc (x # xs) (x # xs)) = esVacia (x# (conc xs (x#xs)))&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;... = esVacia (x # 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;
lemma vacia_conc&amp;#039;:&lt;br /&gt;
  &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
proof (cases xs)&lt;br /&gt;
  case Nil thus ?thesis by simp&lt;br /&gt;
next&lt;br /&gt;
  case Cons thus ?thesis by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma vacia_conc&amp;#039;&amp;#039;:&lt;br /&gt;
  &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
by (cases xs) simp_all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Definir la función&lt;br /&gt;
     inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (inversaAc xs) es a inversa de xs calculada usando&lt;br /&gt;
  acumuladores. Por ejemplo, &lt;br /&gt;
     inversaAc [3,2,5] = [5,2,3]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversaAcAux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux [] ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;inversaAcAux (x#xs) ys = inversaAcAux xs (x#ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc xs = inversaAcAux xs []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc [3,2,5]&amp;quot; -- &amp;quot;= [5,2,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar que &lt;br /&gt;
     inversaAcAux xs ys = (inversa xs)@ys&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma inversaAcAux_es_inversa:&lt;br /&gt;
  &amp;quot;inversaAcAux xs ys = (inversa xs)@ys&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: ys) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma inversaAcAux_es_inversa_b:&lt;br /&gt;
  &amp;quot;inversaAcAux xs ys = (inversa xs)@ys&amp;quot;&lt;br /&gt;
proof (induct xs arbitrary: ys) &lt;br /&gt;
  show &amp;quot;⋀ys. inversaAcAux [] ys = inversa [] @ ys&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs zs&lt;br /&gt;
  assume hi: &amp;quot;⋀ys. inversaAcAux xs ys = inversa xs @ ys&amp;quot;&lt;br /&gt;
  show &amp;quot;inversaAcAux (x#xs) zs = inversa (x#xs) @ zs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;inversaAcAux (x#xs) zs = inversaAcAux xs (x#zs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = inversa xs @ (x#zs)&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = inversa xs @ [x] @ zs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = inversa (x#xs) @ zs&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar que &lt;br /&gt;
     inversaAc xs = inversa xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
corollary &amp;quot;inversaAc xs = inversa xs&amp;quot;&lt;br /&gt;
by (simp add: inversaAcAux_es_inversa)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Definir la función&lt;br /&gt;
     sum :: &amp;quot;int list ⇒ int&amp;quot; &lt;br /&gt;
  tal que (sum xs) es la suma de los elementos de xs. Por ejemplo,&lt;br /&gt;
     sum [3,2,5] = 10&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sum :: &amp;quot;int list ⇒ int&amp;quot; where&lt;br /&gt;
  &amp;quot;sum []     = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sum (x#xs) = x + sum xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sum [3,2,5]&amp;quot; -- &amp;quot;= 10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Definir la función&lt;br /&gt;
     map :: (&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&lt;br /&gt;
  tal que (map f xs) es la lista obtenida aplicando la función f a los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     map (λx. 2*x) [3,2,5] = [6,4,10]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun map :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map f []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;map f (x#xs) = (f x) # map f xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;map (λx. 2*x) [3::int,2,5]&amp;quot; -- &amp;quot;= [6,4,10]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;map (λx. 6*x) [3::int,2,5]&amp;quot; -- &amp;quot;= [18,12,30]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar que &lt;br /&gt;
     sum (map (λx. 2*x) xs) = 2 * (sum xs)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;sum (map (λx. 2*x) xs) = 2 * (sum xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma sum_map:&lt;br /&gt;
  &amp;quot;sum (map (λx. 2*x) xs) = 2 * (sum xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;sum (map (λx. 2*x) []) = 2 * (sum [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume hi: &amp;quot;sum (map (λx. 2*x) xs) = 2 * (sum xs)&amp;quot;&lt;br /&gt;
  show &amp;quot;sum (map (λx. 2*x) (a#xs)) = 2 * (sum (a#xs))&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;sum (map (λx. 2*x) (a#xs)) = sum ((2*a)#(map (λx. 2*x) xs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 2*a + sum (map (λx. 2*x) xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 2*a + 2 * (sum xs)&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = 2*(a + sum xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 2 * (sum (a#xs))&amp;quot;by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar que &lt;br /&gt;
     longitud (map f xs) = longitud xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (map f xs) = longitud xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma long_map:&lt;br /&gt;
  &amp;quot;longitud (map f xs) = longitud xs&amp;quot;&lt;br /&gt;
proof (induct xs) &lt;br /&gt;
  show &amp;quot;longitud (map f []) = longitud []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;longitud (map f xs) = longitud xs&amp;quot;&lt;br /&gt;
  show &amp;quot;longitud (map f (x#xs)) = longitud (x#xs)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;longitud (map f (x#xs)) = longitud ((f x)#(map f xs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + longitud (map f xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + longitud xs&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = longitud (x#xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&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/LMF2013/index.php?title=Archivo:T15.thy&amp;diff=543</id>
		<title>Archivo:T15.thy</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:T15.thy&amp;diff=543"/>
		<updated>2013-05-27T07:06:52Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:R13.thy&amp;diff=542</id>
		<title>Archivo:R13.thy</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:R13.thy&amp;diff=542"/>
		<updated>2013-05-27T07:06:27Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: subió una nueva versión de «Archivo:R13.thy»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:R13.thy&amp;diff=541</id>
		<title>Archivo:R13.thy</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:R13.thy&amp;diff=541"/>
		<updated>2013-05-27T07:06:10Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:T14.thy&amp;diff=534</id>
		<title>Archivo:T14.thy</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:T14.thy&amp;diff=534"/>
		<updated>2013-05-22T11:52:53Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_15&amp;diff=530</id>
		<title>Tema 15</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_15&amp;diff=530"/>
		<updated>2013-05-22T08:21:18Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página blanqueada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Relaci%C3%B3n_13&amp;diff=529</id>
		<title>Relación 13</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Relaci%C3%B3n_13&amp;diff=529"/>
		<updated>2013-05-22T08:20:40Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con &amp;#039;&amp;lt;source lang = &amp;quot;Isar&amp;quot;&amp;gt; header {* R13: Programación funcional en Isabelle *}  theory R13 imports Main begin  text {* ------------------------------------------------------------...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;Isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R13: Programación funcional en Isabelle *}&lt;br /&gt;
&lt;br /&gt;
theory R13&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Definir, por recursión, la función&lt;br /&gt;
     longitud :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  tal que (longitud xs) es la longitud de la listas xs. Por ejemplo,&lt;br /&gt;
     longitud [4,2,5] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
fun longitud :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;longitud xs = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;longitud [4,2,5]&amp;quot; -- &amp;quot;= 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     fun intercambia :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (intercambia p) es el par obtenido intercambiando las&lt;br /&gt;
  componentes del par p. Por ejemplo,&lt;br /&gt;
     &amp;quot;intercambia (2,3) = (3,2)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun intercambia :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;intercambia (x,y) = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;intercambia (u,v)&amp;quot; -- &amp;quot;= (v,u)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir, por recursión, la función&lt;br /&gt;
     inversa :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (inversa xs) es la lista obtenida invirtiendo el orden de los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     inversa [3,2,5] = [5,2,3]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversa :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa xs = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;inversa [a,d,c]&amp;quot; -- &amp;quot;= [c,d,a]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     repite :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  tal que . Por ejemplo,&lt;br /&gt;
     repite 3 5 = [5,5,5]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun repite :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite n x = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;repite 3 a&amp;quot; -- &amp;quot;= [a,a,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     fun conc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que . Por ejemplo,&lt;br /&gt;
     conc [2,3] [4,3,5] = [2,3,4,3,5]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun conc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc xs ys = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;conc [a,d] [b,d,a,c]&amp;quot; -- &amp;quot;= [a,d,b,d,a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Definir la función&lt;br /&gt;
     coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (coge n xs) es la lista de los n primeros elementos de xs. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     coge 2 [3,7,5,4] = [3,7]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge n xs = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;coge 2 [a,c,d,b,e]&amp;quot; -- &amp;quot;= [a,c]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (coge n xs) es la lista de los n primeros elementos de xs. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     elimina 2 [3,7,5,4] = [5,4]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n xs = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;elimina 2 [a,c,d,b,e]&amp;quot; -- &amp;quot;= [d,b,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la función&lt;br /&gt;
     esVacia :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot;&lt;br /&gt;
  tal que (esVacia xs) se verifica si xs es la lista vacía. Por ejemplo, &lt;br /&gt;
     esVacia []  = True&lt;br /&gt;
     esVacia [1] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun esVacia :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia xs = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;esVacia []&amp;quot;  -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;esVacia [1]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función&lt;br /&gt;
     inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (inversaAc xs) es a inversa de xs calculada usando&lt;br /&gt;
  acumuladores. Por ejemplo, &lt;br /&gt;
     inversaAc [3,2,5] = [5,2,3]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversaAcAux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux xs ys = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
fun inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc xs = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;inversaAc [a,c,b,e]&amp;quot; -- &amp;quot;= [e,b,c,a]&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir la función&lt;br /&gt;
     sum :: &amp;quot;int list ⇒ int&amp;quot; &lt;br /&gt;
  tal que (sum xs) es la suma de los elementos de xs. Por ejemplo,&lt;br /&gt;
     sum [3,2,5] = 10&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sum :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sum xs = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;sum [3,2,5]&amp;quot; -- &amp;quot;= 10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función&lt;br /&gt;
     map :: (&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&lt;br /&gt;
  tal que (map f xs) es la lista obtenida aplicando la función f a los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     map (λx. 2*x) [3,2,5] = [6,4,10]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun map :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map f xs = undefined&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;map (λx. 2*x) [3::nat,2,5]&amp;quot; -- &amp;quot;= [6,4,10]&amp;quot;&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/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=528</id>
		<title>Lógica matemática y fundamentos</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=528"/>
		<updated>2013-05-22T08:19:50Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios y sus soluciones colaborativas.&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Iniciación a la programación con Haskell ([[Media:Rel_1.hs |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional en Haskell. ([[Media:Rel_2.hs |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 proposicional con Isabelle/HOL. ([[Rel_3 |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;: Argumentación proposicional con Isabelle/HOL. ([[Rel_4 |Enunciado]] y [[Relación 4 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de conectivas. ([[Rel_5 |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;: Formalización de argumentos en lógica de primer orden. ([[Rel_6 |Enunciado]] y [[Relación 6 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer con Isabelle/HOL. ([[Rel_7 |Enunciado]] y [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Tableros semánticos proposicionales en Haskell. ([[Media:Rel_8.hs |Enunciado]] y [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Formas normales en lógica proposicional en Haskell ([[Media:FormasNormales.hs |Enunciado]] y [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Cláusulas proposicionales en Haskell. ([[Media:Clausulas.hs |Enunciado]] y [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Resolución proposicional en Haskell. ([[Media:ResolucionProposicional.hs |Enunciado]] y [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la Lógica Proposicional en Haskell. ([[Media:AplicacionesLP.hs |Enunciado]] y [[AplicacionesLP |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: Programación funcional en Isabelle/HOL. ([[Media:R13.thy |Enunciado]] y [[Relación 13 |Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
=== Teorías Isabelle/HOL ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 2&amp;#039;&amp;#039;&amp;#039;: [[Tema 2 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 8&amp;#039;&amp;#039;&amp;#039;: [[Tema 8 | Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 14&amp;#039;&amp;#039;&amp;#039;: [[Tema 14 | Programación funcional en Isabelle/HOL]] ([[Media:T14.thy |Teoría]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 15&amp;#039;&amp;#039;&amp;#039;: [[Tema 15 | Razonamiento sobre programas con Isabelle/HOL]] ([[Media:T15.thy |Teoría]]).&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios evaluables ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 1 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 2 |Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nota al ejercicio 2&amp;#039;&amp;#039;&amp;#039;: los lemas auxiliares que se usen en una demostración por deducción natural han de ser probados de forma no automática. Se amplía el plazo hasta el viernes 3 de mayo para que se envíe el ejercicio 2 teniendo en cuenta esta aclaración.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 3 |Argumentación, deducción natural en lógica de primer orden con Isabelle/HOL y tableros semánticos]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 4 | Algoritmos de lógica proposicional en Haskell]].&lt;br /&gt;
&lt;br /&gt;
=== Problemas semanales ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 1&amp;#039;&amp;#039;&amp;#039;: [[Problema 1 | Inducción sobre fórmulas]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 2&amp;#039;&amp;#039;&amp;#039;: [[Problema 2 | Subconjuntos inconsistentes]].&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=527</id>
		<title>Lógica matemática y fundamentos</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=527"/>
		<updated>2013-05-22T08:13:44Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios y sus soluciones colaborativas.&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Iniciación a la programación con Haskell ([[Media:Rel_1.hs |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional en Haskell. ([[Media:Rel_2.hs |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 proposicional con Isabelle/HOL. ([[Rel_3 |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;: Argumentación proposicional con Isabelle/HOL. ([[Rel_4 |Enunciado]] y [[Relación 4 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de conectivas. ([[Rel_5 |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;: Formalización de argumentos en lógica de primer orden. ([[Rel_6 |Enunciado]] y [[Relación 6 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer con Isabelle/HOL. ([[Rel_7 |Enunciado]] y [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Tableros semánticos proposicionales en Haskell. ([[Media:Rel_8.hs |Enunciado]] y [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Formas normales en lógica proposicional en Haskell ([[Media:FormasNormales.hs |Enunciado]] y [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Cláusulas proposicionales en Haskell. ([[Media:Clausulas.hs |Enunciado]] y [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Resolución proposicional en Haskell. ([[Media:ResolucionProposicional.hs |Enunciado]] y [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la Lógica Proposicional en Haskell. ([[Media:AplicacionesLP.hs |Enunciado]] y [[AplicacionesLP |Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
=== Teorías Isabelle/HOL ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 2&amp;#039;&amp;#039;&amp;#039;: [[Tema 2 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 8&amp;#039;&amp;#039;&amp;#039;: [[Tema 8 | Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 14&amp;#039;&amp;#039;&amp;#039;: [[Tema 14 | Programación funcional en Isabelle/HOL]] ([[Media:T14.thy |Teoría]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 15&amp;#039;&amp;#039;&amp;#039;: [[Tema 15 | Razonamiento sobre programas con Isabelle/HOL]] ([[Media:T15.thy |Teoría]]).&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios evaluables ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 1 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 2 |Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nota al ejercicio 2&amp;#039;&amp;#039;&amp;#039;: los lemas auxiliares que se usen en una demostración por deducción natural han de ser probados de forma no automática. Se amplía el plazo hasta el viernes 3 de mayo para que se envíe el ejercicio 2 teniendo en cuenta esta aclaración.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 3 |Argumentación, deducción natural en lógica de primer orden con Isabelle/HOL y tableros semánticos]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 4 | Algoritmos de lógica proposicional en Haskell]].&lt;br /&gt;
&lt;br /&gt;
=== Problemas semanales ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 1&amp;#039;&amp;#039;&amp;#039;: [[Problema 1 | Inducción sobre fórmulas]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 2&amp;#039;&amp;#039;&amp;#039;: [[Problema 2 | Subconjuntos inconsistentes]].&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_15&amp;diff=526</id>
		<title>Tema 15</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_15&amp;diff=526"/>
		<updated>2013-05-22T08:13:02Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;Isar&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
header {* Tema 15: Razonamiento sobre programas en Isabelle *}&lt;br /&gt;
&lt;br /&gt;
theory T15&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En este tema se demuestra con Isabelle las propiedades de los&lt;br /&gt;
  programas funcionales como se expone en el tema 8 del curso&lt;br /&gt;
  &amp;quot;Informática&amp;quot; que puede leerse en&lt;br /&gt;
  http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-8t.pdf&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Razonamiento ecuacional *}&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Definir, por recursión, la función&lt;br /&gt;
     longitud :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  tal que (longitud xs) es la longitud de la listas xs. Por ejemplo,&lt;br /&gt;
     longitud [4,2,5] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
fun longitud :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;longitud []     = 0&amp;quot;&lt;br /&gt;
| &amp;quot;longitud (x#xs) = 1 + longitud xs&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
value &amp;quot;longitud [4,2,5]&amp;quot; -- &amp;quot;= 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que &lt;br /&gt;
     longitud [4,2,5] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud [4,2,5] = 3&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     fun intercambia :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (intercambia p) es el par obtenido intercambiando las&lt;br /&gt;
  componentes del par p. Por ejemplo,&lt;br /&gt;
     &amp;quot;intercambia (2,3) = (3,2)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun intercambia :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;intercambia (x,y) = (y,x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;intercambia (2,3)&amp;quot; -- &amp;quot;= (3,2)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar que &lt;br /&gt;
     intercambia (intercambia (x,y)) = (x,y)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;intercambia (intercambia (x,y)) = (x,y)&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir, por recursión, la función&lt;br /&gt;
     inversa :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (inversa xs) es la lista obtenida invirtiendo el orden de los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     inversa [3,2,5] = [5,2,3]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversa :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;inversa (x#xs) = inversa xs @ [x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa [3,2,5]&amp;quot; -- &amp;quot;= [5,2,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que &lt;br /&gt;
     inversa [x] = [x]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;inversa [x] = [x]&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     repite :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  tal que . Por ejemplo,&lt;br /&gt;
     repite 3 5 = [5,5,5]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun repite :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite 0 x = []&amp;quot;&lt;br /&gt;
| &amp;quot;repite (Suc n) x = x # (repite n x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;repite 3 5&amp;quot; -- &amp;quot;= [5,5,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que &lt;br /&gt;
     longitud (repite n x) = n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
apply (induct_tac n) &lt;br /&gt;
apply (auto)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
lemma longitud_repite:&lt;br /&gt;
  &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;longitud (repite 0 x) = 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume hi: &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
  show &amp;quot;longitud (repite (Suc n) x) = Suc n&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;longitud (repite (Suc n) x) = longitud (x # (repite n x))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 +  longitud (repite n x)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + n&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = Suc n&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función&lt;br /&gt;
     fun conc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que . Por ejemplo,&lt;br /&gt;
     conc [2,3] [4,3,5] = [2,3,4,3,5]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun conc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc []     ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;conc (x#xs) ys = x # (conc xs ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc [2,3] [4,3,5]&amp;quot; -- &amp;quot;= [2,3,4,3,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que &lt;br /&gt;
     conc xs (conc ys zs) = (conc xs ys) zs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc xs (conc ys zs) = conc (conc xs ys) zs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
lemma conc_asociativa:&lt;br /&gt;
  &amp;quot;conc xs (conc ys zs) = conc (conc xs ys) zs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;conc [] (conc ys zs) = conc (conc [] ys) zs&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;conc xs (conc ys zs) = conc (conc xs ys) zs&amp;quot;&lt;br /&gt;
  show &amp;quot;conc (x # xs) (conc ys zs) = conc (conc (x # xs) ys) zs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;conc (x # xs) (conc ys zs) = x # (conc xs (conc ys zs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x # (conc (conc xs ys) zs)&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = conc (x#(conc xs ys)) zs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = conc (conc (x # xs) ys) zs&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Refutar que &lt;br /&gt;
     conc xs ys = conc ys xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc xs ys = conc ys xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* Encuentra el contraejemplo, &lt;br /&gt;
  xs = [a\&amp;lt;^isub&amp;gt;2]&lt;br /&gt;
  ys = [a\&amp;lt;^isub&amp;gt;1] *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar que &lt;br /&gt;
     conc xs [] = xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc xs [] = xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar que &lt;br /&gt;
     longitud (conc xs ys) = longitud xs + longitud ys&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (conc xs ys) = longitud xs + longitud ys&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
lemma long_conc:&lt;br /&gt;
  &amp;quot;longitud (conc xs ys) = longitud xs + longitud ys&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;longitud (conc [] ys) = longitud [] + longitud ys&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;longitud (conc xs ys) = longitud xs + longitud ys&amp;quot;&lt;br /&gt;
  show &amp;quot;longitud (conc (x # xs) ys) = longitud (x # xs) + longitud ys&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;longitud (conc (x # xs) ys) = longitud (x # (conc xs ys))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + longitud (conc xs ys)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + (longitud xs + longitud ys)&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = (1+ longitud xs) + longitud ys&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = longitud (x # xs) + longitud ys&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Definir la función&lt;br /&gt;
     coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (coge n xs) es la lista de los n primeros elementos de xs. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     coge 2 [3,7,5,4] = [3,7]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge n [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;coge 0 xs = []&amp;quot;&lt;br /&gt;
| &amp;quot;coge (Suc n) (x#xs) = x # (coge n xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge 2 [3,7,5,4]&amp;quot; -- &amp;quot;= [3,7]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función&lt;br /&gt;
     elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (coge n xs) es la lista de los n primeros elementos de xs. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     elimina 2 [3,7,5,4] = [5,4]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;elimina 0 xs = xs&amp;quot;&lt;br /&gt;
| &amp;quot;elimina (Suc n) (x#xs) = elimina n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina 2 [3,7,5,4]&amp;quot; -- &amp;quot;= [5,4]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar que &lt;br /&gt;
     conc (coge n xs) (elimina n xs) = xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
by (induct rule: coge.induct) auto&lt;br /&gt;
&lt;br /&gt;
text {* coge.induct es el esquema de inducción asociado a la definición&lt;br /&gt;
  de la función coge. Puede verse como sigue: *}&lt;br /&gt;
&lt;br /&gt;
thm coge.induct&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
by (induct rule: elimina.induct) auto&lt;br /&gt;
&lt;br /&gt;
thm elimina.induct&lt;br /&gt;
&lt;br /&gt;
lemma conc_coge_elimina:&lt;br /&gt;
  &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
proof (induct rule: coge.induct) &lt;br /&gt;
  show &amp;quot;⋀n. conc (coge n []) (elimina n []) = []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;⋀v va. conc (coge 0 (v # va)) (elimina 0 (v # va)) = v # va&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs n &lt;br /&gt;
  assume hi: &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
  show &amp;quot;conc (coge (Suc n) (x # xs)) (elimina (Suc n) (x # xs)) = x # xs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;conc (coge (Suc n) (x # xs)) (elimina (Suc n) (x # xs)) = conc (coge (Suc n) (x # xs)) (elimina n xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = conc (x# (coge n xs)) (elimina n xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x#(conc (coge n xs) (elimina n xs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (x#xs)&amp;quot; using hi by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función&lt;br /&gt;
     esVacia :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot;&lt;br /&gt;
  tal que (esVacia xs) se verifica si xs es la lista vacía. Por ejemplo, &lt;br /&gt;
     esVacia []  = True&lt;br /&gt;
     esVacia [1] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun esVacia :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;esVacia (x#xs) = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;esVacia []&amp;quot;  -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;esVacia [1]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar que &lt;br /&gt;
     esVacia xs = esVacia (conc xs xs)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
lemma vacia_conc:&lt;br /&gt;
  &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;esVacia [] = esVacia (conc [] [])&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
    fix x xs&lt;br /&gt;
    assume hi: &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
    show &amp;quot;esVacia (x # xs) = esVacia (conc (x # xs) (x # xs))&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
      have &amp;quot;esVacia (conc (x # xs) (x # xs)) = esVacia (x# (conc xs (x#xs)))&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;... = esVacia (x # 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;
lemma vacia_conc&amp;#039;:&lt;br /&gt;
  &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
proof (cases xs)&lt;br /&gt;
  case Nil thus ?thesis by simp&lt;br /&gt;
next&lt;br /&gt;
  case Cons thus ?thesis by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma vacia_conc&amp;#039;&amp;#039;:&lt;br /&gt;
  &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
by (cases xs) simp_all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Definir la función&lt;br /&gt;
     inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (inversaAc xs) es a inversa de xs calculada usando&lt;br /&gt;
  acumuladores. Por ejemplo, &lt;br /&gt;
     inversaAc [3,2,5] = [5,2,3]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversaAcAux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux [] ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;inversaAcAux (x#xs) ys = inversaAcAux xs (x#ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc xs = inversaAcAux xs []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc [3,2,5]&amp;quot; -- &amp;quot;= [5,2,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar que &lt;br /&gt;
     inversaAcAux xs ys = (inversa xs)@ys&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma inversaAcAux_es_inversa:&lt;br /&gt;
  &amp;quot;inversaAcAux xs ys = (inversa xs)@ys&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: ys) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma inversaAcAux_es_inversa_b:&lt;br /&gt;
  &amp;quot;inversaAcAux xs ys = (inversa xs)@ys&amp;quot;&lt;br /&gt;
proof (induct xs arbitrary: ys) &lt;br /&gt;
  show &amp;quot;⋀ys. inversaAcAux [] ys = inversa [] @ ys&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs zs&lt;br /&gt;
  assume hi: &amp;quot;⋀ys. inversaAcAux xs ys = inversa xs @ ys&amp;quot;&lt;br /&gt;
  show &amp;quot;inversaAcAux (x#xs) zs = inversa (x#xs) @ zs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;inversaAcAux (x#xs) zs = inversaAcAux xs (x#zs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = inversa xs @ (x#zs)&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = inversa xs @ [x] @ zs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = inversa (x#xs) @ zs&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar que &lt;br /&gt;
     inversaAc xs = inversa xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
corollary &amp;quot;inversaAc xs = inversa xs&amp;quot;&lt;br /&gt;
by (simp add: inversaAcAux_es_inversa)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Definir la función&lt;br /&gt;
     sum :: &amp;quot;int list ⇒ int&amp;quot; &lt;br /&gt;
  tal que (sum xs) es la suma de los elementos de xs. Por ejemplo,&lt;br /&gt;
     sum [3,2,5] = 10&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sum :: &amp;quot;int list ⇒ int&amp;quot; where&lt;br /&gt;
  &amp;quot;sum []     = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sum (x#xs) = x + sum xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sum [3,2,5]&amp;quot; -- &amp;quot;= 10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Definir la función&lt;br /&gt;
     map :: (&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&lt;br /&gt;
  tal que (map f xs) es la lista obtenida aplicando la función f a los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     map (λx. 2*x) [3,2,5] = [6,4,10]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun map :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map f []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;map f (x#xs) = (f x) # map f xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;map (λx. 2*x) [3::int,2,5]&amp;quot; -- &amp;quot;= [6,4,10]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;map (λx. 6*x) [3::int,2,5]&amp;quot; -- &amp;quot;= [18,12,30]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar que &lt;br /&gt;
     sum (map (λx. 2*x) xs) = 2 * (sum xs)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;sum (map (λx. 2*x) xs) = 2 * (sum xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma sum_map:&lt;br /&gt;
  &amp;quot;sum (map (λx. 2*x) xs) = 2 * (sum xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;sum (map (λx. 2*x) []) = 2 * (sum [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume hi: &amp;quot;sum (map (λx. 2*x) xs) = 2 * (sum xs)&amp;quot;&lt;br /&gt;
  show &amp;quot;sum (map (λx. 2*x) (a#xs)) = 2 * (sum (a#xs))&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;sum (map (λx. 2*x) (a#xs)) = sum ((2*a)#(map (λx. 2*x) xs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 2*a + sum (map (λx. 2*x) xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 2*a + 2 * (sum xs)&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = 2*(a + sum xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 2 * (sum (a#xs))&amp;quot;by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar que &lt;br /&gt;
     longitud (map f xs) = longitud xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (map f xs) = longitud xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma long_map:&lt;br /&gt;
  &amp;quot;longitud (map f xs) = longitud xs&amp;quot;&lt;br /&gt;
proof (induct xs) &lt;br /&gt;
  show &amp;quot;longitud (map f []) = longitud []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;longitud (map f xs) = longitud xs&amp;quot;&lt;br /&gt;
  show &amp;quot;longitud (map f (x#xs)) = longitud (x#xs)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;longitud (map f (x#xs)) = longitud ((f x)#(map f xs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + longitud (map f xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + longitud xs&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = longitud (x#xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&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/LMF2013/index.php?title=Tema_15&amp;diff=525</id>
		<title>Tema 15</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_15&amp;diff=525"/>
		<updated>2013-05-22T08:12:34Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con &amp;#039;&amp;lt;source lang = Isar&amp;quot;&amp;gt; header {* Tema 15: Razonamiento sobre programas en Isabelle *}  theory T15 imports Main begin  text {*    En este tema se demuestra con Isabelle las propie...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = Isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 15: Razonamiento sobre programas en Isabelle *}&lt;br /&gt;
&lt;br /&gt;
theory T15&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En este tema se demuestra con Isabelle las propiedades de los&lt;br /&gt;
  programas funcionales como se expone en el tema 8 del curso&lt;br /&gt;
  &amp;quot;Informática&amp;quot; que puede leerse en&lt;br /&gt;
  http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-8t.pdf&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Razonamiento ecuacional *}&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. Definir, por recursión, la función&lt;br /&gt;
     longitud :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  tal que (longitud xs) es la longitud de la listas xs. Por ejemplo,&lt;br /&gt;
     longitud [4,2,5] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
fun longitud :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;longitud []     = 0&amp;quot;&lt;br /&gt;
| &amp;quot;longitud (x#xs) = 1 + longitud xs&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
value &amp;quot;longitud [4,2,5]&amp;quot; -- &amp;quot;= 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar que &lt;br /&gt;
     longitud [4,2,5] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud [4,2,5] = 3&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     fun intercambia :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (intercambia p) es el par obtenido intercambiando las&lt;br /&gt;
  componentes del par p. Por ejemplo,&lt;br /&gt;
     &amp;quot;intercambia (2,3) = (3,2)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun intercambia :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;intercambia (x,y) = (y,x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;intercambia (2,3)&amp;quot; -- &amp;quot;= (3,2)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar que &lt;br /&gt;
     intercambia (intercambia (x,y)) = (x,y)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;intercambia (intercambia (x,y)) = (x,y)&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir, por recursión, la función&lt;br /&gt;
     inversa :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (inversa xs) es la lista obtenida invirtiendo el orden de los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     inversa [3,2,5] = [5,2,3]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversa :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;inversa (x#xs) = inversa xs @ [x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa [3,2,5]&amp;quot; -- &amp;quot;= [5,2,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que &lt;br /&gt;
     inversa [x] = [x]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;inversa [x] = [x]&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     repite :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  tal que . Por ejemplo,&lt;br /&gt;
     repite 3 5 = [5,5,5]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun repite :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite 0 x = []&amp;quot;&lt;br /&gt;
| &amp;quot;repite (Suc n) x = x # (repite n x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;repite 3 5&amp;quot; -- &amp;quot;= [5,5,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que &lt;br /&gt;
     longitud (repite n x) = n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
apply (induct_tac n) &lt;br /&gt;
apply (auto)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
lemma longitud_repite:&lt;br /&gt;
  &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;longitud (repite 0 x) = 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume hi: &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
  show &amp;quot;longitud (repite (Suc n) x) = Suc n&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;longitud (repite (Suc n) x) = longitud (x # (repite n x))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 +  longitud (repite n x)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + n&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = Suc n&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función&lt;br /&gt;
     fun conc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que . Por ejemplo,&lt;br /&gt;
     conc [2,3] [4,3,5] = [2,3,4,3,5]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun conc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc []     ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;conc (x#xs) ys = x # (conc xs ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc [2,3] [4,3,5]&amp;quot; -- &amp;quot;= [2,3,4,3,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que &lt;br /&gt;
     conc xs (conc ys zs) = (conc xs ys) zs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc xs (conc ys zs) = conc (conc xs ys) zs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
lemma conc_asociativa:&lt;br /&gt;
  &amp;quot;conc xs (conc ys zs) = conc (conc xs ys) zs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;conc [] (conc ys zs) = conc (conc [] ys) zs&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;conc xs (conc ys zs) = conc (conc xs ys) zs&amp;quot;&lt;br /&gt;
  show &amp;quot;conc (x # xs) (conc ys zs) = conc (conc (x # xs) ys) zs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;conc (x # xs) (conc ys zs) = x # (conc xs (conc ys zs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x # (conc (conc xs ys) zs)&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = conc (x#(conc xs ys)) zs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = conc (conc (x # xs) ys) zs&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Refutar que &lt;br /&gt;
     conc xs ys = conc ys xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc xs ys = conc ys xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* Encuentra el contraejemplo, &lt;br /&gt;
  xs = [a\&amp;lt;^isub&amp;gt;2]&lt;br /&gt;
  ys = [a\&amp;lt;^isub&amp;gt;1] *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar que &lt;br /&gt;
     conc xs [] = xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc xs [] = xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar que &lt;br /&gt;
     longitud (conc xs ys) = longitud xs + longitud ys&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (conc xs ys) = longitud xs + longitud ys&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
lemma long_conc:&lt;br /&gt;
  &amp;quot;longitud (conc xs ys) = longitud xs + longitud ys&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;longitud (conc [] ys) = longitud [] + longitud ys&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;longitud (conc xs ys) = longitud xs + longitud ys&amp;quot;&lt;br /&gt;
  show &amp;quot;longitud (conc (x # xs) ys) = longitud (x # xs) + longitud ys&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;longitud (conc (x # xs) ys) = longitud (x # (conc xs ys))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + longitud (conc xs ys)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + (longitud xs + longitud ys)&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = (1+ longitud xs) + longitud ys&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = longitud (x # xs) + longitud ys&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Definir la función&lt;br /&gt;
     coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (coge n xs) es la lista de los n primeros elementos de xs. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     coge 2 [3,7,5,4] = [3,7]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge n [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;coge 0 xs = []&amp;quot;&lt;br /&gt;
| &amp;quot;coge (Suc n) (x#xs) = x # (coge n xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge 2 [3,7,5,4]&amp;quot; -- &amp;quot;= [3,7]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función&lt;br /&gt;
     elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (coge n xs) es la lista de los n primeros elementos de xs. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     elimina 2 [3,7,5,4] = [5,4]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;elimina 0 xs = xs&amp;quot;&lt;br /&gt;
| &amp;quot;elimina (Suc n) (x#xs) = elimina n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina 2 [3,7,5,4]&amp;quot; -- &amp;quot;= [5,4]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar que &lt;br /&gt;
     conc (coge n xs) (elimina n xs) = xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
by (induct rule: coge.induct) auto&lt;br /&gt;
&lt;br /&gt;
text {* coge.induct es el esquema de inducción asociado a la definición&lt;br /&gt;
  de la función coge. Puede verse como sigue: *}&lt;br /&gt;
&lt;br /&gt;
thm coge.induct&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
by (induct rule: elimina.induct) auto&lt;br /&gt;
&lt;br /&gt;
thm elimina.induct&lt;br /&gt;
&lt;br /&gt;
lemma conc_coge_elimina:&lt;br /&gt;
  &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
proof (induct rule: coge.induct) &lt;br /&gt;
  show &amp;quot;⋀n. conc (coge n []) (elimina n []) = []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;⋀v va. conc (coge 0 (v # va)) (elimina 0 (v # va)) = v # va&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs n &lt;br /&gt;
  assume hi: &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
  show &amp;quot;conc (coge (Suc n) (x # xs)) (elimina (Suc n) (x # xs)) = x # xs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;conc (coge (Suc n) (x # xs)) (elimina (Suc n) (x # xs)) = conc (coge (Suc n) (x # xs)) (elimina n xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = conc (x# (coge n xs)) (elimina n xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = x#(conc (coge n xs) (elimina n xs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = (x#xs)&amp;quot; using hi by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Definir la función&lt;br /&gt;
     esVacia :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot;&lt;br /&gt;
  tal que (esVacia xs) se verifica si xs es la lista vacía. Por ejemplo, &lt;br /&gt;
     esVacia []  = True&lt;br /&gt;
     esVacia [1] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun esVacia :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;esVacia (x#xs) = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;esVacia []&amp;quot;  -- &amp;quot;= True&amp;quot;&lt;br /&gt;
value &amp;quot;esVacia [1]&amp;quot; -- &amp;quot;= False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar que &lt;br /&gt;
     esVacia xs = esVacia (conc xs xs)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
lemma vacia_conc:&lt;br /&gt;
  &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;esVacia [] = esVacia (conc [] [])&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
    fix x xs&lt;br /&gt;
    assume hi: &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
    show &amp;quot;esVacia (x # xs) = esVacia (conc (x # xs) (x # xs))&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
      have &amp;quot;esVacia (conc (x # xs) (x # xs)) = esVacia (x# (conc xs (x#xs)))&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;... = esVacia (x # 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;
lemma vacia_conc&amp;#039;:&lt;br /&gt;
  &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
proof (cases xs)&lt;br /&gt;
  case Nil thus ?thesis by simp&lt;br /&gt;
next&lt;br /&gt;
  case Cons thus ?thesis by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma vacia_conc&amp;#039;&amp;#039;:&lt;br /&gt;
  &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
by (cases xs) simp_all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Definir la función&lt;br /&gt;
     inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (inversaAc xs) es a inversa de xs calculada usando&lt;br /&gt;
  acumuladores. Por ejemplo, &lt;br /&gt;
     inversaAc [3,2,5] = [5,2,3]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversaAcAux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux [] ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;inversaAcAux (x#xs) ys = inversaAcAux xs (x#ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc xs = inversaAcAux xs []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc [3,2,5]&amp;quot; -- &amp;quot;= [5,2,3]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar que &lt;br /&gt;
     inversaAcAux xs ys = (inversa xs)@ys&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma inversaAcAux_es_inversa:&lt;br /&gt;
  &amp;quot;inversaAcAux xs ys = (inversa xs)@ys&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: ys) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma inversaAcAux_es_inversa_b:&lt;br /&gt;
  &amp;quot;inversaAcAux xs ys = (inversa xs)@ys&amp;quot;&lt;br /&gt;
proof (induct xs arbitrary: ys) &lt;br /&gt;
  show &amp;quot;⋀ys. inversaAcAux [] ys = inversa [] @ ys&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs zs&lt;br /&gt;
  assume hi: &amp;quot;⋀ys. inversaAcAux xs ys = inversa xs @ ys&amp;quot;&lt;br /&gt;
  show &amp;quot;inversaAcAux (x#xs) zs = inversa (x#xs) @ zs&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;inversaAcAux (x#xs) zs = inversaAcAux xs (x#zs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = inversa xs @ (x#zs)&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = inversa xs @ [x] @ zs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = inversa (x#xs) @ zs&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar que &lt;br /&gt;
     inversaAc xs = inversa xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
corollary &amp;quot;inversaAc xs = inversa xs&amp;quot;&lt;br /&gt;
by (simp add: inversaAcAux_es_inversa)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Definir la función&lt;br /&gt;
     sum :: &amp;quot;int list ⇒ int&amp;quot; &lt;br /&gt;
  tal que (sum xs) es la suma de los elementos de xs. Por ejemplo,&lt;br /&gt;
     sum [3,2,5] = 10&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sum :: &amp;quot;int list ⇒ int&amp;quot; where&lt;br /&gt;
  &amp;quot;sum []     = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sum (x#xs) = x + sum xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sum [3,2,5]&amp;quot; -- &amp;quot;= 10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Definir la función&lt;br /&gt;
     map :: (&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&lt;br /&gt;
  tal que (map f xs) es la lista obtenida aplicando la función f a los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     map (λx. 2*x) [3,2,5] = [6,4,10]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun map :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map f []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;map f (x#xs) = (f x) # map f xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;map (λx. 2*x) [3::int,2,5]&amp;quot; -- &amp;quot;= [6,4,10]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;map (λx. 6*x) [3::int,2,5]&amp;quot; -- &amp;quot;= [18,12,30]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar que &lt;br /&gt;
     sum (map (λx. 2*x) xs) = 2 * (sum xs)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;sum (map (λx. 2*x) xs) = 2 * (sum xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma sum_map:&lt;br /&gt;
  &amp;quot;sum (map (λx. 2*x) xs) = 2 * (sum xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;sum (map (λx. 2*x) []) = 2 * (sum [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume hi: &amp;quot;sum (map (λx. 2*x) xs) = 2 * (sum xs)&amp;quot;&lt;br /&gt;
  show &amp;quot;sum (map (λx. 2*x) (a#xs)) = 2 * (sum (a#xs))&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;sum (map (λx. 2*x) (a#xs)) = sum ((2*a)#(map (λx. 2*x) xs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 2*a + sum (map (λx. 2*x) xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 2*a + 2 * (sum xs)&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = 2*(a + sum xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 2 * (sum (a#xs))&amp;quot;by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar que &lt;br /&gt;
     longitud (map f xs) = longitud xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud (map f xs) = longitud xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lemma long_map:&lt;br /&gt;
  &amp;quot;longitud (map f xs) = longitud xs&amp;quot;&lt;br /&gt;
proof (induct xs) &lt;br /&gt;
  show &amp;quot;longitud (map f []) = longitud []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume hi: &amp;quot;longitud (map f xs) = longitud xs&amp;quot;&lt;br /&gt;
  show &amp;quot;longitud (map f (x#xs)) = longitud (x#xs)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;longitud (map f (x#xs)) = longitud ((f x)#(map f xs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + longitud (map f xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = 1 + longitud xs&amp;quot; using hi by simp&lt;br /&gt;
    also have &amp;quot;... = longitud (x#xs)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&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/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=524</id>
		<title>Lógica matemática y fundamentos</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=524"/>
		<updated>2013-05-22T08:11:50Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios y sus soluciones colaborativas.&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Iniciación a la programación con Haskell ([[Media:Rel_1.hs |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional en Haskell. ([[Media:Rel_2.hs |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 proposicional con Isabelle/HOL. ([[Rel_3 |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;: Argumentación proposicional con Isabelle/HOL. ([[Rel_4 |Enunciado]] y [[Relación 4 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de conectivas. ([[Rel_5 |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;: Formalización de argumentos en lógica de primer orden. ([[Rel_6 |Enunciado]] y [[Relación 6 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer con Isabelle/HOL. ([[Rel_7 |Enunciado]] y [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Tableros semánticos proposicionales en Haskell. ([[Media:Rel_8.hs |Enunciado]] y [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Formas normales en lógica proposicional en Haskell ([[Media:FormasNormales.hs |Enunciado]] y [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Cláusulas proposicionales en Haskell. ([[Media:Clausulas.hs |Enunciado]] y [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Resolución proposicional en Haskell. ([[Media:ResolucionProposicional.hs |Enunciado]] y [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la Lógica Proposicional en Haskell. ([[Media:AplicacionesLP.hs |Enunciado]] y [[AplicacionesLP |Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
=== Teorías Isabelle/HOL de los temas de deducción natural ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 2&amp;#039;&amp;#039;&amp;#039;: [[Tema 2 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 8&amp;#039;&amp;#039;&amp;#039;: [[Tema 8 | Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 14&amp;#039;&amp;#039;&amp;#039;: [[Tema 14 | Programación funcional en Isabelle/HOL]] ([[Media:T14.thy |Teoría]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 15&amp;#039;&amp;#039;&amp;#039;: [[Tema 15 | Razonamiento sobre programas con Isabelle/HOL]] ([[Media:T15.thy |Teoría]]).&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios evaluables ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 1 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 2 |Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nota al ejercicio 2&amp;#039;&amp;#039;&amp;#039;: los lemas auxiliares que se usen en una demostración por deducción natural han de ser probados de forma no automática. Se amplía el plazo hasta el viernes 3 de mayo para que se envíe el ejercicio 2 teniendo en cuenta esta aclaración.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 3 |Argumentación, deducción natural en lógica de primer orden con Isabelle/HOL y tableros semánticos]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 4 | Algoritmos de lógica proposicional en Haskell]].&lt;br /&gt;
&lt;br /&gt;
=== Problemas semanales ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 1&amp;#039;&amp;#039;&amp;#039;: [[Problema 1 | Inducción sobre fórmulas]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 2&amp;#039;&amp;#039;&amp;#039;: [[Problema 2 | Subconjuntos inconsistentes]].&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=523</id>
		<title>Lógica matemática y fundamentos</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=523"/>
		<updated>2013-05-22T08:11:28Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios y sus soluciones colaborativas.&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Iniciación a la programación con Haskell ([[Media:Rel_1.hs |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional en Haskell. ([[Media:Rel_2.hs |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 proposicional con Isabelle/HOL. ([[Rel_3 |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;: Argumentación proposicional con Isabelle/HOL. ([[Rel_4 |Enunciado]] y [[Relación 4 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de conectivas. ([[Rel_5 |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;: Formalización de argumentos en lógica de primer orden. ([[Rel_6 |Enunciado]] y [[Relación 6 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer con Isabelle/HOL. ([[Rel_7 |Enunciado]] y [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Tableros semánticos proposicionales en Haskell. ([[Media:Rel_8.hs |Enunciado]] y [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Formas normales en lógica proposicional en Haskell ([[Media:FormasNormales.hs |Enunciado]] y [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Cláusulas proposicionales en Haskell. ([[Media:Clausulas.hs |Enunciado]] y [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Resolución proposicional en Haskell. ([[Media:ResolucionProposicional.hs |Enunciado]] y [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la Lógica Proposicional en Haskell. ([[Media:AplicacionesLP.hs |Enunciado]] y [[AplicacionesLP |Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
=== Teorías Isabelle/HOL de los temas de deducción natural ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 2&amp;#039;&amp;#039;&amp;#039;: [[Tema 2 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 8&amp;#039;&amp;#039;&amp;#039;: [[Tema 8 | Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 14&amp;#039;&amp;#039;&amp;#039;: [[Tema 14 | Programación funcional en Isabelle/HOL]] ([[Media:T14.thy |Teoría]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 15&amp;#039;&amp;#039;&amp;#039;: [[Tema 15 | Razonamiento sobre programas con Isabelle/HOL]]([[Media:T15.thy |Teoría]]).&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios evaluables ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 1 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 2 |Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nota al ejercicio 2&amp;#039;&amp;#039;&amp;#039;: los lemas auxiliares que se usen en una demostración por deducción natural han de ser probados de forma no automática. Se amplía el plazo hasta el viernes 3 de mayo para que se envíe el ejercicio 2 teniendo en cuenta esta aclaración.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 3 |Argumentación, deducción natural en lógica de primer orden con Isabelle/HOL y tableros semánticos]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 4 | Algoritmos de lógica proposicional en Haskell]].&lt;br /&gt;
&lt;br /&gt;
=== Problemas semanales ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 1&amp;#039;&amp;#039;&amp;#039;: [[Problema 1 | Inducción sobre fórmulas]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 2&amp;#039;&amp;#039;&amp;#039;: [[Problema 2 | Subconjuntos inconsistentes]].&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_14&amp;diff=522</id>
		<title>Tema 14</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Tema_14&amp;diff=522"/>
		<updated>2013-05-22T08:10:50Z</updated>

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

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

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con &amp;#039;&amp;lt;source lang = &amp;quot;isar&amp;quot;&amp;gt; header {* Tema 14: Programación funcional en Isabelle *}   theory T14 imports Main  begin   section {* Introducción *}   text {*    En este tema se pres...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 14: Programación funcional en Isabelle *}&lt;br /&gt;
 &lt;br /&gt;
theory T14&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
 &lt;br /&gt;
section {* Introducción *}&lt;br /&gt;
 &lt;br /&gt;
text {* &lt;br /&gt;
  En este tema se presenta el lenguaje funcional que está&lt;br /&gt;
  incluido en Isabelle. El lenguaje funcional es muy parecido a&lt;br /&gt;
  Haskell. *}&lt;br /&gt;
 &lt;br /&gt;
section {* Números naturales, enteros y booleanos *}&lt;br /&gt;
 &lt;br /&gt;
text {* En Isabelle están definidos los número naturales con la sintaxis&lt;br /&gt;
  de Peano usando dos constructores: 0 (cero) y Suc (el sucesor).&lt;br /&gt;
 &lt;br /&gt;
  Los números como el 1 son abreviaturas de los correspondientes en la&lt;br /&gt;
  notación de Peano, en este caso &amp;quot;Suc 0&amp;quot;. &lt;br /&gt;
 &lt;br /&gt;
  El tipo de los números naturales es nat. &lt;br /&gt;
 &lt;br /&gt;
  Por ejemplo, el siguiente del 0 es el 1. *}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;Suc 0&amp;quot; -- &amp;quot;= 1&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
text {* En Isabelle está definida la suma de los números naturales:&lt;br /&gt;
  (x + y) es la suma de x e y.&lt;br /&gt;
 &lt;br /&gt;
  Por ejemplo, la suma de los números naturales 1 y 2 es el número&lt;br /&gt;
  natural 3. *}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;(1::nat) + 2&amp;quot; -- &amp;quot;= 3&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
text {* La notación del par de dos puntos se usa para asignar un tipo a&lt;br /&gt;
  un término (por ejemplo, (1::nat) significa que se considera que 1 es&lt;br /&gt;
  un número natural).   &lt;br /&gt;
 &lt;br /&gt;
  En Isabelle está definida el producto de los números naturales:&lt;br /&gt;
  (x * y) es el producto de x e y.&lt;br /&gt;
 &lt;br /&gt;
  Por ejemplo, el producto de los números naturales 2 y 3 es el número&lt;br /&gt;
  natural 6. *}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;(2::nat) * 3&amp;quot; -- &amp;quot;= 6&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
text {* En Isabelle está definida la división de números naturales: &lt;br /&gt;
  (n div m) es el cociente entero de x entre y.&lt;br /&gt;
 &lt;br /&gt;
  Por ejemplo, la división natural de 7 entre 3 es 2. *}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;(7::nat) div 3&amp;quot; -- &amp;quot;= 2&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
text {* En Isabelle está definida el resto de división de números&lt;br /&gt;
  naturales: (n mod m) es el resto de dividir n entre m.&lt;br /&gt;
 &lt;br /&gt;
  Por ejemplo, el resto de dividir 7 entre 3 es 1. *}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;(7::nat) mod 3&amp;quot; -- &amp;quot;= 1&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
text {* En Isabelle también están definidos los números enteros. El tipo&lt;br /&gt;
  de los enteros se representa por int.&lt;br /&gt;
 &lt;br /&gt;
  Por ejemplo, la suma de 1 y -2 es el número entero -1. *}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;(1::int) + -2&amp;quot; -- &amp;quot;= -1&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
text {* Los numerales están sobrecargados. Por ejemplo, el 1 puede ser&lt;br /&gt;
  un natural o un entero, dependiendo del contexto. &lt;br /&gt;
 &lt;br /&gt;
  Isabelle resuelve ambigüedades mediante inferencia de tipos.&lt;br /&gt;
 &lt;br /&gt;
  A veces, es necesario usar declaraciones de tipo para resolver la&lt;br /&gt;
  ambigüedad.&lt;br /&gt;
 &lt;br /&gt;
  En Isabelle están definidos los valores booleanos (True y False), las&lt;br /&gt;
  conectivas (¬, ∧, ∨, ⟶ y ↔) y los cuantificadores (∀ y ∃). &lt;br /&gt;
 &lt;br /&gt;
  El tipo de los booleanos es bool. *}&lt;br /&gt;
 &lt;br /&gt;
text {* La conjunción de dos fórmulas verdaderas es verdadera. *}&lt;br /&gt;
value &amp;quot;True \&amp;lt;and&amp;gt; True&amp;quot; -- &amp;quot;= True&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
text {* La conjunción de un fórmula verdadera y una falsa es falsa. *} &lt;br /&gt;
value &amp;quot;True \&amp;lt;and&amp;gt; False&amp;quot; -- &amp;quot;= False&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
text {* La disyunción de una fórmula verdadera y una falsa es&lt;br /&gt;
  verdadera. *} &lt;br /&gt;
value &amp;quot;True \&amp;lt;or&amp;gt; False&amp;quot; -- &amp;quot;= True&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
text {* La disyunción de dos fórmulas falsas es falsa. *}&lt;br /&gt;
value &amp;quot;False \&amp;lt;or&amp;gt; False&amp;quot; -- &amp;quot;= False&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
text {* La negación de una fórmula verdadera es falsa. *}&lt;br /&gt;
value &amp;quot;\&amp;lt;not&amp;gt;True&amp;quot; -- &amp;quot;= False&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
text {* Una fórmula falsa implica una fórmula verdadera. *}&lt;br /&gt;
value &amp;quot;False \&amp;lt;longrightarrow&amp;gt; True&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* Un lema introduce una proposición seguida de una demostración. &lt;br /&gt;
 &lt;br /&gt;
  Isabelle dispone de varios procedimientos automáticos para generar&lt;br /&gt;
  demostraciones, uno de los cuales es el de simplificación (llamado&lt;br /&gt;
  simp). &lt;br /&gt;
 &lt;br /&gt;
  El procedimiento simp aplica un conjunto de reglas de reescritura, que&lt;br /&gt;
  inicialmente contiene un gran número de reglas relativas a los objetos&lt;br /&gt;
  definidos. *}&lt;br /&gt;
 &lt;br /&gt;
text {* Ej. de simp: Todo elemento es igual a sí mismo. *}&lt;br /&gt;
lemma &amp;quot;\&amp;lt;forall&amp;gt;x. x = x&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
 &lt;br /&gt;
text {* Ej. de simp: Existe un elemento igual a 1. *}&lt;br /&gt;
lemma &amp;quot;\&amp;lt;exists&amp;gt;x. x = 1&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
 &lt;br /&gt;
section {* Definiciones no recursivas *}&lt;br /&gt;
 &lt;br /&gt;
text {* La disyunción exclusiva de A y B se verifica si una es verdadera&lt;br /&gt;
  y la otra no lo es. *}&lt;br /&gt;
 &lt;br /&gt;
definition xor :: &amp;quot;bool \&amp;lt;Rightarrow&amp;gt; bool \&amp;lt;Rightarrow&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;xor A B \&amp;lt;equiv&amp;gt; (A \&amp;lt;and&amp;gt; \&amp;lt;not&amp;gt;B) \&amp;lt;or&amp;gt; (\&amp;lt;not&amp;gt;A \&amp;lt;and&amp;gt; B)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* Prop.: La disyunción exclusiva de dos fórmulas verdaderas es&lt;br /&gt;
  falsa. &lt;br /&gt;
 &lt;br /&gt;
  Dem.: Por simplificación, usando la definición de la disyunción&lt;br /&gt;
  exclusiva. &lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
lemma &amp;quot;xor True True = False&amp;quot;&lt;br /&gt;
by (simp add: xor_def)&lt;br /&gt;
 &lt;br /&gt;
text {* Se añade la definición de la disyunción exclusiva al conjunto de&lt;br /&gt;
  reglas de simplificación automáticas. *}&lt;br /&gt;
 &lt;br /&gt;
declare xor_def[simp]&lt;br /&gt;
 &lt;br /&gt;
lemma &amp;quot;xor True False = True&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
 &lt;br /&gt;
section {* Definiciones locales *}&lt;br /&gt;
 &lt;br /&gt;
text {* Se puede asignar valores a variables locales mediante &amp;#039;let&amp;#039; y&lt;br /&gt;
  usarlo en las expresiones dentro de &amp;#039;in&amp;#039;. &lt;br /&gt;
 &lt;br /&gt;
  Por ejemplo, si x es el número natural 3, entonces &amp;quot;x*x=9&amp;quot;. *}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;let x = 3::nat in x * x&amp;quot; -- &amp;quot;= 9&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
section {* Pares *}&lt;br /&gt;
 &lt;br /&gt;
text {* Un par se representa escribiendo los elementos entre paréntesis&lt;br /&gt;
  y separados por coma.&lt;br /&gt;
 &lt;br /&gt;
  El tipo de los pares es el producto de los tipos.&lt;br /&gt;
 &lt;br /&gt;
  La función fst devuelve el primer elemento de un par y la snd el&lt;br /&gt;
  segundo. &lt;br /&gt;
 &lt;br /&gt;
  Por ejemplo, si p es el par de números naturales (2,3), entonces la&lt;br /&gt;
  suma del primer elemento de p y 1 es igual al segundo elemento de&lt;br /&gt;
  p. *} &lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;let p = (2,3)::nat \&amp;lt;times&amp;gt; nat in fst p + 1 = snd p&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
section {* Listas *}&lt;br /&gt;
 &lt;br /&gt;
text {* Una lista se representa escribiendo los elementos entre&lt;br /&gt;
  corchetes y separados por comas.&lt;br /&gt;
 &lt;br /&gt;
  La lista vacía se representa por [].&lt;br /&gt;
 &lt;br /&gt;
  Todos los elementos de una lista tienen que ser del mismo tipo.&lt;br /&gt;
 &lt;br /&gt;
  El tipo de las listas de elementos del tipo a es (a list).&lt;br /&gt;
 &lt;br /&gt;
  El término (x#xs) representa la lista obtenida añadiendo el elemento x&lt;br /&gt;
  al principio de la lista xs. &lt;br /&gt;
 &lt;br /&gt;
  Por ejemplo, la lista obtenida añadiendo sucesivamente a la lista&lt;br /&gt;
  vacía los elementos c, b y a es [a,b,c]. *}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;a#(b#(c#[]))&amp;quot; -- &amp;quot;= [a,b,c]&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
text {* Funciones de descomposión de listas:&lt;br /&gt;
  · (hd xs) es el primer elemento de la lista xs.&lt;br /&gt;
  · (tl xs) es el resto de la lista xs.&lt;br /&gt;
 &lt;br /&gt;
  Por ejemplo, si xs es la lista [a,b,c], entonces el primero de xs es a&lt;br /&gt;
  y el resto de xs es [b,c]. *} &lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;let xs = [a,b,c] in hd xs = a \&amp;lt;and&amp;gt; tl xs = [b,c]&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* (length xs) es la longitud de la lista xs. Por ejemplo, la&lt;br /&gt;
  longitud de la lista [1,2,3] es 3. *}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;length [1,2,3]&amp;quot; -- &amp;quot;= 3&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
text {* En la sesión 47 de &amp;quot;Isabelle/HOL — Higher-Order Logic&amp;quot;&lt;br /&gt;
  http://goo.gl/sFsFF se encuentran más definiciones y propiedades de&lt;br /&gt;
  las listas. *}&lt;br /&gt;
 &lt;br /&gt;
section {* Registros *}&lt;br /&gt;
 &lt;br /&gt;
text {* Un registro es una colección de campos y valores. &lt;br /&gt;
 &lt;br /&gt;
  Por ejemplo, los puntos del plano se pueden representar mediante&lt;br /&gt;
  registros con dos campos, las coordenadas, con valores enteros. *}&lt;br /&gt;
 &lt;br /&gt;
record punto = &lt;br /&gt;
  coordenada_x :: int&lt;br /&gt;
  coordenada_y :: int&lt;br /&gt;
 &lt;br /&gt;
text {* Ejemplo, el punto pt tiene de coordenadas 3 y 7. *}&lt;br /&gt;
 &lt;br /&gt;
definition pt :: punto where&lt;br /&gt;
  &amp;quot;pt \&amp;lt;equiv&amp;gt; \&amp;lt;lparr&amp;gt;coordenada_x = 3, coordenada_y = 7\&amp;lt;rparr&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* Ejemplo, la coordenada x del punto pt es 3. *}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;coordenada_x pt&amp;quot; -- &amp;quot;= 3&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
text {* Ejemplo, sea pt2 el punto obtenido a partir del punto pt&lt;br /&gt;
  cambiando el valor de su coordenada x por 4. Entonces la coordenada x&lt;br /&gt;
  del punto pt2 es 4. *}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;let pt2 = pt\&amp;lt;lparr&amp;gt;coordenada_x:=4\&amp;lt;rparr&amp;gt; in coordenada_x (pt2)&amp;quot; -- &amp;quot;= 4&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
section {* Funciones anónimas *}&lt;br /&gt;
 &lt;br /&gt;
text {* En Isabelle pueden definirse funciones anónimas.  &lt;br /&gt;
 &lt;br /&gt;
  Por ejemplo, el valor de la función que a un número le asigna su doble&lt;br /&gt;
  aplicada a 1 es 2. *}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;(\&amp;lt;lambda&amp;gt;x. x + x) 1::nat&amp;quot; -- &amp;quot;= 2&amp;quot; &lt;br /&gt;
 &lt;br /&gt;
section {* Condicionales *}&lt;br /&gt;
 &lt;br /&gt;
text {* El valor absoluto del entero x es x, si &amp;quot;x ≥ 0&amp;quot; y es -x en caso &lt;br /&gt;
  contrario. *}&lt;br /&gt;
 &lt;br /&gt;
definition absoluto :: &amp;quot;int \&amp;lt;Rightarrow&amp;gt; int&amp;quot; where&lt;br /&gt;
  &amp;quot;absoluto x \&amp;lt;equiv&amp;gt; (if x \&amp;lt;ge&amp;gt; 0 then x else -x)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* Ejemplo, el valor absoluto de -3 es 3. *}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;absoluto(-3)&amp;quot; -- &amp;quot;= 3&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* Def.: Un número natural n es un sucesor si es de la forma &lt;br /&gt;
  (Suc m). *}&lt;br /&gt;
 &lt;br /&gt;
definition es_sucesor :: &amp;quot;nat \&amp;lt;Rightarrow&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_sucesor n \&amp;lt;equiv&amp;gt; (case n of &lt;br /&gt;
    0     \&amp;lt;Rightarrow&amp;gt; False &lt;br /&gt;
  | Suc m \&amp;lt;Rightarrow&amp;gt; True)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* Ejemplo, el número 3 es sucesor. *}&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;es_sucesor 3&amp;quot; -- &amp;quot;= True&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
section {* Tipos de datos y definiciones recursivas *}&lt;br /&gt;
 &lt;br /&gt;
text {* Una lista de elementos de tipo a es la lista Vacia o se obtiene&lt;br /&gt;
  añadiendo, con Cons, un elemento de tipo a a una lista de elementos de&lt;br /&gt;
  tipo a. *} &lt;br /&gt;
 &lt;br /&gt;
datatype &amp;#039;a Lista = Vacia | Cons &amp;#039;a &amp;quot;&amp;#039;a Lista&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* (conc xs ys) es la concatenación de las lista xs e ys. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     conc (Cons a (Cons b Vacia)) (Cons c Vacia)&lt;br /&gt;
     = Cons a (Cons b (Cons c Vacia))&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
fun conc :: &amp;quot;&amp;#039;a Lista \&amp;lt;Rightarrow&amp;gt; &amp;#039;a Lista \&amp;lt;Rightarrow&amp;gt; &amp;#039;a Lista&amp;quot; where&lt;br /&gt;
  &amp;quot;conc Vacia ys       = ys&amp;quot;&lt;br /&gt;
| &amp;quot;conc (Cons x xs) ys = Cons x (conc xs ys)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;conc (Cons a (Cons b Vacia)) (Cons c Vacia)&amp;quot;&lt;br /&gt;
-- &amp;quot;= Cons a (Cons b (Cons c Vacia))&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* (suma n) es la suma de los primeros n números naturales. Por&lt;br /&gt;
  ejemplo,&lt;br /&gt;
     suma 3 = 6&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
fun suma :: &amp;quot;nat \&amp;lt;Rightarrow&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma 0       = 0&amp;quot;&lt;br /&gt;
| &amp;quot;suma (Suc m) = (Suc m) + suma m&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;suma 3&amp;quot; -- &amp;quot;= 6&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
text {* (sumaImpares n) es la suma de los n primeros números&lt;br /&gt;
  impares. Por ejemplo,&lt;br /&gt;
     sumaImpares 3 = 9&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
fun sumaImpares :: &amp;quot;nat \&amp;lt;Rightarrow&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares 0       = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sumaImpares (Suc n) = (2 * (Suc n) - 1) + sumaImpares n&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;sumaImpares 3&amp;quot; -- &amp;quot;= 9&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
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/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=519</id>
		<title>Lógica matemática y fundamentos</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=519"/>
		<updated>2013-05-22T08:06:24Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios y sus soluciones colaborativas.&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Iniciación a la programación con Haskell ([[Media:Rel_1.hs |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional en Haskell. ([[Media:Rel_2.hs |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 proposicional con Isabelle/HOL. ([[Rel_3 |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;: Argumentación proposicional con Isabelle/HOL. ([[Rel_4 |Enunciado]] y [[Relación 4 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de conectivas. ([[Rel_5 |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;: Formalización de argumentos en lógica de primer orden. ([[Rel_6 |Enunciado]] y [[Relación 6 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer con Isabelle/HOL. ([[Rel_7 |Enunciado]] y [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Tableros semánticos proposicionales en Haskell. ([[Media:Rel_8.hs |Enunciado]] y [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Formas normales en lógica proposicional en Haskell ([[Media:FormasNormales.hs |Enunciado]] y [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Cláusulas proposicionales en Haskell. ([[Media:Clausulas.hs |Enunciado]] y [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Resolución proposicional en Haskell. ([[Media:ResolucionProposicional.hs |Enunciado]] y [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la Lógica Proposicional en Haskell. ([[Media:AplicacionesLP.hs |Enunciado]] y [[AplicacionesLP |Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
=== Teorías Isabelle/HOL de los temas de deducción natural ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 2&amp;#039;&amp;#039;&amp;#039;: [[Tema 2 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 8&amp;#039;&amp;#039;&amp;#039;: [[Tema 8 | Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 14&amp;#039;&amp;#039;&amp;#039;: [[Tema 14 | Programación funcional en Isabelle/HOL]] ([[Media:T14.thy |Teoría]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 15&amp;#039;&amp;#039;&amp;#039;: [[Tema 15 | Razonamiento sobre programas con Isabelle/HOL]].&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios evaluables ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 1 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 2 |Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nota al ejercicio 2&amp;#039;&amp;#039;&amp;#039;: los lemas auxiliares que se usen en una demostración por deducción natural han de ser probados de forma no automática. Se amplía el plazo hasta el viernes 3 de mayo para que se envíe el ejercicio 2 teniendo en cuenta esta aclaración.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 3 |Argumentación, deducción natural en lógica de primer orden con Isabelle/HOL y tableros semánticos]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 4 | Algoritmos de lógica proposicional en Haskell]].&lt;br /&gt;
&lt;br /&gt;
=== Problemas semanales ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 1&amp;#039;&amp;#039;&amp;#039;: [[Problema 1 | Inducción sobre fórmulas]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 2&amp;#039;&amp;#039;&amp;#039;: [[Problema 2 | Subconjuntos inconsistentes]].&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=518</id>
		<title>Lógica matemática y fundamentos</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=518"/>
		<updated>2013-05-22T08:06:00Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios y sus soluciones colaborativas.&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Iniciación a la programación con Haskell ([[Media:Rel_1.hs |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional en Haskell. ([[Media:Rel_2.hs |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 proposicional con Isabelle/HOL. ([[Rel_3 |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;: Argumentación proposicional con Isabelle/HOL. ([[Rel_4 |Enunciado]] y [[Relación 4 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de conectivas. ([[Rel_5 |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;: Formalización de argumentos en lógica de primer orden. ([[Rel_6 |Enunciado]] y [[Relación 6 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer con Isabelle/HOL. ([[Rel_7 |Enunciado]] y [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Tableros semánticos proposicionales en Haskell. ([[Media:Rel_8.hs |Enunciado]] y [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Formas normales en lógica proposicional en Haskell ([[Media:FormasNormales.hs |Enunciado]] y [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Cláusulas proposicionales en Haskell. ([[Media:Clausulas.hs |Enunciado]] y [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Resolución proposicional en Haskell. ([[Media:ResolucionProposicional.hs |Enunciado]] y [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la Lógica Proposicional en Haskell. ([[Media:AplicacionesLP.hs |Enunciado]] y [[AplicacionesLP |Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
=== Teorías Isabelle/HOL de los temas de deducción natural ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 2&amp;#039;&amp;#039;&amp;#039;: [[Tema 2 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 8&amp;#039;&amp;#039;&amp;#039;: [[Tema 8 | Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 14&amp;#039;&amp;#039;&amp;#039;: [[Tema 14 | Programación funcional en Isabelle/HOL]] ([[Media: T14.thy | Teoría]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 15&amp;#039;&amp;#039;&amp;#039;: [[Tema 15 | Razonamiento sobre programas con Isabelle/HOL]].&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios evaluables ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 1 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 2 |Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nota al ejercicio 2&amp;#039;&amp;#039;&amp;#039;: los lemas auxiliares que se usen en una demostración por deducción natural han de ser probados de forma no automática. Se amplía el plazo hasta el viernes 3 de mayo para que se envíe el ejercicio 2 teniendo en cuenta esta aclaración.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 3 |Argumentación, deducción natural en lógica de primer orden con Isabelle/HOL y tableros semánticos]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 4 | Algoritmos de lógica proposicional en Haskell]].&lt;br /&gt;
&lt;br /&gt;
=== Problemas semanales ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 1&amp;#039;&amp;#039;&amp;#039;: [[Problema 1 | Inducción sobre fórmulas]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 2&amp;#039;&amp;#039;&amp;#039;: [[Problema 2 | Subconjuntos inconsistentes]].&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=517</id>
		<title>Lógica matemática y fundamentos</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=517"/>
		<updated>2013-05-22T08:05:25Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios y sus soluciones colaborativas.&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Iniciación a la programación con Haskell ([[Media:Rel_1.hs |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional en Haskell. ([[Media:Rel_2.hs |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 proposicional con Isabelle/HOL. ([[Rel_3 |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;: Argumentación proposicional con Isabelle/HOL. ([[Rel_4 |Enunciado]] y [[Relación 4 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de conectivas. ([[Rel_5 |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;: Formalización de argumentos en lógica de primer orden. ([[Rel_6 |Enunciado]] y [[Relación 6 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer con Isabelle/HOL. ([[Rel_7 |Enunciado]] y [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Tableros semánticos proposicionales en Haskell. ([[Media:Rel_8.hs |Enunciado]] y [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Formas normales en lógica proposicional en Haskell ([[Media:FormasNormales.hs |Enunciado]] y [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Cláusulas proposicionales en Haskell. ([[Media:Clausulas.hs |Enunciado]] y [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Resolución proposicional en Haskell. ([[Media:ResolucionProposicional.hs |Enunciado]] y [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la Lógica Proposicional en Haskell. ([[Media:AplicacionesLP.hs |Enunciado]] y [[AplicacionesLP |Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
=== Teorías Isabelle/HOL de los temas de deducción natural ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 2&amp;#039;&amp;#039;&amp;#039;: [[Tema 2 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 8&amp;#039;&amp;#039;&amp;#039;: [[Tema 8 | Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 14&amp;#039;&amp;#039;&amp;#039;: [[Tema 14 | Programación funcional en Isabelle/HOL]], [[Media: T14.thy | Teoría]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 15&amp;#039;&amp;#039;&amp;#039;: [[Tema 15 | Razonamiento sobre programas con Isabelle/HOL]].&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios evaluables ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 1 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 2 |Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nota al ejercicio 2&amp;#039;&amp;#039;&amp;#039;: los lemas auxiliares que se usen en una demostración por deducción natural han de ser probados de forma no automática. Se amplía el plazo hasta el viernes 3 de mayo para que se envíe el ejercicio 2 teniendo en cuenta esta aclaración.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 3 |Argumentación, deducción natural en lógica de primer orden con Isabelle/HOL y tableros semánticos]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 4 | Algoritmos de lógica proposicional en Haskell]].&lt;br /&gt;
&lt;br /&gt;
=== Problemas semanales ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 1&amp;#039;&amp;#039;&amp;#039;: [[Problema 1 | Inducción sobre fórmulas]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 2&amp;#039;&amp;#039;&amp;#039;: [[Problema 2 | Subconjuntos inconsistentes]].&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=516</id>
		<title>Lógica matemática y fundamentos</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=516"/>
		<updated>2013-05-22T08:04:19Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios y sus soluciones colaborativas.&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Iniciación a la programación con Haskell ([[Media:Rel_1.hs |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional en Haskell. ([[Media:Rel_2.hs |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 proposicional con Isabelle/HOL. ([[Rel_3 |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;: Argumentación proposicional con Isabelle/HOL. ([[Rel_4 |Enunciado]] y [[Relación 4 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de conectivas. ([[Rel_5 |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;: Formalización de argumentos en lógica de primer orden. ([[Rel_6 |Enunciado]] y [[Relación 6 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer con Isabelle/HOL. ([[Rel_7 |Enunciado]] y [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Tableros semánticos proposicionales en Haskell. ([[Media:Rel_8.hs |Enunciado]] y [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Formas normales en lógica proposicional en Haskell ([[Media:FormasNormales.hs |Enunciado]] y [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Cláusulas proposicionales en Haskell. ([[Media:Clausulas.hs |Enunciado]] y [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Resolución proposicional en Haskell. ([[Media:ResolucionProposicional.hs |Enunciado]] y [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la Lógica Proposicional en Haskell. ([[Media:AplicacionesLP.hs |Enunciado]] y [[AplicacionesLP |Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
=== Teorías Isabelle/HOL de los temas de deducción natural ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 2&amp;#039;&amp;#039;&amp;#039;: [[Tema 2 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 8&amp;#039;&amp;#039;&amp;#039;: [[Tema 8 | Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 14&amp;#039;&amp;#039;&amp;#039;: ([[Tema 14 | Programación funcional en Isabelle/HOL]], [[Media: T14.thy | Teoría]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 15&amp;#039;&amp;#039;&amp;#039;: [[Tema 15 | Razonamiento sobre programas con Isabelle/HOL]].&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios evaluables ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 1 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 2 |Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nota al ejercicio 2&amp;#039;&amp;#039;&amp;#039;: los lemas auxiliares que se usen en una demostración por deducción natural han de ser probados de forma no automática. Se amplía el plazo hasta el viernes 3 de mayo para que se envíe el ejercicio 2 teniendo en cuenta esta aclaración.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 3 |Argumentación, deducción natural en lógica de primer orden con Isabelle/HOL y tableros semánticos]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 4 | Algoritmos de lógica proposicional en Haskell]].&lt;br /&gt;
&lt;br /&gt;
=== Problemas semanales ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 1&amp;#039;&amp;#039;&amp;#039;: [[Problema 1 | Inducción sobre fórmulas]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 2&amp;#039;&amp;#039;&amp;#039;: [[Problema 2 | Subconjuntos inconsistentes]].&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=AplicacionesLP&amp;diff=515</id>
		<title>AplicacionesLP</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=AplicacionesLP&amp;diff=515"/>
		<updated>2013-05-21T07:06:58Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con &amp;#039;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt; -- AplicacionesLP.hs -- Aplicaciones de la Lógica proposicional. -- ---------------------------------------------------------------------  -- --------...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- AplicacionesLP.hs&lt;br /&gt;
-- Aplicaciones de la Lógica proposicional.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Librerías auxiliares                                               --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import SintaxisSemantica &lt;br /&gt;
-- import TablerosSemanticos&lt;br /&gt;
-- import ResolucionProposicional&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1: En una isla hay dos tribus, la de los veraces (que&lt;br /&gt;
-- siempre dicen la verdad) y la de los mentirosos (que siempre&lt;br /&gt;
-- mienten). Un viajero se encuentra con tres isleños A, B y C y cada&lt;br /&gt;
-- uno le dice una frase A dice “B y C son veraces syss C es veraz” B&lt;br /&gt;
-- dice “Si A y B son veraces, entonces B y C son veraces y A es&lt;br /&gt;
-- mentiroso” C dice “B es mentiroso syss A o B es veraz” &lt;br /&gt;
--&lt;br /&gt;
-- Determinar a qué tribu pertenecen A, B y C.&lt;br /&gt;
&lt;br /&gt;
-- Simbolización:&lt;br /&gt;
--   a, b y c representan que A, B y C son veraces&lt;br /&gt;
--   -a, -b y -c representan que A, B y C son mentirosos&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2: Decidir si es posible colorear los vértices de un&lt;br /&gt;
-- pentágono de rojo o azul de forma que los vértices adyacentes&lt;br /&gt;
-- tengan colores distintos.&lt;br /&gt;
&lt;br /&gt;
-- Simbolización:&lt;br /&gt;
--   1, 2, 3, 4, 5 representan los vértices consecutivos del pentágono&lt;br /&gt;
--   ri (1 ≤ i ≤ 5) representa que el vértice i es rojo&lt;br /&gt;
--   ai (1 ≤ i ≤ 5) representa que el vértice i es azul&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3: Cuatro palomas comparten tres huecos. Decidir si es&lt;br /&gt;
-- posible que no haya dos palomas en el mismo hueco.&lt;br /&gt;
&lt;br /&gt;
-- Simbolización: &lt;br /&gt;
--   pihj (i ∈ {1, 2, 3, 4} y j ∈ {1, 2, 3}) representa&lt;br /&gt;
--   que la paloma i está en el hueco j.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4: Un rectángulo se divide en seis rectángulos menores como&lt;br /&gt;
-- se indica en la figura. &lt;br /&gt;
&lt;br /&gt;
--               ------------------&lt;br /&gt;
--               |      |    B    |&lt;br /&gt;
--               |  A   |----------           &lt;br /&gt;
--               |      |   |     |&lt;br /&gt;
--               |------| D |     |&lt;br /&gt;
--               |   C  |   |  E  |&lt;br /&gt;
--               |------|---|     |&lt;br /&gt;
--               |     F    |     |&lt;br /&gt;
--               ------------------&lt;br /&gt;
&lt;br /&gt;
-- Demostrar que si cada una de los rectángulos menores tiene un lado&lt;br /&gt;
-- cuya medida es un número entero, entonces la medida de alguno de los&lt;br /&gt;
-- lados del rectángulo mayor es un número entero.&lt;br /&gt;
&lt;br /&gt;
-- Simbolización:&lt;br /&gt;
--   base: la base del rectángulo mayor es un número entero&lt;br /&gt;
--   altura: la altura del rectángulo mayor es un número entero&lt;br /&gt;
--   base_x: la base del rectángulo X es un número entero&lt;br /&gt;
--   altura_x: la altura del rectángulo X es un número entero&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5: Calcular las formas de colocar 4 reinas en un tablero&lt;br /&gt;
-- de 4x4 de forma que no haya más de una reina en cada fila,&lt;br /&gt;
-- columna o diagonal.&lt;br /&gt;
&lt;br /&gt;
-- Simbolización:&lt;br /&gt;
--   cij (1 ≤ i, j ≤ 4) indica que hay una reina en la fila i columna j.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6: Probar el caso más simple del teorema de Ramsey: entre&lt;br /&gt;
-- seis personas siempre hay (al menos) tres tales que cada una conoce&lt;br /&gt;
-- a las otras dos o cada una no conoce a ninguna de las otras dos.&lt;br /&gt;
&lt;br /&gt;
-- Simbolización:&lt;br /&gt;
--   1,2,3,4,5,6 representan a las personas&lt;br /&gt;
--   pij (1 ≤ i &amp;lt; j ≤ 6) indica que las personas i y j se conocen.&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/LMF2013/index.php?title=Archivo:AplicacionesLP.hs&amp;diff=514</id>
		<title>Archivo:AplicacionesLP.hs</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:AplicacionesLP.hs&amp;diff=514"/>
		<updated>2013-05-21T07:06:17Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=513</id>
		<title>Lógica matemática y fundamentos</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=513"/>
		<updated>2013-05-21T07:05:51Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios y sus soluciones colaborativas.&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Iniciación a la programación con Haskell ([[Media:Rel_1.hs |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional en Haskell. ([[Media:Rel_2.hs |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 proposicional con Isabelle/HOL. ([[Rel_3 |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;: Argumentación proposicional con Isabelle/HOL. ([[Rel_4 |Enunciado]] y [[Relación 4 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de conectivas. ([[Rel_5 |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;: Formalización de argumentos en lógica de primer orden. ([[Rel_6 |Enunciado]] y [[Relación 6 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer con Isabelle/HOL. ([[Rel_7 |Enunciado]] y [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Tableros semánticos proposicionales en Haskell. ([[Media:Rel_8.hs |Enunciado]] y [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Formas normales en lógica proposicional en Haskell ([[Media:FormasNormales.hs |Enunciado]] y [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Cláusulas proposicionales en Haskell. ([[Media:Clausulas.hs |Enunciado]] y [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Resolución proposicional en Haskell. ([[Media:ResolucionProposicional.hs |Enunciado]] y [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la Lógica Proposicional en Haskell. ([[Media:AplicacionesLP.hs |Enunciado]] y [[AplicacionesLP |Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
=== Teorías Isabelle/HOL de los temas de deducción natural ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 2&amp;#039;&amp;#039;&amp;#039;: [[Tema 2 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 8&amp;#039;&amp;#039;&amp;#039;: [[Tema 8 | Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios evaluables ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 1 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 2 |Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nota al ejercicio 2&amp;#039;&amp;#039;&amp;#039;: los lemas auxiliares que se usen en una demostración por deducción natural han de ser probados de forma no automática. Se amplía el plazo hasta el viernes 3 de mayo para que se envíe el ejercicio 2 teniendo en cuenta esta aclaración.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 3 |Argumentación, deducción natural en lógica de primer orden con Isabelle/HOL y tableros semánticos]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 4 | Algoritmos de lógica proposicional en Haskell]].&lt;br /&gt;
&lt;br /&gt;
=== Problemas semanales ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 1&amp;#039;&amp;#039;&amp;#039;: [[Problema 1 | Inducción sobre fórmulas]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 2&amp;#039;&amp;#039;&amp;#039;: [[Problema 2 | Subconjuntos inconsistentes]].&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Relaci%C3%B3n_11&amp;diff=505</id>
		<title>Relación 11</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Relaci%C3%B3n_11&amp;diff=505"/>
		<updated>2013-05-15T11:02:13Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- ResolucionProposicional.hs&lt;br /&gt;
-- Resolución proposicional.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
module ResolucionProposicional where&lt;br /&gt;
&lt;br /&gt;
import SintaxisSemantica&lt;br /&gt;
import FormasNormales&lt;br /&gt;
import Clausulas&lt;br /&gt;
import Data.List&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Resolventes                                                        --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1: Definir la función&lt;br /&gt;
--    resolvente :: Cláusula -&amp;gt; Cláusula -&amp;gt; Literal -&amp;gt; Cláusula&lt;br /&gt;
-- tal que (resolvente c1 c2 l) es la resolvente de c1 y c2 respecto del&lt;br /&gt;
-- literal l. Por ejemplo,&lt;br /&gt;
--    resolvente [no p,q] [no q,r] q  ==&amp;gt;  [no p,r]&lt;br /&gt;
--    resolvente [no p,no q] [q,r] (no q)  ==&amp;gt;  [no p,r]&lt;br /&gt;
--    resolvente [no p,q] [no p,no q] q  ==&amp;gt;  [no p]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Jose M Contreras&lt;br /&gt;
&lt;br /&gt;
resolvente :: Clausula -&amp;gt; Clausula -&amp;gt; Literal -&amp;gt; Clausula&lt;br /&gt;
resolvente c1 c2 x = union (delete x c1) (delete (complementario x) c2)&lt;br /&gt;
--La función complementario se define en el fichero importado FormasNormales &lt;br /&gt;
&lt;br /&gt;
--Miriam Núñez-Romero&lt;br /&gt;
&lt;br /&gt;
resolvente2 :: Clausula -&amp;gt; Clausula -&amp;gt; Literal -&amp;gt; Clausula&lt;br /&gt;
resolvente2 c1 c2 l = delete l (delete (complementario l) (c1`union`c2))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2: Definir la función&lt;br /&gt;
--    resolventes :: Cláusula -&amp;gt; Cláusula -&amp;gt; [Cláusula]&lt;br /&gt;
-- tal que (resolventes c1 c2) es el conjunto de las resolventes de c1 y&lt;br /&gt;
-- c2. Por ejemplo,&lt;br /&gt;
--    resolventes [no p,q] [p,no q]  ==&amp;gt;  [[q,no q],[no p,p]]&lt;br /&gt;
--    resolventes [no p,q] [p,q]     ==&amp;gt;  [[q]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Jose M Contreras&lt;br /&gt;
&lt;br /&gt;
resolventes :: Clausula -&amp;gt; Clausula -&amp;gt; [Clausula]&lt;br /&gt;
resolventes c1 c2 = [resolvente c1 c2 x| x&amp;lt;-c1, elem (complementario x) c2]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3: Definir la función&lt;br /&gt;
--    resolventesCláusulaConjunto :: Cláusula -&amp;gt; [Cláusula] -&amp;gt; [Cláusula]&lt;br /&gt;
-- tal que (resolventes c s) es el conjunto de las resolventes de c y&lt;br /&gt;
-- s. Por ejemplo, &lt;br /&gt;
--    resolventesCláusulaConjunto [no p,q] [[p,q],[p,r],[no q,s]]&lt;br /&gt;
--    ==&amp;gt; [[q],[q,r],[no p,s]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Jose M Contreras&lt;br /&gt;
&lt;br /&gt;
resolventesClausulaConjunto :: Clausula -&amp;gt; [Clausula] -&amp;gt; [Clausula]&lt;br /&gt;
resolventesClausulaConjunto c s = unionGeneral [resolventes c x|x&amp;lt;-s]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Eliminación de tautologías                                         --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1: Definir la función&lt;br /&gt;
--    esTautología :: Cláusula -&amp;gt; Bool&lt;br /&gt;
-- tal que (esTautología c) se verifica si c es una tautología. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    esTautología [p, q, no p]  ==&amp;gt;  True&lt;br /&gt;
--    esTautología [p, q, no r]  ==&amp;gt;  False&lt;br /&gt;
--    esTautología []            ==&amp;gt;  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Jose M Contreras&lt;br /&gt;
&lt;br /&gt;
esTautologia :: Clausula -&amp;gt; Bool&lt;br /&gt;
esTautologia c = or[elem (complementario x) (delete x c)|x&amp;lt;-c]&lt;br /&gt;
&lt;br /&gt;
--Miriam Núñez-Romero&lt;br /&gt;
esTautologia2 :: Clausula -&amp;gt; Bool&lt;br /&gt;
esTautologia2 c = or [elem (complementario x) c |x&amp;lt;-c]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2: Definir la función&lt;br /&gt;
--    eliminaTautologías :: [Cláusula] -&amp;gt; [Cláusula]&lt;br /&gt;
-- tal que (eliminaTautologías s) es el conjunto obtenido eliminando las&lt;br /&gt;
-- tautologías de s. Por ejemplo,&lt;br /&gt;
--    eliminaTautologías [[p, q], [p, q, no p]]  ==&amp;gt;  [[p,q]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Jose M Contreras&lt;br /&gt;
 &lt;br /&gt;
eliminaTautologias :: [Clausula] -&amp;gt; [Clausula]&lt;br /&gt;
eliminaTautologias s = [x|x&amp;lt;-s, not(esTautologia x)]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Decisión de inconsistencia por resolución                          --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4: Definir la función&lt;br /&gt;
--    esInconsistentePorResolución :: [Cláusula] -&amp;gt; Bool&lt;br /&gt;
-- tal que (esInconsistentePorResolución s) se verifica si s es&lt;br /&gt;
-- inconsistente mediante resolución. Por ejemplo,&lt;br /&gt;
--    esInconsistentePorResolución [[p],[no p,q],[no q]]&lt;br /&gt;
--    ==&amp;gt; True&lt;br /&gt;
--    esInconsistentePorResolución [[p],[no p,q]]&lt;br /&gt;
--    ==&amp;gt; False&lt;br /&gt;
--    esInconsistentePorResolución [[p,q],[no p,q],[p,no q],[no p,no q]]&lt;br /&gt;
--    ==&amp;gt; True&lt;br /&gt;
--    esInconsistentePorResolución [[p,q],[p,r],[no q,no r],[no p]]&lt;br /&gt;
--    ==&amp;gt; True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esInconsistentePorResolución :: [Cláusula] -&amp;gt; Bool&lt;br /&gt;
esInconsistentePorResolución s =&lt;br /&gt;
    esInconsistentePorResolución&amp;#039; s []&lt;br /&gt;
&lt;br /&gt;
esInconsistentePorResolución&amp;#039; :: [Cláusula] -&amp;gt; [Cláusula] -&amp;gt; Bool&lt;br /&gt;
esInconsistentePorResolución&amp;#039; soporte usables &lt;br /&gt;
    | null soporte    = False&lt;br /&gt;
    | elem [] soporte = True&lt;br /&gt;
    | otherwise       =&lt;br /&gt;
        esInconsistentePorResolución&amp;#039; soporte&amp;#039; usables&amp;#039;&lt;br /&gt;
        where actual   = head soporte&lt;br /&gt;
              usables&amp;#039; = union [actual] usables&lt;br /&gt;
              soporte&amp;#039; = union (tail soporte)&lt;br /&gt;
                               [c &lt;br /&gt;
                                | c &amp;lt;- resolventesCláusulaConjunto&lt;br /&gt;
                                       actual &lt;br /&gt;
                                       usables&amp;#039;&lt;br /&gt;
                                , not (esTautología c)&lt;br /&gt;
                                , notElem c soporte&lt;br /&gt;
                                , notElem c usables&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Validez mediante resolución                                        --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5: Definir la función&lt;br /&gt;
--    esVálidaPorResolución :: Prop -&amp;gt; Bool&lt;br /&gt;
-- tal que (esVálidaPorResolución f) se verifica si f es válida por&lt;br /&gt;
-- resolución. Por ejemplo, &lt;br /&gt;
--    esVálidaPorResolución (p --&amp;gt; p)                 ==&amp;gt;  True&lt;br /&gt;
--    esVálidaPorResolución ((p --&amp;gt; q) \/ (q --&amp;gt; p))  ==&amp;gt;  True&lt;br /&gt;
--    esVálidaPorResolución (p --&amp;gt; q)                 ==&amp;gt;  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esVálidaPorResolución :: Prop -&amp;gt; Bool&lt;br /&gt;
esVálidaPorResolución f = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Consecuencia mediante resolución                                   --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6: Definir la función&lt;br /&gt;
--    esConsecuenciaPorResolución :: [Prop] -&amp;gt; Prop -&amp;gt; Bool&lt;br /&gt;
-- tal que (esConsecuenciaPorResolución s f) se verifica si f es&lt;br /&gt;
-- consecuencia de s mediante el método de resolución. Por ejemplo,&lt;br /&gt;
--    esConsecuenciaPorResolución [p --&amp;gt; q, q --&amp;gt; r] (p --&amp;gt; r)  &lt;br /&gt;
--    ==&amp;gt; True&lt;br /&gt;
--    esConsecuenciaPorResolución [p --&amp;gt; q, q --&amp;gt; r] (p &amp;lt;--&amp;gt; r)&lt;br /&gt;
--    ==&amp;gt; False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esConsecuenciaPorResolución :: [Prop] -&amp;gt; Prop -&amp;gt; Bool&lt;br /&gt;
esConsecuenciaPorResolución s f = undefined&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/LMF2013/index.php?title=Ejercicio_4&amp;diff=504</id>
		<title>Ejercicio 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Ejercicio_4&amp;diff=504"/>
		<updated>2013-05-15T10:30:34Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunciado ==&lt;br /&gt;
El cuarto ejercicio evaluable consiste una de las dos opciones que se ofrecen a&lt;br /&gt;
continuación:&lt;br /&gt;
&lt;br /&gt;
* Programación en Haskell de algunos de los refinamientos de resolución en lógica proposicional. Las funciones finales han de ser (esValidaPorResolucion* f) para determinar la validez de la fórmula f; y (esConsecuenciaPoResolucion* s f) que determine si la fórmula f es consecuencia lógica del conjunto s, siendo * el refinamiento correspondiente. Esta opción tendrá peso 4 en el cálculo de la calificación por curso.&lt;br /&gt;
&lt;br /&gt;
* Programación en Haskell del algoritmo de Davis-Putnam. Las funciones finales han de ser (esValidaPorDP f) para determinar la validez de la fórmula f; y (esConsecuenciaPorDP s f) que determine si la fórmula f es consecuencia lógica del conjunto s. Esta opción tendrá peso 5 en el  cálculo de la calificación por curso. &lt;br /&gt;
&lt;br /&gt;
En ambos casos hay que usar la representación de la lógica proposicional en&lt;br /&gt;
Haskell, realizada en las relaciones de ejercicios 2, 9 y 10. Se valorará la&lt;br /&gt;
estructura y la eficiencia de las funciones, así como la claridad de los&lt;br /&gt;
comentarios.&lt;br /&gt;
&lt;br /&gt;
Se enviará a mjoseh@us.es antes del viernes 31 de mayo de 2013 un fichero&lt;br /&gt;
usuario_4a.hs o usuario_4b.hs, según la opción elegida.&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Ejercicio_4&amp;diff=503</id>
		<title>Ejercicio 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Ejercicio_4&amp;diff=503"/>
		<updated>2013-05-15T10:30:23Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunciado ==&lt;br /&gt;
El cuarto ejercicio evaluable consiste una de las dos opciones que se ofrecen a&lt;br /&gt;
continuación:&lt;br /&gt;
&lt;br /&gt;
* Programación en Haskell de algunos de los refinamientos de resolución en lógica proposicional. Las funciones finales han de ser (esValidaPorResolucion* f) para determinar la validez de la fórmula f; y (esConsecuenciaPoResolucion* s f) que determine si la fórmula f es consecuencia lógica del conjunto s, siendo * el refinamiento correspondiente. Esta opción tendrá peso 4 en el cálculo de la calificación por curso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Programación en Haskell del algoritmo de Davis-Putnam. Las funciones finales han de ser (esValidaPorDP f) para determinar la validez de la fórmula f; y (esConsecuenciaPorDP s f) que determine si la fórmula f es consecuencia lógica del conjunto s. Esta opción tendrá peso 5 en el  cálculo de la calificación por curso. &lt;br /&gt;
&lt;br /&gt;
En ambos casos hay que usar la representación de la lógica proposicional en&lt;br /&gt;
Haskell, realizada en las relaciones de ejercicios 2, 9 y 10. Se valorará la&lt;br /&gt;
estructura y la eficiencia de las funciones, así como la claridad de los&lt;br /&gt;
comentarios.&lt;br /&gt;
&lt;br /&gt;
Se enviará a mjoseh@us.es antes del viernes 31 de mayo de 2013 un fichero&lt;br /&gt;
usuario_4a.hs o usuario_4b.hs, según la opción elegida.&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Ejercicio_4&amp;diff=502</id>
		<title>Ejercicio 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Ejercicio_4&amp;diff=502"/>
		<updated>2013-05-15T10:29:49Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunciado ==&lt;br /&gt;
El cuarto ejercicio evaluable consiste una de las dos opciones que se ofrecen a&lt;br /&gt;
continuación:&lt;br /&gt;
&lt;br /&gt;
* Programación en Haskell de algunos de los refinamientos de resolución en lógica proposicional. Las funciones finales han de ser (esValidaPorResolucion* f) para determinar la validez de la fórmula f; y (esConsecuenciaPoResolucion* s f) que determine si la fórmula f es consecuencia lógica del conjunto s, siendo * el refinamiento correspondiente. Esta opción tendrá peso 4 en el cálculo de la calificación por curso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Programación en Haskell del algoritmo de Davis-Putnam. Las funciones&lt;br /&gt;
 finales han de ser (esValidaPorDP f) para determinar la validez de la fórmula&lt;br /&gt;
 f; y (esConsecuenciaPorDP s f) que determine si la fórmula f es consecuencia&lt;br /&gt;
 lógica del conjunto s. Esta opción tendrá peso 5 en el  cálculo de la&lt;br /&gt;
 calificación por curso. &lt;br /&gt;
&lt;br /&gt;
En ambos casos hay que usar la representación de la lógica proposicional en&lt;br /&gt;
Haskell, realizada en las relaciones de ejercicios 2, 9 y 10. Se valorará la&lt;br /&gt;
estructura y la eficiencia de las funciones, así como la claridad de los&lt;br /&gt;
comentarios.&lt;br /&gt;
&lt;br /&gt;
Se enviará a mjoseh@us.es antes del viernes 31 de mayo de 2013 un fichero&lt;br /&gt;
usuario_4a.hs o usuario_4b.hs, según la opción elegida.&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Ejercicio_4&amp;diff=501</id>
		<title>Ejercicio 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Ejercicio_4&amp;diff=501"/>
		<updated>2013-05-15T10:28:31Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunciado ==&lt;br /&gt;
El cuarto ejercicio evaluable consiste una de las dos opciones que se ofrecen a&lt;br /&gt;
continuación:&lt;br /&gt;
&lt;br /&gt;
* Programación en Haskell de algunos de los refinamientos de resolución en&lt;br /&gt;
 lógica proposicional. Las funciones finales han de ser (esValidaPorResolucion*&lt;br /&gt;
 f) para determinar la validez de la fórmula f; y (esConsecuenciaPoResolucion*&lt;br /&gt;
 s f) que determine si la fórmula f es consecuencia lógica del conjunto s,&lt;br /&gt;
 siendo * el refinamiento correspondiente. Esta opción tendrá peso 4 en el&lt;br /&gt;
 cálculo de la calificación por curso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Programación en Haskell del algoritmo de Davis-Putnam. Las funciones&lt;br /&gt;
 finales han de ser (esValidaPorDP f) para determinar la validez de la fórmula&lt;br /&gt;
 f; y (esConsecuenciaPorDP s f) que determine si la fórmula f es consecuencia&lt;br /&gt;
 lógica del conjunto s. Esta opción tendrá peso 5 en el  cálculo de la&lt;br /&gt;
 calificación por curso. &lt;br /&gt;
&lt;br /&gt;
En ambos casos hay que usar la representación de la lógica proposicional en&lt;br /&gt;
Haskell, realizada en las relaciones de ejercicios 2, 9 y 10. Se valorará la&lt;br /&gt;
estructura y la eficiencia de las funciones, así como la claridad de los&lt;br /&gt;
comentarios.&lt;br /&gt;
&lt;br /&gt;
Se enviará a mjoseh@us.es antes del viernes 31 de mayo de 2013 un fichero&lt;br /&gt;
usuario_4a.hs o usuario_4b.hs, según la opción elegida.&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Ejercicio_4&amp;diff=500</id>
		<title>Ejercicio 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Ejercicio_4&amp;diff=500"/>
		<updated>2013-05-15T10:27:26Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con &amp;#039;El cuarto ejercicio evaluable consiste una de las dos opciones que se ofrecen a continuación:  1.- Programación en Haskell de algunos de los refinamientos de resolución en  l...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;El cuarto ejercicio evaluable consiste una de las dos opciones que se ofrecen a&lt;br /&gt;
continuación:&lt;br /&gt;
&lt;br /&gt;
1.- Programación en Haskell de algunos de los refinamientos de resolución en&lt;br /&gt;
 lógica proposicional. Las funciones finales han de ser (esValidaPorResolucion*&lt;br /&gt;
 f) para determinar la validez de la fórmula f; y (esConsecuenciaPoResolucion*&lt;br /&gt;
 s f) que determine si la fórmula f es consecuencia lógica del conjunto s,&lt;br /&gt;
 siendo * el refinamiento correspondiente. Esta opción tendrá peso 4 en el&lt;br /&gt;
 cálculo de la calificación por curso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2.- Programación en Haskell del algoritmo de Davis-Putnam. Las funciones&lt;br /&gt;
 finales han de ser (esValidaPorDP f) para determinar la validez de la fórmula&lt;br /&gt;
 f; y (esConsecuenciaPorDP s f) que determine si la fórmula f es consecuencia&lt;br /&gt;
 lógica del conjunto s. Esta opción tendrá peso 5 en el  cálculo de la&lt;br /&gt;
 calificación por curso. &lt;br /&gt;
&lt;br /&gt;
En ambos casos hay que usar la representación de la lógica proposicional en&lt;br /&gt;
Haskell, realizada en las relaciones de ejercicios 2, 9 y 10. Se valorará la&lt;br /&gt;
estructura y la eficiencia de las funciones, así como la claridad de los&lt;br /&gt;
comentarios.&lt;br /&gt;
&lt;br /&gt;
Se enviará a mjoseh@us.es antes del viernes 31 de mayo de 2013 un fichero&lt;br /&gt;
usuario_4a.hs o usuario_4b.hs, según la opción elegida.&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=499</id>
		<title>Lógica matemática y fundamentos</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=499"/>
		<updated>2013-05-15T10:26:54Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios y sus soluciones colaborativas.&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Iniciación a la programación con Haskell ([[Media:Rel_1.hs |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional en Haskell. ([[Media:Rel_2.hs |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 proposicional con Isabelle/HOL. ([[Rel_3 |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;: Argumentación proposicional con Isabelle/HOL. ([[Rel_4 |Enunciado]] y [[Relación 4 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de conectivas. ([[Rel_5 |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;: Formalización de argumentos en lógica de primer orden. ([[Rel_6 |Enunciado]] y [[Relación 6 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer con Isabelle/HOL. ([[Rel_7 |Enunciado]] y [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Tableros semánticos proposicionales en Haskell. ([[Media:Rel_8.hs |Enunciado]] y [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Formas normales en lógica proposicional en Haskell ([[Media:FormasNormales.hs |Enunciado]] y [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Cláusulas proposicionales en Haskell. ([[Media:Clausulas.hs |Enunciado]] y [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Resolución proposicional en Haskell. ([[Media:ResolucionProposicional.hs |Enunciado]] y [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
=== Teorías Isabelle/HOL de los temas de deducción natural ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 2&amp;#039;&amp;#039;&amp;#039;: [[Tema 2 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 8&amp;#039;&amp;#039;&amp;#039;: [[Tema 8 | Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios evaluables ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 1 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 2 |Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nota al ejercicio 2&amp;#039;&amp;#039;&amp;#039;: los lemas auxiliares que se usen en una demostración por deducción natural han de ser probados de forma no automática. Se amplía el plazo hasta el viernes 3 de mayo para que se envíe el ejercicio 2 teniendo en cuenta esta aclaración.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 3 |Argumentación, deducción natural en lógica de primer orden con Isabelle/HOL y tableros semánticos]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 4&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 4 | Algoritmos de lógica proposicional en Haskell]].&lt;br /&gt;
&lt;br /&gt;
=== Problemas semanales ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 1&amp;#039;&amp;#039;&amp;#039;: [[Problema 1 | Inducción sobre fórmulas]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 2&amp;#039;&amp;#039;&amp;#039;: [[Problema 2 | Subconjuntos inconsistentes]].&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Relaci%C3%B3n_11&amp;diff=471</id>
		<title>Relación 11</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Relaci%C3%B3n_11&amp;diff=471"/>
		<updated>2013-05-02T09:05:43Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con &amp;#039;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;  -- ResolucionProposicional.hs -- Resolución proposicional. -- ---------------------------------------------------------------------  module Resolucio...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- ResolucionProposicional.hs&lt;br /&gt;
-- Resolución proposicional.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
module ResolucionProposicional where&lt;br /&gt;
&lt;br /&gt;
import SintaxisSemantica&lt;br /&gt;
import FormasNormales&lt;br /&gt;
import Clausulas&lt;br /&gt;
import Data.List&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Resolventes                                                        --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1: Definir la función&lt;br /&gt;
--    resolvente :: Cláusula -&amp;gt; Cláusula -&amp;gt; Literal -&amp;gt; Cláusula&lt;br /&gt;
-- tal que (resolvente c1 c2 l) es la resolvente de c1 y c2 respecto del&lt;br /&gt;
-- literal l. Por ejemplo,&lt;br /&gt;
--    resolvente [no p,q] [no q,r] q  ==&amp;gt;  [no p,r]&lt;br /&gt;
--    resolvente [no p,no q] [q,r] (no q)  ==&amp;gt;  [no p,r]&lt;br /&gt;
--    resolvente [no p,q] [no p,no q] q  ==&amp;gt;  [no p]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
resolvente :: Cláusula -&amp;gt; Cláusula -&amp;gt; Literal -&amp;gt; Cláusula&lt;br /&gt;
resolvente c1 c2 l = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2: Definir la función&lt;br /&gt;
--    resolventes :: Cláusula -&amp;gt; Cláusula -&amp;gt; [Cláusula]&lt;br /&gt;
-- tal que (resolventes c1 c2) es el conjunto de las resolventes de c1 y&lt;br /&gt;
-- c2. Por ejemplo,&lt;br /&gt;
--    resolventes [no p,q] [p,no q]  ==&amp;gt;  [[q,no q],[no p,p]]&lt;br /&gt;
--    resolventes [no p,q] [p,q]     ==&amp;gt;  [[q]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
resolventes :: Cláusula -&amp;gt; Cláusula -&amp;gt; [Cláusula]&lt;br /&gt;
resolventes c1 c2 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3: Definir la función&lt;br /&gt;
--    resolventesCláusulaConjunto :: Cláusula -&amp;gt; [Cláusula] -&amp;gt; [Cláusula]&lt;br /&gt;
-- tal que (resolventes c s) es el conjunto de las resolventes de c y&lt;br /&gt;
-- s. Por ejemplo, &lt;br /&gt;
--    resolventesCláusulaConjunto [no p,q] [[p,q],[p,r],[no q,s]]&lt;br /&gt;
--    ==&amp;gt; [[q],[q,r],[no p,s]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
resolventesCláusulaConjunto :: Cláusula -&amp;gt; [Cláusula] -&amp;gt; [Cláusula]&lt;br /&gt;
resolventesCláusulaConjunto c s = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Eliminación de tautologías                                         --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1: Definir la función&lt;br /&gt;
--    esTautología :: Cláusula -&amp;gt; Bool&lt;br /&gt;
-- tal que (esTautología c) se verifica si c es una tautología. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    esTautología [p, q, no p]  ==&amp;gt;  True&lt;br /&gt;
--    esTautología [p, q, no r]  ==&amp;gt;  False&lt;br /&gt;
--    esTautología []            ==&amp;gt;  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esTautología :: Cláusula -&amp;gt; Bool&lt;br /&gt;
esTautología c = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2: Definir la función&lt;br /&gt;
--    eliminaTautologías :: [Cláusula] -&amp;gt; [Cláusula]&lt;br /&gt;
-- tal que (eliminaTautologías s) es el conjunto obtenido eliminando las&lt;br /&gt;
-- tautologías de s. Por ejemplo,&lt;br /&gt;
--    eliminaTautologías [[p, q], [p, q, no p]]  ==&amp;gt;  [[p,q]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
eliminaTautologías :: [Cláusula] -&amp;gt; [Cláusula]&lt;br /&gt;
eliminaTautologías s = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Decisión de inconsistencia por resolución                          --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4: Definir la función&lt;br /&gt;
--    esInconsistentePorResolución :: [Cláusula] -&amp;gt; Bool&lt;br /&gt;
-- tal que (esInconsistentePorResolución s) se verifica si s es&lt;br /&gt;
-- inconsistente mediante resolución. Por ejemplo,&lt;br /&gt;
--    esInconsistentePorResolución [[p],[no p,q],[no q]]&lt;br /&gt;
--    ==&amp;gt; True&lt;br /&gt;
--    esInconsistentePorResolución [[p],[no p,q]]&lt;br /&gt;
--    ==&amp;gt; False&lt;br /&gt;
--    esInconsistentePorResolución [[p,q],[no p,q],[p,no q],[no p,no q]]&lt;br /&gt;
--    ==&amp;gt; True&lt;br /&gt;
--    esInconsistentePorResolución [[p,q],[p,r],[no q,no r],[no p]]&lt;br /&gt;
--    ==&amp;gt; True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esInconsistentePorResolución :: [Cláusula] -&amp;gt; Bool&lt;br /&gt;
esInconsistentePorResolución s = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Validez mediante resolución                                        --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5: Definir la función&lt;br /&gt;
--    esVálidaPorResolución :: Prop -&amp;gt; Bool&lt;br /&gt;
-- tal que (esVálidaPorResolución f) se verifica si f es válida por&lt;br /&gt;
-- resolución. Por ejemplo, &lt;br /&gt;
--    esVálidaPorResolución (p --&amp;gt; p)                 ==&amp;gt;  True&lt;br /&gt;
--    esVálidaPorResolución ((p --&amp;gt; q) \/ (q --&amp;gt; p))  ==&amp;gt;  True&lt;br /&gt;
--    esVálidaPorResolución (p --&amp;gt; q)                 ==&amp;gt;  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esVálidaPorResolución :: Prop -&amp;gt; Bool&lt;br /&gt;
esVálidaPorResolución f = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Consecuencia mediante resolución                                   --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6: Definir la función&lt;br /&gt;
--    esConsecuenciaPorResolución :: [Prop] -&amp;gt; Prop -&amp;gt; Bool&lt;br /&gt;
-- tal que (esConsecuenciaPorResolución s f) se verifica si f es&lt;br /&gt;
-- consecuencia de s mediante el método de resolución. Por ejemplo,&lt;br /&gt;
--    esConsecuenciaPorResolución [p --&amp;gt; q, q --&amp;gt; r] (p --&amp;gt; r)  &lt;br /&gt;
--    ==&amp;gt; True&lt;br /&gt;
--    esConsecuenciaPorResolución [p --&amp;gt; q, q --&amp;gt; r] (p &amp;lt;--&amp;gt; r)&lt;br /&gt;
--    ==&amp;gt; False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esConsecuenciaPorResolución :: [Prop] -&amp;gt; Prop -&amp;gt; Bool&lt;br /&gt;
esConsecuenciaPorResolución s f = undefined&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/LMF2013/index.php?title=Relaci%C3%B3n_10&amp;diff=470</id>
		<title>Relación 10</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Relaci%C3%B3n_10&amp;diff=470"/>
		<updated>2013-05-02T09:05:02Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con &amp;#039;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt; -- Clausulas.hs -- Cláusulas. -- ---------------------------------------------------------------------  module Clausulas where  -- -------------------...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- Clausulas.hs&lt;br /&gt;
-- Cláusulas.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
module Clausulas where&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Librería suxiliares                                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import SintaxisSemantica&lt;br /&gt;
import FormasNormales&lt;br /&gt;
import Data.List&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Cláusulas                                                          --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1: Definir el tipo de datos Cláusula como una lista de&lt;br /&gt;
-- literales. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
type Cláusula = [Literal]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2: Definir la función&lt;br /&gt;
--    cláusula :: Prop -&amp;gt; Cláusula&lt;br /&gt;
-- tal que (cláusula f) es la cláusula de la fórmula-clausal f. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cláusula p                                 ==&amp;gt;  [p]&lt;br /&gt;
--    cláusula (no p)                            ==&amp;gt;  [no p]&lt;br /&gt;
--    cláusula (((no p) \/ r) \/ ((no p) \/ q))  ==&amp;gt;  [q,r,no p]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cláusula :: Prop -&amp;gt; Cláusula&lt;br /&gt;
cláusula f = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3: Definir la función&lt;br /&gt;
--    cláusulasFNC :: Prop -&amp;gt; [Cláusula]&lt;br /&gt;
-- tal que (cláusulasFNC f) es el conjunto de cláusulas de la fórmula en&lt;br /&gt;
-- forma normal conjuntiva f. Por ejmplo,&lt;br /&gt;
--    cláusulasFNC (p /\ ((no q) \/ r))&lt;br /&gt;
--    ==&amp;gt; [[p],[r, no q]]&lt;br /&gt;
--    cláusulasFNC (((no p) \/ q) /\ ((no p) \/ (no r)))&lt;br /&gt;
--    ==&amp;gt; [[q, no p],[no p,no r]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cláusulasFNC :: Prop -&amp;gt; [Cláusula]&lt;br /&gt;
cláusulasFNC = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4: Definir la función&lt;br /&gt;
--    cláusulas :: Prop -&amp;gt; [Cláusula]&lt;br /&gt;
-- tal que (cláusulas f) es un conjunto de cláusulas equivalente a&lt;br /&gt;
-- f. Por ejemplo,&lt;br /&gt;
--    cláusulas (p /\ (q --&amp;gt; r))       &lt;br /&gt;
--    ==&amp;gt; [[p],[r,no q]]&lt;br /&gt;
--    cláusulas (no (p /\ (q --&amp;gt; r)))  &lt;br /&gt;
--    ==&amp;gt; [[q,no p],[no p,no r]]&lt;br /&gt;
--    cláusulas (no(p &amp;lt;--&amp;gt; r))         &lt;br /&gt;
--    ==&amp;gt; [[p,r],[p,no p],[r,no r],[no p,no r]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cláusulas :: Prop -&amp;gt; [Cláusula]&lt;br /&gt;
cláusulas f = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Cláusulas de un conjunto de fórmulas                               --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5: Definir la función&lt;br /&gt;
--    cláusulasConjunto :: [Prop] -&amp;gt; [Cláusula]&lt;br /&gt;
-- tal que (cláusulasConjunto s) es un conjunto de cláusulas equivalente&lt;br /&gt;
-- a s. Por ejemplo,&lt;br /&gt;
--    cláusulasConjunto [p --&amp;gt; q, q --&amp;gt; r]   ==&amp;gt;  [[q,no p],[r,no q]]&lt;br /&gt;
--    cláusulasConjunto [p --&amp;gt; q, q &amp;lt;--&amp;gt; p]  ==&amp;gt;  [[q,no p],[p,no q]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cláusulasConjunto :: [Prop] -&amp;gt; [Cláusula]&lt;br /&gt;
cláusulasConjunto s = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Símbolos proposicionales de una cláusula                           --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6: Definir la función&lt;br /&gt;
--    símbolosProposicionalesCláusula :: Cláusula -&amp;gt; [Prop]&lt;br /&gt;
-- tal que (símbolosProposicionalesCláusula c) es el conjunto de los&lt;br /&gt;
-- símbolos proposicionales de c. Por ejemplo,&lt;br /&gt;
--    símbolosProposicionalesCláusula [p, q, no p]  ==&amp;gt;  [p,q]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
símbolosProposicionalesCláusula :: Cláusula -&amp;gt; [Prop]&lt;br /&gt;
símbolosProposicionalesCláusula = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Símbolos proposicionales de un conjunto de cláusulas               --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7: Definir la función&lt;br /&gt;
--    símbolosProposicionalesConjuntoCláusula :: [Cláusula] -&amp;gt; [Prop]&lt;br /&gt;
-- tal que (símbolosProposicionalesConjuntoCláusula s) es el conjunto de los&lt;br /&gt;
-- símbolos proposicionales de s. Por ejemplo,&lt;br /&gt;
--    símbolosProposicionalesConjuntoCláusula [[p, q],[no q, r]]&lt;br /&gt;
--    ==&amp;gt; [p,q,r]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
símbolosProposicionalesConjuntoCláusula :: [Cláusula] -&amp;gt; [Prop]&lt;br /&gt;
símbolosProposicionalesConjuntoCláusula s = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Interpretaciones de una cláusula                                   --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8: Definir la función&lt;br /&gt;
--    interpretacionesCláusula :: Cláusula -&amp;gt; [Interpretación]&lt;br /&gt;
-- tal que (interpretacionesCláusula c) es el conjunto de&lt;br /&gt;
-- interpretaciones de c. Por ejemplo,&lt;br /&gt;
--    interpretacionesCláusula [p, q, no p]  ==&amp;gt;  [[p,q],[p],[q],[]]&lt;br /&gt;
--    interpretacionesCláusula []            ==&amp;gt;  [[]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
interpretacionesCláusula :: Cláusula -&amp;gt; [Interpretación]&lt;br /&gt;
interpretacionesCláusula c = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Interpretaciones de un conjunto de cláusulas                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9: Definir la función&lt;br /&gt;
--    interpretacionesConjuntoCláusula :: [Cláusula] -&amp;gt; [Interpretación]&lt;br /&gt;
-- tal que (interpretacionesConjuntoCláusula s) es el conjunto de&lt;br /&gt;
-- interpretaciones de s. Por ejemplo,&lt;br /&gt;
--    interpretacionesConjuntoCláusula [[p, no q],[no p, q]]&lt;br /&gt;
--    ==&amp;gt; [[p,q],[p],[q],[]]&lt;br /&gt;
--    interpretacionesConjuntoCláusula []&lt;br /&gt;
--    ==&amp;gt; [[]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
interpretacionesConjuntoCláusula :: [Cláusula] -&amp;gt; [Interpretación]&lt;br /&gt;
interpretacionesConjuntoCláusula c = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Modelos de cláusulas                                               --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10: Definir la función&lt;br /&gt;
--    esModeloLiteral :: Interpretación -&amp;gt; Literal -&amp;gt; Bool&lt;br /&gt;
-- tal que (esModeloLiteral i l) se verifica si i es modelo de l. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    esModeloLiteral [p,r] p       ==&amp;gt;  True&lt;br /&gt;
--    esModeloLiteral [p,r] q       ==&amp;gt;  False&lt;br /&gt;
--    esModeloLiteral [p,r] (no p)  ==&amp;gt;  False&lt;br /&gt;
--    esModeloLiteral [p,r] (no q)  ==&amp;gt;  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esModeloLiteral :: Interpretación -&amp;gt; Literal -&amp;gt; Bool&lt;br /&gt;
esModeloLiteral = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11: Definir la función&lt;br /&gt;
--    esModeloCláusula :: Interpretación -&amp;gt; Cláusula -&amp;gt; Bool&lt;br /&gt;
-- tal que (esModeloCláusula i c) se verifica si i es modelo de c . Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    esModeloCláusula [p,r] [p, q]     ==&amp;gt;  True&lt;br /&gt;
--    esModeloCláusula [r] [p, no q]    ==&amp;gt;  True&lt;br /&gt;
--    esModeloCláusula [q,r] [p, no q]  ==&amp;gt;  False&lt;br /&gt;
--    esModeloCláusula [q,r] []         ==&amp;gt;  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esModeloCláusula :: Interpretación -&amp;gt; Cláusula -&amp;gt; Bool&lt;br /&gt;
esModeloCláusula i c = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12: Definir la función&lt;br /&gt;
--    modelosCláusula :: Cláusula -&amp;gt; [Interpretación]&lt;br /&gt;
-- tal que (modelosCláusula c) es la lista de los modelos de c. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    modelosCláusula [no p, q]  ==&amp;gt;  [[p,q],[q],[]]&lt;br /&gt;
--    modelosCláusula [no p, p]  ==&amp;gt;  [[p],[]]&lt;br /&gt;
--    modelosCláusula []         ==&amp;gt;  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
modelosCláusula :: Cláusula -&amp;gt; [Interpretación]&lt;br /&gt;
modelosCláusula c = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Modelos de conjuntos de cláusulas                                  --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13: Definir la función&lt;br /&gt;
--    esModeloConjuntoCláusulas :: Interpretación -&amp;gt; [Cláusula] -&amp;gt; Bool&lt;br /&gt;
-- tal que (esModeloConjuntoCláusulas i c) se verifica si i es modelo de&lt;br /&gt;
-- c. Por ejemplo,&lt;br /&gt;
--    esModeloConjuntoCláusulas [p,r] [[p, no q], [r]]  ==&amp;gt;  True&lt;br /&gt;
--    esModeloConjuntoCláusulas [p] [[p, no q], [r]]    ==&amp;gt;  False&lt;br /&gt;
--    esModeloConjuntoCláusulas [p] []                  ==&amp;gt;  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esModeloConjuntoCláusulas :: Interpretación -&amp;gt; [Cláusula] -&amp;gt; Bool&lt;br /&gt;
esModeloConjuntoCláusulas i s = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14: Definir la función&lt;br /&gt;
--    modelosConjuntoCláusulas :: [Cláusula] -&amp;gt; [Interpretación]&lt;br /&gt;
-- tal que (modelosConjuntoCláusulas s) es la lista de los modelos de&lt;br /&gt;
-- s. Por ejemplo, &lt;br /&gt;
--    modelosConjuntoCláusulas [[no p, q], [no q, p]]    &lt;br /&gt;
--    ==&amp;gt; [[p,q],[]]&lt;br /&gt;
--    modelosConjuntoCláusulas [[no p, q], [p], [no q]]  &lt;br /&gt;
--    ==&amp;gt; []&lt;br /&gt;
--    modelosConjuntoCláusulas [[p, no p, q]]            &lt;br /&gt;
--    ==&amp;gt; [[p,q],[p],[q],[]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
modelosConjuntoCláusulas :: [Cláusula] -&amp;gt; [Interpretación]&lt;br /&gt;
modelosConjuntoCláusulas s = undefined &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Cláusulas válidas, satisfacibles e insatisfacibles                 --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 15: Definir la función&lt;br /&gt;
--    esCláusulaVálida :: Cláusula -&amp;gt; Bool&lt;br /&gt;
-- tal que (esCláusulaVálida c) se verifica si la cláusula c es&lt;br /&gt;
-- válida. Por ejemplo, &lt;br /&gt;
--    esCláusulaVálida [p, q, no p]  ==&amp;gt;  True&lt;br /&gt;
--    esCláusulaVálida [p, q, no r]  ==&amp;gt;  False&lt;br /&gt;
--    esCláusulaVálida []            ==&amp;gt;  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esCláusulaVálida :: Cláusula -&amp;gt; Bool&lt;br /&gt;
esCláusulaVálida c = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16: Definir la función&lt;br /&gt;
--    esCláusulaInsatisfacible :: Cláusula -&amp;gt; Bool&lt;br /&gt;
-- tal que (esCláusulaInsatisfacible c) se verifica si la cláusula c es&lt;br /&gt;
-- insatisfacible. Por ejemplo, &lt;br /&gt;
--    esCláusulaInsatisfacible [p, q, no p]  ==&amp;gt;  False&lt;br /&gt;
--    esCláusulaInsatisfacible [p, q, no r]  ==&amp;gt;  False&lt;br /&gt;
--    esCláusulaInsatisfacible []            ==&amp;gt;  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esCláusulaInsatisfacible :: Cláusula -&amp;gt; Bool&lt;br /&gt;
esCláusulaInsatisfacible c = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 17: Definir la función&lt;br /&gt;
--    esCláusulaSatisfacible :: Cláusula -&amp;gt; Bool&lt;br /&gt;
-- tal que (esCláusulaSatisfacible c) se verifica si la cláusula c es&lt;br /&gt;
-- satisfacible. Por ejemplo, &lt;br /&gt;
--    esCláusulaSatisfacible [p, q, no p]  ==&amp;gt;  True&lt;br /&gt;
--    esCláusulaSatisfacible [p, q, no r]  ==&amp;gt;  True&lt;br /&gt;
--    esCláusulaSatisfacible []  ==&amp;gt;  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esCláusulaSatisfacible :: Cláusula -&amp;gt; Bool&lt;br /&gt;
esCláusulaSatisfacible c = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Conjuntos válidos, consistentes e inconsistentes de cláusulas      --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 18: Definir la función&lt;br /&gt;
--    esConjuntoVálidoDeCláusulas :: [Cláusula] -&amp;gt; Bool&lt;br /&gt;
-- tal que (esConjuntoVálidoDeCláusulas s) se verifica si el conjunto de&lt;br /&gt;
-- cláusulas s es válido. Por ejemplo,&lt;br /&gt;
--    esConjuntoVálidoDeCláusulas [[no p, q], [no q, p]]  ==&amp;gt;  False&lt;br /&gt;
--    esConjuntoVálidoDeCláusulas [[no p, p], [no q, q]]  ==&amp;gt;  True&lt;br /&gt;
--    esConjuntoVálidoDeCláusulas []                      ==&amp;gt;  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esConjuntoVálidoDeCláusulas :: [Cláusula] -&amp;gt; Bool&lt;br /&gt;
esConjuntoVálidoDeCláusulas s = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 19: Definir la función&lt;br /&gt;
--    esConjuntoConsistenteDeCláusulas :: [Cláusula] -&amp;gt; Bool&lt;br /&gt;
-- tal que (esConjuntoConsistenteDeCláusulas s) se verifica si el&lt;br /&gt;
-- conjunto de cláusulas s es consistente. Por ejemplo,&lt;br /&gt;
--    esConjuntoConsistenteDeCláusulas [[no p, q], [no q, p]]  ==&amp;gt;  True&lt;br /&gt;
--    esConjuntoConsistenteDeCláusulas [[no p, p], [no q, q]]  ==&amp;gt;  True&lt;br /&gt;
--    esConjuntoConsistenteDeCláusulas []                      ==&amp;gt;  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esConjuntoConsistenteDeCláusulas :: [Cláusula] -&amp;gt; Bool&lt;br /&gt;
esConjuntoConsistenteDeCláusulas s = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 20: Definir la función&lt;br /&gt;
--    esConjuntoInconsistenteDeCláusulas :: [Cláusula] -&amp;gt; Bool&lt;br /&gt;
-- tal que (esConjuntoInconsistenteDeCláusulas s) se verifica si el&lt;br /&gt;
-- conjunto de cláusulas s es consistente. Por ejemplo,&lt;br /&gt;
--    esConjuntoInconsistenteDeCláusulas [[no p,q],[no q,p]]  ==&amp;gt;  False&lt;br /&gt;
--    esConjuntoInconsistenteDeCláusulas [[no p],[p]]         ==&amp;gt;  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esConjuntoInconsistenteDeCláusulas :: [Cláusula] -&amp;gt; Bool&lt;br /&gt;
esConjuntoInconsistenteDeCláusulas s = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Validez de fórmulas mediante cláusulas                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 21: Definir la función&lt;br /&gt;
--    esVálidaPorCláusulas :: Prop -&amp;gt; Bool&lt;br /&gt;
-- tal que (esVálidaPorCláusulas f) se verifica si el conjunto de&lt;br /&gt;
-- cláusulas de f es válido. Por ejemplo,&lt;br /&gt;
--    esVálidaPorCláusulas (p --&amp;gt; q)                 ==&amp;gt;  False&lt;br /&gt;
--    esVálidaPorCláusulas (p --&amp;gt; p)                 ==&amp;gt;  True&lt;br /&gt;
--    esVálidaPorCláusulas ((p --&amp;gt; q) \/ (q --&amp;gt; p))  ==&amp;gt;  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esVálidaPorCláusulas :: Prop -&amp;gt; Bool&lt;br /&gt;
esVálidaPorCláusulas f = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Consecuencia mediante cláusulas                                    --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22: Definir la función&lt;br /&gt;
--    esConsecuenciaEntreCláusulas :: [Cláusula] -&amp;gt; [Cláusula] -&amp;gt; Bool&lt;br /&gt;
-- tal que (esConsecuenciaEntreCláusulas s1 s2) se verifica si todos los&lt;br /&gt;
-- modelos de s1 son modelos de s2. Por ejemplo,&lt;br /&gt;
--    esConsecuenciaEntreCláusulas [[no p,q],[no q,r]] [[no p,r]]  &lt;br /&gt;
--    ==&amp;gt; True&lt;br /&gt;
--    esConsecuenciaEntreCláusulas [[p]] [[p],[q]]                 &lt;br /&gt;
--    ==&amp;gt; False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esConsecuenciaEntreCláusulas :: [Cláusula] -&amp;gt; [Cláusula] -&amp;gt; Bool&lt;br /&gt;
esConsecuenciaEntreCláusulas s1 s2 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 23: Definir la función&lt;br /&gt;
--    esConsecuenciaPorCláusulas1 :: [Prop] -&amp;gt; Prop -&amp;gt; Bool&lt;br /&gt;
-- tal que (esConsecuenciaPorCláusulas s f) se verifica si las cláusulas&lt;br /&gt;
-- de f son consecuencias de las de s. Por ejemplo,&lt;br /&gt;
--    esConsecuenciaPorCláusulas [(p --&amp;gt; q), (q --&amp;gt; r)] (p --&amp;gt; r)&lt;br /&gt;
--    ==&amp;gt; True&lt;br /&gt;
--    esConsecuenciaPorCláusulas [p] (p /\ q)&lt;br /&gt;
--    ==&amp;gt; False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esConsecuenciaPorCláusulas :: [Prop] -&amp;gt; Prop -&amp;gt; Bool&lt;br /&gt;
esConsecuenciaPorCláusulas s f = undefined&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/LMF2013/index.php?title=Archivo:FormasNormales.hs&amp;diff=469</id>
		<title>Archivo:FormasNormales.hs</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:FormasNormales.hs&amp;diff=469"/>
		<updated>2013-05-02T09:03:57Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: subió una nueva versión de «Archivo:FormasNormales.hs»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Relaci%C3%B3n_9&amp;diff=468</id>
		<title>Relación 9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Relaci%C3%B3n_9&amp;diff=468"/>
		<updated>2013-05-02T09:03:47Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con &amp;#039;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt; -- FormasNormales.hs -- Formas normales. -- ---------------------------------------------------------------------  module FormasNormales where  -- ----...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- FormasNormales.hs&lt;br /&gt;
-- Formas normales.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
module FormasNormales where&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Librería suxiliares                                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import SintaxisSemantica &lt;br /&gt;
import Data.List&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Equivalencia lógica                                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1: Definir la función&lt;br /&gt;
--    esEquivalente :: Prop -&amp;gt; Prop -&amp;gt; Bool&lt;br /&gt;
-- tal que (esEquivalente f g) se verifica si f y g son&lt;br /&gt;
-- equivalentes. Por ejemplo,&lt;br /&gt;
--    esEquivalente (p &amp;lt;--&amp;gt; q) ((p --&amp;gt; q) /\ (q --&amp;gt; p))  ==&amp;gt;  True&lt;br /&gt;
--    esEquivalente (p --&amp;gt; q)  ((no p) \/ q)             ==&amp;gt;  True&lt;br /&gt;
--    esEquivalente (p /\ q)   (no ((no p) \/ (no q)))   ==&amp;gt;  True&lt;br /&gt;
--    esEquivalente (p \/ q)   (no ((no p) /\ (no q)))   ==&amp;gt;  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esEquivalente :: Prop -&amp;gt; Prop -&amp;gt; Bool&lt;br /&gt;
esEquivalente f g = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Transformación a forma normal negativa                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2: Definir la función&lt;br /&gt;
--    eliminaEquivalencias :: Prop -&amp;gt; Prop&lt;br /&gt;
-- tal que (eliminaEquivalencias f) es una fórmula equivalente a f sin&lt;br /&gt;
-- signos de equivalencia. Por ejemplo,&lt;br /&gt;
--    eliminaEquivalencias (p &amp;lt;--&amp;gt; q)&lt;br /&gt;
--    ==&amp;gt; ((p --&amp;gt; q) /\ (q --&amp;gt; p))&lt;br /&gt;
--    eliminaEquivalencias ((p &amp;lt;--&amp;gt; q) /\ (q &amp;lt;--&amp;gt; r))&lt;br /&gt;
--    ==&amp;gt; (((p --&amp;gt; q) /\ (q --&amp;gt; p)) /\ ((q --&amp;gt; r) /\ (r --&amp;gt; q)))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
eliminaEquivalencias :: Prop -&amp;gt; Prop&lt;br /&gt;
eliminaEquivalencias = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3: Definir la función&lt;br /&gt;
--    eliminaImplicaciones :: Prop -&amp;gt; Prop&lt;br /&gt;
-- tal que (eliminaImplicaciones f) es una fórmula equivalente a f sin&lt;br /&gt;
-- signos de implicación. Por ejemplo,&lt;br /&gt;
--    eliminaImplicaciones (p --&amp;gt; q)&lt;br /&gt;
--    ==&amp;gt; (no p \/ q)&lt;br /&gt;
--    eliminaImplicaciones (eliminaEquivalencias (p &amp;lt;--&amp;gt; q))&lt;br /&gt;
--    ==&amp;gt; ((no p \/ q) /\ (no q \/ p))&lt;br /&gt;
-- Nota: Se supone que f no tiene signos de equivalencia.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
eliminaImplicaciones :: Prop -&amp;gt; Prop&lt;br /&gt;
eliminaImplicaciones  = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4: Definir la función&lt;br /&gt;
--    interiorizaNegación :: Prop -&amp;gt; Prop&lt;br /&gt;
-- tal que (interiorizaNegación f) es una fórmula equivalente a f donde&lt;br /&gt;
-- las negaciones se aplican sólo a fórmulas atómicas. Por ejemplo,&lt;br /&gt;
--    interiorizaNegación (no (no p))         ==&amp;gt;  p&lt;br /&gt;
--    interiorizaNegación (no (p /\ q))       ==&amp;gt;  (no p \/ no q)&lt;br /&gt;
--    interiorizaNegación (no (p \/ q))       ==&amp;gt;  (no p /\ no q)&lt;br /&gt;
--    interiorizaNegación (no (no (p \/ q)))  ==&amp;gt;  (p \/ q)&lt;br /&gt;
--    interiorizaNegación (no ((no p) \/ q))  ==&amp;gt;  (p /\ no q)&lt;br /&gt;
-- Nota: Se supone que f no tiene equivalencias ni implicaciones. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
interiorizaNegación :: Prop -&amp;gt; Prop&lt;br /&gt;
interiorizaNegación = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5: Definir la función&lt;br /&gt;
--    formaNormalNegativa :: Prop -&amp;gt; Prop&lt;br /&gt;
-- tal que (formaNormalNegativa f) es una fórmula equivalente a f en&lt;br /&gt;
-- forma normal negativa. Por ejemplo,&lt;br /&gt;
--    formaNormalNegativa (p &amp;lt;--&amp;gt; q)&lt;br /&gt;
--    ==&amp;gt; ((no p \/ q) /\ (no q \/ p))&lt;br /&gt;
--    formaNormalNegativa ((p \/ (no q)) --&amp;gt; r)&lt;br /&gt;
--    ==&amp;gt; ((no p /\ q) \/ r)&lt;br /&gt;
--    formaNormalNegativa ((p /\ (q --&amp;gt; r)) --&amp;gt; s)&lt;br /&gt;
--    ==&amp;gt; ((no p \/ (q /\ no r)) \/ s)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
formaNormalNegativa :: Prop -&amp;gt; Prop&lt;br /&gt;
formaNormalNegativa f = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Literales                                                          --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6: Definir la función&lt;br /&gt;
--    literal :: Prop -&amp;gt; Bool&lt;br /&gt;
-- tal que (literal f) se verifica si la fórmula F es un literal. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    literal p               ==&amp;gt;  True&lt;br /&gt;
--    literal (no p)          ==&amp;gt;  True&lt;br /&gt;
--    literal (no (p --&amp;gt; q))  ==&amp;gt;  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
literal :: Prop -&amp;gt; Bool&lt;br /&gt;
literal = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7: Definir el tipo de dato Literal como sinónimo de&lt;br /&gt;
-- fórmula. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
type Literal = Prop&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8: Definir la función&lt;br /&gt;
--    complementario :: Literal -&amp;gt; Literal&lt;br /&gt;
-- tal que (complementario l) es el complementario de l. Por ejemplo,&lt;br /&gt;
--    complementario p       ==&amp;gt;  no p&lt;br /&gt;
--    complementario (no p)  ==&amp;gt;  p&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
complementario :: Literal -&amp;gt; Literal&lt;br /&gt;
complementario = undefined &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9: Definir la función&lt;br /&gt;
--    literalesFórmulaFNN :: Prop -&amp;gt; [Literal]&lt;br /&gt;
-- tal que (literalesFórmulaFNN f) es el conjunto de los literales de la&lt;br /&gt;
-- fórmula en forma normal negativa f.&lt;br /&gt;
--    literalesFórmulaFNN (p \/ ((no q) \/ r))  ==&amp;gt;  [p,no q,r]&lt;br /&gt;
--    literalesFórmulaFNN p                     ==&amp;gt;  [p]&lt;br /&gt;
--    literalesFórmulaFNN (no p)                ==&amp;gt;  [no p]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
literalesFórmulaFNN :: Prop -&amp;gt; [Literal]&lt;br /&gt;
literalesFórmulaFNN = undefined &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Transformación a forma normal conjuntiva                           --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10: Definir la función&lt;br /&gt;
--    interiorizaDisyunción :: Prop -&amp;gt; Prop&lt;br /&gt;
-- tal que (interiorizaDisyunción f) es una fórmula equivalente a f&lt;br /&gt;
-- donde las disyunciones sólo se aplica a disyunciones o literales. Por&lt;br /&gt;
-- ejemplo,  &lt;br /&gt;
--    interiorizaDisyunción (p \/ (q /\ r))  ==&amp;gt;  ((p \/ q) /\ (p \/ r))&lt;br /&gt;
--    interiorizaDisyunción ((p /\ q) \/ r)  ==&amp;gt;  ((p \/ r) /\ (q \/ r))&lt;br /&gt;
-- Nota: Se supone que f está en forma normal negativa.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
interiorizaDisyunción :: Prop -&amp;gt; Prop&lt;br /&gt;
interiorizaDisyunción = undefined &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11: Definir la función&lt;br /&gt;
--    formaNormalConjuntiva :: Prop -&amp;gt; Prop&lt;br /&gt;
-- tal que (formaNormalConjuntiva f) es una fórmula equivalente a f en&lt;br /&gt;
-- forma normal conjuntiva. Por ejemplo,&lt;br /&gt;
--    formaNormalConjuntiva (p /\ (q --&amp;gt; r))&lt;br /&gt;
--    ==&amp;gt; (p /\ (no q \/ r))&lt;br /&gt;
--    formaNormalConjuntiva (no (p /\ (q --&amp;gt; r)))&lt;br /&gt;
--    ==&amp;gt; ((no p \/ q) /\ (no p \/ no r))&lt;br /&gt;
--    formaNormalConjuntiva (no(p &amp;lt;--&amp;gt; r))&lt;br /&gt;
--    ==&amp;gt; (((p \/ r) /\ (p \/ no p)) /\ ((no r \/ r) /\ (no r \/ no p)))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
formaNormalConjuntiva :: Prop -&amp;gt; Prop&lt;br /&gt;
formaNormalConjuntiva f = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Ejercicio 11.2: validaPorFNC&lt;br /&gt;
&lt;br /&gt;
validaPorFNC:: Prop -&amp;gt; Bool&lt;br /&gt;
validaPorFNC = undefined&lt;br /&gt;
&lt;br /&gt;
-- validaPorFNC ((p --&amp;gt; q) \/ (q --&amp;gt; p))    == True&lt;br /&gt;
-- validaPorFNC ((p \/ q) /\ ((no q) \/ r)) == False&lt;br /&gt;
-- validaPorFNC (p --&amp;gt; p)                   == True&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Transformación a forma normal disyuntiva                           --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12: Definir la función&lt;br /&gt;
--    interiorizaConjunción :: Prop -&amp;gt; Prop&lt;br /&gt;
-- tal que (interiorizaConjunción f) es una fórmula equivalente a f&lt;br /&gt;
-- donde las conjunciones sólo se aplica a conjunciones o literales. Por&lt;br /&gt;
-- ejemplo,  &lt;br /&gt;
--    interiorizaConjunción (p /\ (q \/ r))  ==&amp;gt;  ((p /\ q) \/ (p /\ r))&lt;br /&gt;
--    interiorizaConjunción ((p \/ q) /\ r)  ==&amp;gt;  ((p /\ r) \/ (q /\ r))&lt;br /&gt;
-- Nota: Se supone que f está en forma normal negativa.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
interiorizaConjunción :: Prop -&amp;gt; Prop&lt;br /&gt;
interiorizaConjunción = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13: Definir la función&lt;br /&gt;
--    formaNormalDisyuntiva :: Prop -&amp;gt; Prop&lt;br /&gt;
-- tal que (formaNormalDisyuntiva f) es una fórmula equivalente a f en&lt;br /&gt;
-- forma normal disyuntiva. Por ejemplo,&lt;br /&gt;
--    formaNormalDisyuntiva (p /\ (q --&amp;gt; r))&lt;br /&gt;
--    ==&amp;gt; ((p /\ no q) \/ (p /\ r))&lt;br /&gt;
--    formaNormalDisyuntiva (no (p /\ (q --&amp;gt; r)))&lt;br /&gt;
--    ==&amp;gt; (no p \/ (q /\ no r))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
formaNormalDisyuntiva :: Prop -&amp;gt; Prop&lt;br /&gt;
formaNormalDisyuntiva f = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Ejercicio 13.2: satisfaciblePorFND&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
satisfaciblePorFND:: Prop -&amp;gt; Bool&lt;br /&gt;
satisfaciblePorFND f = undefined&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- satisfaciblePorFND ((p \/ q) /\ ((no q) \/ r)) == True&lt;br /&gt;
-- satisfaciblePorFND (p /\ (no p))               == False&lt;br /&gt;
-- satisfaciblePorFND ((p --&amp;gt; q) \/ (q --&amp;gt; p))    == True&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/LMF2013/index.php?title=Archivo:ResolucionProposicional.hs&amp;diff=467</id>
		<title>Archivo:ResolucionProposicional.hs</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:ResolucionProposicional.hs&amp;diff=467"/>
		<updated>2013-05-02T08:55:57Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:Clausulas.hs&amp;diff=466</id>
		<title>Archivo:Clausulas.hs</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:Clausulas.hs&amp;diff=466"/>
		<updated>2013-05-02T08:55:41Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:FormasNormales.hs&amp;diff=465</id>
		<title>Archivo:FormasNormales.hs</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=Archivo:FormasNormales.hs&amp;diff=465"/>
		<updated>2013-05-02T08:55:24Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=464</id>
		<title>Lógica matemática y fundamentos</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=L%C3%B3gica_matem%C3%A1tica_y_fundamentos&amp;diff=464"/>
		<updated>2013-05-02T08:54:48Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios y sus soluciones colaborativas.&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Iniciación a la programación con Haskell ([[Media:Rel_1.hs |Enunciado]] y [[Relación 1 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Sintaxis y semántica de la lógica proposicional en Haskell. ([[Media:Rel_2.hs |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 proposicional con Isabelle/HOL. ([[Rel_3 |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;: Argumentación proposicional con Isabelle/HOL. ([[Rel_4 |Enunciado]] y [[Relación 4 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de conectivas. ([[Rel_5 |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;: Formalización de argumentos en lógica de primer orden. ([[Rel_6 |Enunciado]] y [[Relación 6 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Deducción natural en lógica de primer con Isabelle/HOL. ([[Rel_7 |Enunciado]] y [[Relación 7 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Tableros semánticos proposicionales en Haskell. ([[Media:Rel_8.hs |Enunciado]] y [[Relación 8 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Formas normales en lógica proposicional en Haskell ([[Media:FormasNormales.hs |Enunciado]] y [[Relación 9 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Cláusulas proposicionales en Haskell. ([[Media:Clausulas.hs |Enunciado]] y [[Relación 10 |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Resolución proposicional en Haskell. ([[Media:ResolucionProposicional.hs |Enunciado]] y [[Relación 11 |Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
=== Teorías Isabelle/HOL de los temas de deducción natural ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 2&amp;#039;&amp;#039;&amp;#039;: [[Tema 2 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tema 8&amp;#039;&amp;#039;&amp;#039;: [[Tema 8 | Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
&lt;br /&gt;
=== Ejercicios evaluables ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 1&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 1 | Deducción natural en lógica proposicional con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 2&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 2 |Deducción natural en lógica de primer orden con Isabelle/HOL]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nota al ejercicio 2&amp;#039;&amp;#039;&amp;#039;: los lemas auxiliares que se usen en una demostración por deducción natural han de ser probados de forma no automática. Se amplía el plazo hasta el viernes 3 de mayo para que se envíe el ejercicio 2 teniendo en cuenta esta aclaración.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicio 3&amp;#039;&amp;#039;&amp;#039;: [[Ejercicio 3 |Argumentación, deducción natural en lógica de primer orden con Isabelle/HOL y tableros semánticos]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Problemas semanales ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 1&amp;#039;&amp;#039;&amp;#039;: [[Problema 1 | Inducción sobre fórmulas]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Problema 2&amp;#039;&amp;#039;&amp;#039;: [[Problema 2 | Subconjuntos inconsistentes]].&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2013/index.php?title=E3&amp;diff=450</id>
		<title>E3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2013/index.php?title=E3&amp;diff=450"/>
		<updated>2013-04-26T10:44:25Z</updated>

		<summary type="html">&lt;p&gt;Mjoseh: Página creada con &amp;#039;&amp;lt;source lang = &amp;quot;isar&amp;quot;&amp;gt;  header {* E3: Argumentación y Deducción natural en lógica de primer orden *}  theory E3 imports Main  begin  text {* Ej. 1: Los perros lobos y los ter...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = &amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
header {* E3: Argumentación y Deducción natural en lógica de primer orden *}&lt;br /&gt;
&lt;br /&gt;
theory E3&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 1: Los perros lobos y los terrier son perros cazadores. Los&lt;br /&gt;
  perros cazadores y los perros falderos son animales domesticados. Los&lt;br /&gt;
  animales domesticados son mansos y útiles. Algunos perros lobos no son&lt;br /&gt;
  ni mansos ni pequeños.  &lt;br /&gt;
  (a) Demostrar que algunos terrier son pequeños pero no son mansos.  &lt;br /&gt;
  (b) ¿Seguiría siendo cierta la conclusión si ningún perro lobo fuera&lt;br /&gt;
      manso? &lt;br /&gt;
&lt;br /&gt;
  Simbología: L(x): x es perro lobo, T(x): x es terrier, C(x): x es&lt;br /&gt;
  cazador, F(x): x es perro faldero, M(x): x es manso, U(x): x es útil,&lt;br /&gt;
  P(x): x es pequeño, D(x): x es doméstico). *}&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 2: Todo pasajero viaja en primera o en clase turista. Cada&lt;br /&gt;
  pasajero está en clase turista si y sólo si no es rico. Algunos&lt;br /&gt;
  pasajeros son ricos. No todos los pasajeros son ricos.  &lt;br /&gt;
  (a) Demostrar que algunos pasajeros viajan en clase turista.  &lt;br /&gt;
  (b) Si ningún pasajero fuera rico, viajaría alguno en primera?. &lt;br /&gt;
  &lt;br /&gt;
  Simbología: P(x): x es pasajero, T(x): x viaja en clase turista, &lt;br /&gt;
  Pr(x): x viaja en primera, R(x): x es rico. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 3: Las abejas y las avispas pican si están enojadas o&lt;br /&gt;
  asustadas. &lt;br /&gt;
  (a) Luego, cualquier abeja pica si está enojada.&lt;br /&gt;
  (b) Si hay alguna abeja, ¿es cierto que alguna no pica?  &lt;br /&gt;
&lt;br /&gt;
  Simbología: Ab(x): x es abeja, Av(x): x es avispa, A(x): x está asustada, &lt;br /&gt;
  E(x): x está enojada, P(x): x pica. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 4: Cualquier autor tiene éxito si y sólo si es muy&lt;br /&gt;
  leído. Todos los autores son intelectuales. Algunos autores tiene&lt;br /&gt;
  éxito pero no son muy leidos. &lt;br /&gt;
  (a) Demostrar todos los intelectuales son autores. &lt;br /&gt;
  (b) ¿Seguiría siendo cierta la conclusión si ningún autor tuviera éxito?. &lt;br /&gt;
&lt;br /&gt;
  Simbología: A(x): x es autor, E(x): x tiene éxito, L(x): x es muy leído, &lt;br /&gt;
  I(x): x es intelectual. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 5: Vender un arma no registrada es un crimen. Todas las&lt;br /&gt;
  armas que posee Rojo se las compró al Zurdo o al Tuerto. Una de las&lt;br /&gt;
  armas de Rojo es una pistola no registrada. Rojo nunca le compró nada&lt;br /&gt;
  al Tuerto,&lt;br /&gt;
  (a) Demostrar que el Zurdo es un criminal. &lt;br /&gt;
  (b) ¿Es también un criminal el Tuerto? &lt;br /&gt;
&lt;br /&gt;
  Simbología: R(x): x está registrada, P(x): x es una pistola, &lt;br /&gt;
  C(x): x es un criminal, A(x): x es un arma, T(x,y): x posee y,&lt;br /&gt;
  V(x,y,z): x vendió y a z, r: Rojo, z: el Zurdo, t: el Tuerto. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 6: Todo lo que hay en mi escritorio es una obra&lt;br /&gt;
  maestra. Quienquiera que escriba una obra maestra es un genio. Alguna &lt;br /&gt;
  persona desconocida escribió alguna de las novelas que hay en mi&lt;br /&gt;
  escritorio.&lt;br /&gt;
  (a) Demostrar que  alguna persona desconocida es un genio. &lt;br /&gt;
  (b) ¿Son genios todas las personas desconocidas? &lt;br /&gt;
&lt;br /&gt;
  Simbología: E(x): x está en mi escritorio, M(x): x es una obra &lt;br /&gt;
  maestra, P(x): x es una persona, G(x): x es un genio, D(x): x es &lt;br /&gt;
  desconocido, N(x): x es una novela, Es(x,y): x escribió y. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 7: Nadie respeta a una persona que no se respeta a sí&lt;br /&gt;
  misma. Nadie contratará a una persona que no se respeta. &lt;br /&gt;
  (a) Demostrar que una persona que no respeta a nadie nunca será&lt;br /&gt;
      contratada por nadie. &lt;br /&gt;
  (b) Y, si respeta a alguién, ¿podrá ser contratada?. &lt;br /&gt;
&lt;br /&gt;
  Simbología: P(x): x es una persona, R(x,y): x respeta a y,&lt;br /&gt;
  C(x,y): x contrata a y. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 8: Todo libro que sea aprobado por todos los críticos será leído&lt;br /&gt;
  por cualquier persona literata. Cualquiera que lea cualquier cosa hablará de&lt;br /&gt;
  ella. Un crítico aprobará cualquier libro escrito por cualquier persona que&lt;br /&gt;
  le adule. Los literatos y los críticos son personas. Sólo las personas se&lt;br /&gt;
  adulan. Nada es a la vez libro y persona. &lt;br /&gt;
  (a) Demostrar que  si alguien adula a todos los críticos, entonces cualquier &lt;br /&gt;
  libro que escriba será comentado por todas las personas literatas. &lt;br /&gt;
  (b) ¿Es cierto el recíproco? &lt;br /&gt;
&lt;br /&gt;
  Simbología: Li(x): x es libro, Cr(x): x es un crítico, T(x): x es un literato, &lt;br /&gt;
  P(x): x es una persona, A(x,y): x aprueba y, L(x,y): x lee y, C(x,y): x comenta y, &lt;br /&gt;
  F(x,y): x adula y, E(x,y): x escribe y. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 9: Hay un profesor que agrada a todos los estudiantes a los que&lt;br /&gt;
  agrada al menos un profesor. A todo estudiante le agrada uno u otro&lt;br /&gt;
  profesor. &lt;br /&gt;
  (a) Demostrar que hay un profesor que agrada a todos los estudiantes. &lt;br /&gt;
  (b) ¿Hay un profesor que no agrade a ningún estudiante? &lt;br /&gt;
&lt;br /&gt;
  Simbología: P(x): x es un profesor, E(x): x es estudiante, A(x,y): &lt;br /&gt;
  a x le agrada y. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 10: Una obra de arte que relata algo puede ser comprendida por&lt;br /&gt;
  todos. Algunas obras de arte religioso han sido creadas por grandes&lt;br /&gt;
  artistas. Cualquier obra de arte religioso relata una historia que&lt;br /&gt;
  inspira. Sólo las personas admiran algo. &lt;br /&gt;
  (a) Demostrar que si algunas personas sólo admiran lo que no pueden &lt;br /&gt;
      entender, entonces algunas creaciones de grandes artistas no serán &lt;br /&gt;
      admiradas por todos. &lt;br /&gt;
  (b) ¿Es cierto el recíproco?&lt;br /&gt;
&lt;br /&gt;
  Simbología: P(x): x es persona, Ar(x): x es un gran artista, H(x): x es &lt;br /&gt;
  una historia, I(x): x inspira, Re(x): x es religioso, Ob(x): x es una &lt;br /&gt;
  obra de arte, C(x,y): x crea y, A(x,y): x admira y, R(x,y): x relata y, &lt;br /&gt;
  E(x,y): x puede entender y. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 11: Si hay genios, entonces todos los grandes compositores son&lt;br /&gt;
  genios. Si alguien es temperamental, todos los genios son&lt;br /&gt;
  temperamentales. &lt;br /&gt;
  (a) Demostrar que si alguien es un genio temperamental, entonces&lt;br /&gt;
      todos los grandes compositores son temperamentales. &lt;br /&gt;
  (b) ¿Todos los genios son temperamentales? &lt;br /&gt;
  (c) ¿Existe algún genio temperamental? &lt;br /&gt;
&lt;br /&gt;
  Simbología: G(x): x es un genio, C(x): x es un gran compositor, &lt;br /&gt;
  P(x): x es una persona, T(x): x es temperamental. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 12: Cualquier hombre de negocios que sea un poeta debe ser&lt;br /&gt;
  rico. Todos los hombres ricos son conservadores. Si algún conservador no ama&lt;br /&gt;
  la poesía entonces ningún poeta es conservador. &lt;br /&gt;
  (a) Demostrar que si hay algún  hombre rico que no ama la poesía, entonces &lt;br /&gt;
      ningún hombre de negocios es poeta. &lt;br /&gt;
  (b) En el caso de que exista algún hombre rico, ¿alguno no ama la poesía?&lt;br /&gt;
&lt;br /&gt;
  Simbología: N(x): x es un honbre de negocios, P(x): x es un poeta, R(x): x &lt;br /&gt;
  es un hombre rico, C(x): x es un conservador, A(x): x ama la poesía. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 13: Ningún testigo cuerdo mentiría si su mentira lo implicase en un&lt;br /&gt;
  crimen. &lt;br /&gt;
  (a) Demostrar que si cualquier testigo se implicara en un crimen,&lt;br /&gt;
      entonces, si todos los testigos fuesen cuerdos, ese testigo no mintió.&lt;br /&gt;
  (b) ¿La conclusión sería cierta si sólo alguno de los testigos fuesen cuerdos?&lt;br /&gt;
&lt;br /&gt;
  Simbología: C(x): x está cuerdo, T(x): x es un testigo, M(x): x miente, I(x):&lt;br /&gt;
  x se implica en un crimen. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 14: Si falta una joya, será devuelta si todos los&lt;br /&gt;
  sirvientes son honestos. Si algún sirviente es honesto, todos lo&lt;br /&gt;
  son.&lt;br /&gt;
  (a) Demostrar que si falta alguna joya, entonces si al menos un &lt;br /&gt;
      sirviente es honesto, será devuelta. &lt;br /&gt;
  (b) ¿Podemos asegurar que si hay un sirviente deshonesto, la joya no&lt;br /&gt;
      será devuelta? &lt;br /&gt;
&lt;br /&gt;
  Simbología: J(x): x es una joya, F(x): x falta,&lt;br /&gt;
              S(x): x es un sirviente, H(x): x es honesto, &lt;br /&gt;
              D(x): x será devuelta. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 15: Quienquiera que apoye a Santi votará por Juan. Andrés no votará&lt;br /&gt;
  por nadie que no sea amigo de Pedro. Ningún amigo de Félix tiene como amigo a&lt;br /&gt;
  Juan. La relación de amistad es simétrica. &lt;br /&gt;
  (a) Demostrar que si Pedro es un amigo de Félix, Andrés no apoyará a Santi. &lt;br /&gt;
  (b) ¿Es cierto el recíproco? &lt;br /&gt;
&lt;br /&gt;
  Simbología: A(x,y): x apoya a y, V(x,y): x vota por y, G(x,y): x es amigo &lt;br /&gt;
  de y, a: Andrés, s: Santi, j: Juan, p: Pedro, f: Félix. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 16: Cualquier caballo es más veloz que cualquier&lt;br /&gt;
  perro. Algunos galgos son más veloces que cualquier liebre. Los&lt;br /&gt;
  galgos son perros. La relación de ser más veloz es transitiva.&lt;br /&gt;
  (a)  Demostrar que cualquier caballo es más veloz que cualquier liebre. &lt;br /&gt;
  (b) ¿Es cierto que cualquier galgo es más veloz que cualquier liebre?&lt;br /&gt;
&lt;br /&gt;
  Simbología: P(x): x es perro, G(x): x es galgo, L(x): x es liebre, &lt;br /&gt;
              C(x): x es caballo, V(x,y): x es más veloz que y. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 17: Existe un hombre al que todos desprecian. &lt;br /&gt;
   (a) Demostrar que existe al menos un hombre que se desprecia a sí mismo. &lt;br /&gt;
   (b) ¿La conclusión sería cierta en el caso de que sólo supiéramos que &lt;br /&gt;
       existe un hombre al que algunos desprecian? &lt;br /&gt;
&lt;br /&gt;
  Simbología: H(x): x es hombre, D(x,y): x desprecia a y. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 18: Cualquiera que haya visitado el edificio ha sido&lt;br /&gt;
  observado. Todo el que haya observado a Andrés tendría que&lt;br /&gt;
  recordarle. Nadie recuerda a Andrés. &lt;br /&gt;
  (a) Demostrar que Andrés no visitó el edificio. &lt;br /&gt;
  (b) ¿La conclusión sería cierta en el caso de que alguien no &lt;br /&gt;
      recordara a Andrés? &lt;br /&gt;
&lt;br /&gt;
  Simbología: a: Andrés, V(x): x vistó el edificio, &lt;br /&gt;
                 Ob(x,y): x observó a y, R(x,y): x recuerda a y. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 19: Si todas las medicinas están contaminadas, entonces todos los&lt;br /&gt;
  técnicos negligentes son unos bribones. Si hay medicinas contaminadas,&lt;br /&gt;
  entonces todas las medicinas están contaminadas y son peligrosas. Todos los&lt;br /&gt;
  germicidas son medicinas. Sólo los negligentes son distraídos. &lt;br /&gt;
  (a) Demostrar que si cualquier técnico es distraído y si algunos germicidas &lt;br /&gt;
      están contaminados, los técnicos son bribones. &lt;br /&gt;
  (b) ¿Podemos asegurar lo mismo en el caso de que sólo supiéramos que hay&lt;br /&gt;
      técnicos distraídos?&lt;br /&gt;
&lt;br /&gt;
  Simbología: 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. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 20: 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 elegido&lt;br /&gt;
  hace una buena campaña.&lt;br /&gt;
  (a) Demostrar que todo individuo que se postula será elegido si y&lt;br /&gt;
      sólo si hace una buena campaña. &lt;br /&gt;
  (b) Si algún individuo se postula, ¿habrá candidatos que no sean&lt;br /&gt;
      elegidos?&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;
text {* Ej. 21: Todos los miembros son oficiales y caballerosos. Todos los&lt;br /&gt;
  oficiales son combatientes. Los caballeros y los no combatientes son&lt;br /&gt;
  pacifistas. Ningún pacifista es caballero si éste es combatiente. Algunos&lt;br /&gt;
  miembros son combatientes si y sólo si son oficiales. &lt;br /&gt;
  (a) Demostrar que no todos los miembros son combatientes. &lt;br /&gt;
  (b) ¿Podemos asegurar lo mismo en el caso de que no todos los miembros &lt;br /&gt;
  sean oficiales y caballerosos?&lt;br /&gt;
&lt;br /&gt;
  Simbología: M(x): x es miembro, Of(x): x es oficial, C(x): x es caballero, &lt;br /&gt;
  Co(x): x es combatiente, P(x): x es pacifista. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 22: Si hay liberales, todos los filósofos son liberales. Si hay&lt;br /&gt;
  humanistas, todos los liberales son humanistas. &lt;br /&gt;
  (a) Demostrar que si hay humanistas que sean liberales, entonces todos los &lt;br /&gt;
      filósofos son humanistas. &lt;br /&gt;
  (b) ¿Todos los liberales son humanistas &lt;br /&gt;
  (c) ¿Existe algún liberal humanista? &lt;br /&gt;
&lt;br /&gt;
  Simbología: L(x): x es liberal, F(x): x es filósofo, H(x): x es humanista. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 23: Si algo se pierde, se sabrá que se ha perdido si cada&lt;br /&gt;
  cual aprecia sus pertenencias. Si alguien aprecia sus pertenencias,&lt;br /&gt;
  todos las aprecian.&lt;br /&gt;
  (a) Demostrar que si algo se pierde, entonces, si alguien aprecia &lt;br /&gt;
      sus pertenencias, se sabrá que algo se ha perdido.&lt;br /&gt;
  (b) ¿Podemos asegurar que si alguien no aprecia sus pertenencias,&lt;br /&gt;
      no se sabrá que algo se ha perdido?&lt;br /&gt;
&lt;br /&gt;
  Simbología: P(x): x es una persona, Per(x): x se ha perdido, A(x): x&lt;br /&gt;
  aprecia sus pertenencias, S(x): se sabrá que x se ha perdido. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 24: Todos los que pertenecen al Club de la Playa tienen&lt;br /&gt;
  más dinero que cualquier miembro del Club del Campo. No todos los&lt;br /&gt;
  miembros del cub de la Playa tiene más dinero que cualquiera que no&lt;br /&gt;
  pertenezca al mismo. &lt;br /&gt;
  (a) Demostrar que no todos pertenecen a alguno de los dos clubes.&lt;br /&gt;
  (b) ¿Es cierto que hay algún miembro del Club de la Playa que tiene&lt;br /&gt;
      más dinero que algún miembro del Club del campo?&lt;br /&gt;
&lt;br /&gt;
  Simbología: P(x): x es una persona, CP(x): x pertenece al club de&lt;br /&gt;
  la playa, CC(x): x pertenece al Club del campo, D(x,y): x tiene más&lt;br /&gt;
  dinero que y. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 25: Quien ama apasionadamente acaba siendo desgraciado;&lt;br /&gt;
  quienes no pueden ocultar su pasión mueren prematuramente. &lt;br /&gt;
  (a) Demostrar que si todos aquellos que acaban siendo desgraciados no&lt;br /&gt;
      pueden ocultar su pasión, entonces, todos aquellos que amen de&lt;br /&gt;
      forma apasionada mueren prematuramente. &lt;br /&gt;
  (b) ¿Es cierto el recíproco?&lt;br /&gt;
  &lt;br /&gt;
  Simbologia: A(x): x ama, P(x): x es apasionado, D(x): x es desgraciado,&lt;br /&gt;
  Oc(x): x oculta la pasión, M(x): x muere prematuramente.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 26: Cualquier automóvil que tenga buenos frenos es seguro para el&lt;br /&gt;
  conductor y seguro para los pasajeros. &lt;br /&gt;
  (a) Demostrar que si un automóvil es nuevo, entonces, si todos los &lt;br /&gt;
      automóviles nuevos tienen buenos frenos, es seguro para el conductor.&lt;br /&gt;
  (b) ¿Podemos asegurar que todos los automóviles nuevos son seguros para &lt;br /&gt;
      los pasajeros? &lt;br /&gt;
&lt;br /&gt;
  Simbología: A(x): x es un automóvil, F(x): x tiene buenos frenos,&lt;br /&gt;
  C(x): x es seguro para el conductor, P(x): x es seguro para los pasajeros,&lt;br /&gt;
  N(x): x es nuevo. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 27: Todo ejecutivo que sea poeta es un hombre&lt;br /&gt;
  imaginativo. Todo hombre imaginativo es amante del riesgo. Si todo&lt;br /&gt;
  amante del riesgo no es poeta, entonces, ningún poeta es amante del&lt;br /&gt;
  riesgo. &lt;br /&gt;
  (a) Demostrar que si todo hombre imaginativo no es poeta, entonces, &lt;br /&gt;
      ningún ejecutivo es poeta. &lt;br /&gt;
  (b) ¿Es cierto el recíproco?&lt;br /&gt;
&lt;br /&gt;
  Simbología: E(x): x es ejecutivo, P(x): x es poeta, I(x): x es imaginativo, &lt;br /&gt;
  R(x): x es amante del riesgo. *}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* Ej. 28: Las substancias radioactivas tienen vida corta o un&lt;br /&gt;
  valor medicinal. Ningún isótopo de Uranio que sea radioactivo tiene&lt;br /&gt;
  una vida corta. &lt;br /&gt;
  (a) Demostrar que si todos los isótopos de uranio son radioactivos, &lt;br /&gt;
      entonces, todos los isótopos de uranio tienen un valor medicinal.&lt;br /&gt;
  (b) ¿Es cierto el recíproco?&lt;br /&gt;
&lt;br /&gt;
  Simbología: R(x): x es sustancia radioactiva, C(x): x tiene una vida&lt;br /&gt;
  corta, M(x): x tiene valor medicinal, I(x): x es isótopo del Uranio. *}&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>
</feed>