<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/WIKIS/I1M2021G2/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mdelamor</id>
	<title>Informática de 1º de Matemáticas [Curso 2021-22, Grupo 2] - Contribuciones del usuario [es]</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/WIKIS/I1M2021G2/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mdelamor"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php/Especial:Contribuciones/Mdelamor"/>
	<updated>2026-07-19T09:57:38Z</updated>
	<subtitle>Contribuciones del usuario</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=597</id>
		<title>Informática (1º Matemáticas)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=597"/>
		<updated>2022-01-18T18:21:04Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: /* Relación de Ejercicios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==Relación de Ejercicios==&lt;br /&gt;
&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Definiciones por composición sobre números, listas y booleanos. [ [[Media:Rel_1.hs |Enunciado]], [[Relación 1 |Solución colaborativa]], [[Relación 1 Sol |Solución]]  ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Definiciones con condicionales, guardas o patrones. [ [[Media:Rel_2.hs |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Relación 2 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión. [ [[Media:Rel_3.hs |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Relación 3 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión (extra). [ [[Media:Rel_4.hs |Enunciado]], [[Relación 4 |Solución colaborativa editada]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión con cadenas: El cifrado césar. [ [[Media:Rel_5.hs |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Relación 5 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión. [ [[Media:Rel_6.hs |Enunciado]], [[Relación 6 |Solución colaborativa]], [[Relación 6 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión y comprensión (extra). [ [[Media:Rel_7.hs |Enunciado]], [[Relación 7 |Solución colaborativa]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados (extra). [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Propiedades del número 2021. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10 |Solución colaborativa]], [[Relación 10 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Listas infinitas y evaluación perezosa. [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11 |Solución colaborativa]], [[Relación 11 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (I), Árboles binarios. [ [[Media:Rel_12.hs |Enunciado]], [[Relación 12|Solución colaborativa]], [[Relación 12 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (II), Árboles binarios, expresiones y árboles genéricos. [ [[Media:Rel_13.hs |Enunciado]], [[Relación 13|Solución colaborativa]], [[Relación 13 Sol |Solución ]] ]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: El algoritmo de Luhn. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones sobre cadenas. [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la programación funcional con listas infinitas. [ [[Media:Rel_14.hs |Enunciado]], [[Relación 14 colab|Solución colaborativa]], [[Relación 14|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: Ecuación con factoriales. [ [[Media:Rel_15.hs |Enunciado]], [[Relación 15 colab |Solución colaborativa]], [[Relación 15 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 16&amp;#039;&amp;#039;&amp;#039;: El juego del nim y las funciones de entrada/salida. [ [[Media:Rel_16.hs |Enunciado]], [[Relación 16 colab|Solución colaborativa]], [[Relación 16 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 17&amp;#039;&amp;#039;&amp;#039;: Cálculo del número pi mediante el método de Montecarlo. [ [[Media:Rel_17.hs |Enunciado]], [[Relación 17 |Solución colaborativa]], [[Rel 17 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 18&amp;#039;&amp;#039;&amp;#039;: Aproximaciones de pi. [ [[Media:Rel_18.hs |Enunciado]], [http://www.cs.us.es/~mjoseh/Digitos_de_pi.txt Fichero con los dígitos de pi], [[Relación 18 |Solución colaborativa]], [[Rel 18 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 19&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices. [ [[Media:Rel_19.hs |Enunciado]], [[Relación 19 |Solución colaborativa]], [[Relación 19 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Método de Gauss para triangularizar matrices. [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 |Solución colaborativa]], [[Relación 20 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 21&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices con librerías Data.Matrix y Data.Vector. [ [[Media:Rel_21.hs |Enunciado]], [[Relación 21 |Solución colaborativa]], [[Relación 21 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 22&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices: ejercicios de exámenes (para repasar). [ [[Media:Rel_22.hs |Enunciado]], [[Relación 22 |Solución colaborativa]], [[Relación 22 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 23&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_23.hs |Enunciado]], [[Relación 23 |Solución colaborativa]], [[Relación 23 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico (2): límites, bisección, integrales y bajada. [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva. [ [[Media:Rel_25.hs |Enunciado]], [[Relación 25 |Solución colaborativa]], [[Relación 25 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 26&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva con librerías (solucionada). [ [[Relación 26 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 27&amp;#039;&amp;#039;&amp;#039;: Combinatoria. [ [[Media:Rel_27.hs |Enunciado]], [[Relación 27 |Solución colaborativa]], [[Relación 27 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: El TAD de las pilas.  [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 |Solución colaborativa]], [[Relación 28 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de las colas.  [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 |Solución colaborativa]], [[Relación 29 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de conjuntos.  [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 colab |Solución colaborativa]], [[Relación 31 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 32&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. Regla de Ruffini. [ [[Media:Rel_32.hs |Enunciado]], [[Relación 32 colab |Solución colaborativa]], [[Relación 32 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g1.hs |Enunciado]], [[Exam 3g1 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g2.hs |Enunciado]], [[Exam 3g2 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de los montículos. Librería en https://cutt.ly/tbDyRlr [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Media:Relación_33_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Media:Relación_34_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería Data.Set. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 |Solución colaborativa]], [[Media:Relación_35_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 36&amp;#039;&amp;#039;&amp;#039;: Problemas básicos con el TAD de los grafos. [ [[Media:Rel_36.hs |Enunciado]], [[Relación 36 Colab |Solución colaborativa]], [[Media:Relación_36_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante listas. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica I&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_1.hs |Enunciado]], [[Programación dinámica I |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica II&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_2.hs |Enunciado]], [[Programación Dinámica II |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Grafos&amp;#039;&amp;#039;&amp;#039;: Ejercicios de examen sobre grafos. ([[Media:masgrafos.hs |Enunciado]], [[Grafos (Ej. examen) |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Técnica Divide y vencerás&amp;#039;&amp;#039;&amp;#039;: Puzzle. ([[Media:triomino.hs |Enunciado]], [[Triominos |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica III&amp;#039;&amp;#039;&amp;#039;: Ejercicios de programación dinámica. ([[Media:dinamica3_3.hs |Enunciado]], [[Programación Dinámica III |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso I&amp;#039;&amp;#039;&amp;#039;. ([[Media:Lychrel.hs |Enunciado]], [[Repaso I. Números de Lychrel |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso II: ejercicios de examen&amp;#039;&amp;#039;&amp;#039;. ([[Media:ejExamenes.hs |Enunciado]], [[Repaso II.  |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios Complementarios.&amp;#039;&amp;#039;&amp;#039;([[Media:ejcomplementarios.hs |Enunciado]], [[Ejercicios Complementarios|Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Más ejercicios de examen.&amp;#039;&amp;#039;&amp;#039;([[Media:ejExam.hs |Enunciado]], [[Ejercicios de examen|Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- MÁS EJERCICIOS DE OTROS AÑOS&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Ejercicios de exámenes sobre grafos. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 Colab |Solución colaborativa]], [[Relación 37 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~mjoseh/cursos/i1m-20/doc/manual-Data.Set.html Data.Set]. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Relación 34 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico en Maxima: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_25.mac |Enunciado]], [[Relación 25 |Solución colaborativa]] [[Relación 25 Sol |Solución]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/manual-Data.Set.html Data.Set] (erratas solucionadas). [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 colab |Solución colaborativa]], [[Relación 28 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: División y factorización de polinomios mediante la regla de Ruffini. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Caminos en una retícula. [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Apilamiento de barriles. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 |Solución colaborativa]], [[Relación 31 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante diccionarios. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 Colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de los multiconjuntos mediante diccionarios. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: El problema del granjero mediante búsqueda en espacio de estado. [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Relación 33 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Resolución de problemas mediante búsqueda en espacios de estados. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 colab |Solución colaborativa]], [[Relación 35 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados de repaso.  [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 colab |Solución colaborativa]] ]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Curso Actual==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 1&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(12/11/2021)&amp;#039;&amp;#039;: [ [[Media:Exam1_G2.hs |Enunciado]], [[Parcial 1 |Solución colaborativa]], [[Parcial 1 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 2&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(20/01/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 3&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(08/04/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 4&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(10/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 5&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(24/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Cursos Anteriores==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://github.com/jaalonso/Examenes_de_PF_con_Haskell/blob/master/README.org Repositorio de Exámenes]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Curso 2020/21 Grupo 2&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 11/12/20 |Examen 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(11/12/2020)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 16/02/21 |Examen 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(16/02/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 23/04/21 |Examen 3 Turno 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(23/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 28/04/21 |Examen 3 Turno 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(28/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 21/06/21 |Examen 4]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(21/06/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 05/07/2021 |Examen Julio]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(05/07/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 07/09/2021 |Examen Septiembre]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(07/09/2021)&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=594</id>
		<title>Informática (1º Matemáticas)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=594"/>
		<updated>2022-01-15T18:43:47Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: /* Relación de Ejercicios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==Relación de Ejercicios==&lt;br /&gt;
&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Definiciones por composición sobre números, listas y booleanos. [ [[Media:Rel_1.hs |Enunciado]], [[Relación 1 |Solución colaborativa]], [[Relación 1 Sol |Solución]]  ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Definiciones con condicionales, guardas o patrones. [ [[Media:Rel_2.hs |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Relación 2 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión. [ [[Media:Rel_3.hs |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Relación 3 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión (extra). [ [[Media:Rel_4.hs |Enunciado]], [[Relación 4 |Solución colaborativa editada]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión con cadenas: El cifrado césar. [ [[Media:Rel_5.hs |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Relación 5 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión. [ [[Media:Rel_6.hs |Enunciado]], [[Relación 6 |Solución colaborativa]], [[Relación 6 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión y comprensión (extra). [ [[Media:Rel_7.hs |Enunciado]], [[Relación 7 |Solución colaborativa]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados (extra). [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Propiedades del número 2021. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10 |Solución colaborativa]], [[Relación 10 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Listas infinitas y evaluación perezosa. [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11 |Solución colaborativa]], [[Relación 11 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (I), Árboles binarios. [ [[Media:Rel_12.hs |Enunciado]], [[Relación 12|Solución colaborativa]], [[Relación 12 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (II), Árboles binarios, expresiones y árboles genéricos. [ [[Media:Rel_13.hs |Enunciado]], [[Relación 13|Solución colaborativa]]&amp;lt;!--, [[Relación 13 Sol |Solución ]]--&amp;gt; ]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: El algoritmo de Luhn. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones sobre cadenas. [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la programación funcional con listas infinitas. [ [[Media:Rel_14.hs |Enunciado]], [[Relación 14 colab|Solución colaborativa]], [[Relación 14|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: Ecuación con factoriales. [ [[Media:Rel_15.hs |Enunciado]], [[Relación 15 colab |Solución colaborativa]], [[Relación 15 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 16&amp;#039;&amp;#039;&amp;#039;: El juego del nim y las funciones de entrada/salida. [ [[Media:Rel_16.hs |Enunciado]], [[Relación 16 colab|Solución colaborativa]], [[Relación 16 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 17&amp;#039;&amp;#039;&amp;#039;: Cálculo del número pi mediante el método de Montecarlo. [ [[Media:Rel_17.hs |Enunciado]], [[Relación 17 |Solución colaborativa]], [[Rel 17 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 18&amp;#039;&amp;#039;&amp;#039;: Aproximaciones de pi. [ [[Media:Rel_18.hs |Enunciado]], [http://www.cs.us.es/~mjoseh/Digitos_de_pi.txt Fichero con los dígitos de pi], [[Relación 18 |Solución colaborativa]], [[Rel 18 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 19&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices. [ [[Media:Rel_19.hs |Enunciado]], [[Relación 19 |Solución colaborativa]], [[Relación 19 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Método de Gauss para triangularizar matrices. [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 |Solución colaborativa]], [[Relación 20 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 21&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices con librerías Data.Matrix y Data.Vector. [ [[Media:Rel_21.hs |Enunciado]], [[Relación 21 |Solución colaborativa]], [[Relación 21 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 22&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices: ejercicios de exámenes (para repasar). [ [[Media:Rel_22.hs |Enunciado]], [[Relación 22 |Solución colaborativa]], [[Relación 22 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 23&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_23.hs |Enunciado]], [[Relación 23 |Solución colaborativa]], [[Relación 23 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico (2): límites, bisección, integrales y bajada. [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva. [ [[Media:Rel_25.hs |Enunciado]], [[Relación 25 |Solución colaborativa]], [[Relación 25 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 26&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva con librerías (solucionada). [ [[Relación 26 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 27&amp;#039;&amp;#039;&amp;#039;: Combinatoria. [ [[Media:Rel_27.hs |Enunciado]], [[Relación 27 |Solución colaborativa]], [[Relación 27 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: El TAD de las pilas.  [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 |Solución colaborativa]], [[Relación 28 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de las colas.  [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 |Solución colaborativa]], [[Relación 29 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de conjuntos.  [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 colab |Solución colaborativa]], [[Relación 31 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 32&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. Regla de Ruffini. [ [[Media:Rel_32.hs |Enunciado]], [[Relación 32 colab |Solución colaborativa]], [[Relación 32 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g1.hs |Enunciado]], [[Exam 3g1 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g2.hs |Enunciado]], [[Exam 3g2 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de los montículos. Librería en https://cutt.ly/tbDyRlr [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Media:Relación_33_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Media:Relación_34_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería Data.Set. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 |Solución colaborativa]], [[Media:Relación_35_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 36&amp;#039;&amp;#039;&amp;#039;: Problemas básicos con el TAD de los grafos. [ [[Media:Rel_36.hs |Enunciado]], [[Relación 36 Colab |Solución colaborativa]], [[Media:Relación_36_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante listas. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica I&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_1.hs |Enunciado]], [[Programación dinámica I |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica II&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_2.hs |Enunciado]], [[Programación Dinámica II |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Grafos&amp;#039;&amp;#039;&amp;#039;: Ejercicios de examen sobre grafos. ([[Media:masgrafos.hs |Enunciado]], [[Grafos (Ej. examen) |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Técnica Divide y vencerás&amp;#039;&amp;#039;&amp;#039;: Puzzle. ([[Media:triomino.hs |Enunciado]], [[Triominos |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica III&amp;#039;&amp;#039;&amp;#039;: Ejercicios de programación dinámica. ([[Media:dinamica3_3.hs |Enunciado]], [[Programación Dinámica III |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso I&amp;#039;&amp;#039;&amp;#039;. ([[Media:Lychrel.hs |Enunciado]], [[Repaso I. Números de Lychrel |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso II: ejercicios de examen&amp;#039;&amp;#039;&amp;#039;. ([[Media:ejExamenes.hs |Enunciado]], [[Repaso II.  |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios Complementarios.&amp;#039;&amp;#039;&amp;#039;([[Media:ejcomplementarios.hs |Enunciado]], [[Ejercicios Complementarios|Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Más ejercicios de examen.&amp;#039;&amp;#039;&amp;#039;([[Media:ejExam.hs |Enunciado]], [[Ejercicios de examen|Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- MÁS EJERCICIOS DE OTROS AÑOS&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Ejercicios de exámenes sobre grafos. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 Colab |Solución colaborativa]], [[Relación 37 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~mjoseh/cursos/i1m-20/doc/manual-Data.Set.html Data.Set]. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Relación 34 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico en Maxima: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_25.mac |Enunciado]], [[Relación 25 |Solución colaborativa]] [[Relación 25 Sol |Solución]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/manual-Data.Set.html Data.Set] (erratas solucionadas). [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 colab |Solución colaborativa]], [[Relación 28 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: División y factorización de polinomios mediante la regla de Ruffini. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Caminos en una retícula. [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Apilamiento de barriles. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 |Solución colaborativa]], [[Relación 31 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante diccionarios. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 Colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de los multiconjuntos mediante diccionarios. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: El problema del granjero mediante búsqueda en espacio de estado. [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Relación 33 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Resolución de problemas mediante búsqueda en espacios de estados. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 colab |Solución colaborativa]], [[Relación 35 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados de repaso.  [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 colab |Solución colaborativa]] ]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Curso Actual==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 1&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(12/11/2021)&amp;#039;&amp;#039;: [ [[Media:Exam1_G2.hs |Enunciado]], [[Parcial 1 |Solución colaborativa]], [[Parcial 1 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 2&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(20/01/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 3&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(08/04/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 4&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(10/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 5&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(24/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Cursos Anteriores==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://github.com/jaalonso/Examenes_de_PF_con_Haskell/blob/master/README.org Repositorio de Exámenes]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Curso 2020/21 Grupo 2&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 11/12/20 |Examen 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(11/12/2020)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 16/02/21 |Examen 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(16/02/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 23/04/21 |Examen 3 Turno 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(23/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 28/04/21 |Examen 3 Turno 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(28/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 21/06/21 |Examen 4]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(21/06/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 05/07/2021 |Examen Julio]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(05/07/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 07/09/2021 |Examen Septiembre]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(07/09/2021)&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=586</id>
		<title>Informática (1º Matemáticas)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=586"/>
		<updated>2022-01-11T12:00:08Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: /* Relación de Ejercicios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==Relación de Ejercicios==&lt;br /&gt;
&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Definiciones por composición sobre números, listas y booleanos. [ [[Media:Rel_1.hs |Enunciado]], [[Relación 1 |Solución colaborativa]], [[Relación 1 Sol |Solución]]  ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Definiciones con condicionales, guardas o patrones. [ [[Media:Rel_2.hs |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Relación 2 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión. [ [[Media:Rel_3.hs |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Relación 3 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión (extra). [ [[Media:Rel_4.hs |Enunciado]], [[Relación 4 |Solución colaborativa editada]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión con cadenas: El cifrado césar. [ [[Media:Rel_5.hs |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Relación 5 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión. [ [[Media:Rel_6.hs |Enunciado]], [[Relación 6 |Solución colaborativa]], [[Relación 6 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión y comprensión (extra). [ [[Media:Rel_7.hs |Enunciado]], [[Relación 7 |Solución colaborativa]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados (extra). [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Propiedades del número 2021. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10 |Solución colaborativa]], [[Relación 10 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Listas infinitas y evaluación perezosa. [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11 |Solución colaborativa]], [[Relación 11 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (I), Árboles binarios. [ [[Media:Rel_12.hs |Enunciado]], [[Relación 12|Solución colaborativa]]&amp;lt;!--, [[Relación 12 Sol |Solución]]--&amp;gt; ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (II), Árboles binarios, expresiones y árboles genéricos. [ [[Media:Rel_13.hs |Enunciado]], [[Relación 13|Solución colaborativa]]&amp;lt;!--, [[Relación 13 Sol |Solución ]]--&amp;gt; ]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: El algoritmo de Luhn. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones sobre cadenas. [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la programación funcional con listas infinitas. [ [[Media:Rel_14.hs |Enunciado]], [[Relación 14 colab|Solución colaborativa]], [[Relación 14|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: Ecuación con factoriales. [ [[Media:Rel_15.hs |Enunciado]], [[Relación 15 colab |Solución colaborativa]], [[Relación 15 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 16&amp;#039;&amp;#039;&amp;#039;: El juego del nim y las funciones de entrada/salida. [ [[Media:Rel_16.hs |Enunciado]], [[Relación 16 colab|Solución colaborativa]], [[Relación 16 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 17&amp;#039;&amp;#039;&amp;#039;: Cálculo del número pi mediante el método de Montecarlo. [ [[Media:Rel_17.hs |Enunciado]], [[Relación 17 |Solución colaborativa]], [[Rel 17 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 18&amp;#039;&amp;#039;&amp;#039;: Aproximaciones de pi. [ [[Media:Rel_18.hs |Enunciado]], [http://www.cs.us.es/~mjoseh/Digitos_de_pi.txt Fichero con los dígitos de pi], [[Relación 18 |Solución colaborativa]], [[Rel 18 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 19&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices. [ [[Media:Rel_19.hs |Enunciado]], [[Relación 19 |Solución colaborativa]], [[Relación 19 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Método de Gauss para triangularizar matrices. [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 |Solución colaborativa]], [[Relación 20 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 21&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices con librerías Data.Matrix y Data.Vector. [ [[Media:Rel_21.hs |Enunciado]], [[Relación 21 |Solución colaborativa]], [[Relación 21 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 22&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices: ejercicios de exámenes (para repasar). [ [[Media:Rel_22.hs |Enunciado]], [[Relación 22 |Solución colaborativa]], [[Relación 22 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 23&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_23.hs |Enunciado]], [[Relación 23 |Solución colaborativa]], [[Relación 23 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico (2): límites, bisección, integrales y bajada. [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva. [ [[Media:Rel_25.hs |Enunciado]], [[Relación 25 |Solución colaborativa]], [[Relación 25 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 26&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva con librerías (solucionada). [ [[Relación 26 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 27&amp;#039;&amp;#039;&amp;#039;: Combinatoria. [ [[Media:Rel_27.hs |Enunciado]], [[Relación 27 |Solución colaborativa]], [[Relación 27 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: El TAD de las pilas.  [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 |Solución colaborativa]], [[Relación 28 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de las colas.  [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 |Solución colaborativa]], [[Relación 29 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de conjuntos.  [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 colab |Solución colaborativa]], [[Relación 31 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 32&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. Regla de Ruffini. [ [[Media:Rel_32.hs |Enunciado]], [[Relación 32 colab |Solución colaborativa]], [[Relación 32 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g1.hs |Enunciado]], [[Exam 3g1 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g2.hs |Enunciado]], [[Exam 3g2 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de los montículos. Librería en https://cutt.ly/tbDyRlr [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Media:Relación_33_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Media:Relación_34_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería Data.Set. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 |Solución colaborativa]], [[Media:Relación_35_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 36&amp;#039;&amp;#039;&amp;#039;: Problemas básicos con el TAD de los grafos. [ [[Media:Rel_36.hs |Enunciado]], [[Relación 36 Colab |Solución colaborativa]], [[Media:Relación_36_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante listas. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica I&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_1.hs |Enunciado]], [[Programación dinámica I |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica II&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_2.hs |Enunciado]], [[Programación Dinámica II |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Grafos&amp;#039;&amp;#039;&amp;#039;: Ejercicios de examen sobre grafos. ([[Media:masgrafos.hs |Enunciado]], [[Grafos (Ej. examen) |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Técnica Divide y vencerás&amp;#039;&amp;#039;&amp;#039;: Puzzle. ([[Media:triomino.hs |Enunciado]], [[Triominos |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica III&amp;#039;&amp;#039;&amp;#039;: Ejercicios de programación dinámica. ([[Media:dinamica3_3.hs |Enunciado]], [[Programación Dinámica III |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso I&amp;#039;&amp;#039;&amp;#039;. ([[Media:Lychrel.hs |Enunciado]], [[Repaso I. Números de Lychrel |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso II: ejercicios de examen&amp;#039;&amp;#039;&amp;#039;. ([[Media:ejExamenes.hs |Enunciado]], [[Repaso II.  |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios Complementarios.&amp;#039;&amp;#039;&amp;#039;([[Media:ejcomplementarios.hs |Enunciado]], [[Ejercicios Complementarios|Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Más ejercicios de examen.&amp;#039;&amp;#039;&amp;#039;([[Media:ejExam.hs |Enunciado]], [[Ejercicios de examen|Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- MÁS EJERCICIOS DE OTROS AÑOS&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Ejercicios de exámenes sobre grafos. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 Colab |Solución colaborativa]], [[Relación 37 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~mjoseh/cursos/i1m-20/doc/manual-Data.Set.html Data.Set]. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Relación 34 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico en Maxima: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_25.mac |Enunciado]], [[Relación 25 |Solución colaborativa]] [[Relación 25 Sol |Solución]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/manual-Data.Set.html Data.Set] (erratas solucionadas). [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 colab |Solución colaborativa]], [[Relación 28 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: División y factorización de polinomios mediante la regla de Ruffini. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Caminos en una retícula. [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Apilamiento de barriles. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 |Solución colaborativa]], [[Relación 31 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante diccionarios. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 Colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de los multiconjuntos mediante diccionarios. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: El problema del granjero mediante búsqueda en espacio de estado. [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Relación 33 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Resolución de problemas mediante búsqueda en espacios de estados. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 colab |Solución colaborativa]], [[Relación 35 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados de repaso.  [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 colab |Solución colaborativa]] ]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Curso Actual==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 1&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(12/11/2021)&amp;#039;&amp;#039;: [ [[Media:Exam1_G2.hs |Enunciado]], [[Parcial 1 |Solución colaborativa]], [[Parcial 1 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 2&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(20/01/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 3&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(08/04/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 4&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(10/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 5&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(24/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Cursos Anteriores==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://github.com/jaalonso/Examenes_de_PF_con_Haskell/blob/master/README.org Repositorio de Exámenes]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Curso 2020/21 Grupo 2&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 11/12/20 |Examen 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(11/12/2020)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 16/02/21 |Examen 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(16/02/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 23/04/21 |Examen 3 Turno 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(23/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 28/04/21 |Examen 3 Turno 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(28/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 21/06/21 |Examen 4]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(21/06/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 05/07/2021 |Examen Julio]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(05/07/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 07/09/2021 |Examen Septiembre]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(07/09/2021)&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_13_Sol&amp;diff=585</id>
		<title>Relación 13 Sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_13_Sol&amp;diff=585"/>
		<updated>2022-01-11T11:59:49Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Protegió «Relación 13 Sol» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Relación 13 solución&lt;br /&gt;
-- Tipos de datos algebraicos (II).&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- En esta relación se presenta ejercicios sobre distintos tipos de&lt;br /&gt;
-- datos algebraicos. Concretamente,&lt;br /&gt;
--    * Árboles binarios:&lt;br /&gt;
--      + Árboles binarios con valores en los nodos.&lt;br /&gt;
--      + Árboles binarios con valores en las hojas.&lt;br /&gt;
--      + Árboles binarios con valores en las hojas y en los nodos.&lt;br /&gt;
--      + Árboles booleanos.  &lt;br /&gt;
--    * Árboles generales&lt;br /&gt;
--    * Expresiones aritméticas&lt;br /&gt;
--      + Expresiones aritméticas básicas.&lt;br /&gt;
--      + Expresiones aritméticas con una variable.&lt;br /&gt;
--      + Expresiones aritméticas con varias variables.&lt;br /&gt;
--      + Expresiones aritméticas generales. &lt;br /&gt;
--      + Expresiones aritméticas con tipo de operaciones.&lt;br /&gt;
--    * Expresiones vectoriales&lt;br /&gt;
-- &lt;br /&gt;
-- Los ejercicios corresponden al tema 9 que se encuentran en &lt;br /&gt;
--    http://www.cs.us.es/~jalonso/cursos/temas/tema-9.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Los árboles binarios con valores en los nodos se&lt;br /&gt;
-- pueden definir por&lt;br /&gt;
--    data Arbol1 a = H1 &lt;br /&gt;
--                  | N1 a (Arbol1 a) (Arbol1 a)&lt;br /&gt;
--                  deriving (Show, Eq)&lt;br /&gt;
-- Por ejemplo, el árbol&lt;br /&gt;
--         9                &lt;br /&gt;
--        / \    &lt;br /&gt;
--       /   \   &lt;br /&gt;
--      8     6  &lt;br /&gt;
--     / \   / \ &lt;br /&gt;
--    3   2 4   5&lt;br /&gt;
-- se puede representar por&lt;br /&gt;
--    N1 9 (N1 8 (N1 3 H1 H1) (N1 2 H1 H1)) (N1 6 (N1 4 H1 H1) (N1 5 H1 H1))&lt;br /&gt;
--&lt;br /&gt;
-- Definir por recursión la función &lt;br /&gt;
--    sumaArbol :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
-- tal (sumaArbol x) es la suma de los valores que hay en el árbol&lt;br /&gt;
-- x. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; sumaArbol (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))  &lt;br /&gt;
--    21&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol1 a = H1 &lt;br /&gt;
             | N1 a (Arbol1 a) (Arbol1 a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
&lt;br /&gt;
sumaArbol :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
sumaArbol H1         = 0&lt;br /&gt;
sumaArbol (N1 x i d) = x + sumaArbol i + sumaArbol d&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la función &lt;br /&gt;
--    mapArbol :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
-- tal que (mapArbol f x) es el árbol que resulta de sustituir cada nodo&lt;br /&gt;
-- n del árbol x por (f n). Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; mapArbol (+1) (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))&lt;br /&gt;
--    N1 3 (N1 6 (N1 4 H1 H1) (N1 8 H1 H1)) (N1 5 H1 H1)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
mapArbol :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
mapArbol _ H1         = H1&lt;br /&gt;
mapArbol f (N1 x i d) = N1 (f x) (mapArbol f i) (mapArbol f d)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la función&lt;br /&gt;
--    ramaIzquierda :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
-- tal que (ramaIzquierda a) es la lista de los valores de los nodos de&lt;br /&gt;
-- la rama izquierda del árbol a. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; ramaIzquierda (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))&lt;br /&gt;
--    [2,5,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ramaIzquierda :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
ramaIzquierda H1         = []&lt;br /&gt;
ramaIzquierda (N1 x i _) = x : ramaIzquierda i&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.4. Diremos que un árbol está balanceado si para cada nodo&lt;br /&gt;
-- v la diferencia entre el número de nodos (con valor) de sus subárboles&lt;br /&gt;
-- izquierdo y derecho es menor o igual que uno.  &lt;br /&gt;
--&lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    balanceado :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
-- tal que (balanceado a) se verifica si el árbol a está balanceado. Por &lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    balanceado (N1 5 H1 (N1 3 H1 H1))           == True&lt;br /&gt;
--    balanceado (N1 5 H1 (N1 3 (N1 4 H1 H1) H1)) == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
balanceado :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
balanceado H1         = True&lt;br /&gt;
balanceado (N1 _ i d) = (abs (numeroNodos i - numeroNodos d) &amp;lt;= 1)&lt;br /&gt;
  &amp;amp;&amp;amp; balanceado i &amp;amp;&amp;amp; balanceado d&lt;br /&gt;
&lt;br /&gt;
-- (numeroNodos a) es el número de nodos del árbol a. Por ejemplo,&lt;br /&gt;
--    numeroNodos (N1 5 H1 (N1 3 H1 H1)) ==  2&lt;br /&gt;
numeroNodos :: Arbol1 a -&amp;gt; Int&lt;br /&gt;
numeroNodos H1         = 0&lt;br /&gt;
numeroNodos (N1 _ i d) = 1 + numeroNodos i + numeroNodos d&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Los árboles binarios con valores en las hojas se pueden&lt;br /&gt;
-- definir por&lt;br /&gt;
--    data Arbol2 a = H2 a&lt;br /&gt;
--                  | N2 (Arbol2 a) (Arbol2 a) &lt;br /&gt;
--                  deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles &lt;br /&gt;
--    árbol1          árbol2       árbol3     árbol4 &lt;br /&gt;
--       o              o           o           o    &lt;br /&gt;
--      / \            / \         / \         / \   &lt;br /&gt;
--     1   o          o   3       o   3       o   1  &lt;br /&gt;
--        / \        / \         / \         / \     &lt;br /&gt;
--       2   3      1   2       1   4       2   3    &lt;br /&gt;
-- se representan por&lt;br /&gt;
--    arbol1, arbol2, arbol3, arbol4 :: Arbol2 Int&lt;br /&gt;
--    arbol1 = N2 (H2 1) (N2 (H2 2) (H2 3))&lt;br /&gt;
--    arbol2 = N2 (N2 (H2 1) (H2 2)) (H2 3)&lt;br /&gt;
--    arbol3 = N2 (N2 (H2 1) (H2 4)) (H2 3)&lt;br /&gt;
--    arbol4 = N2 (N2 (H2 2) (H2 3)) (H2 1)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    igualBorde :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
-- tal que (igualBorde t1 t2) se verifica si los bordes de los árboles&lt;br /&gt;
-- t1 y t2 son iguales. Por ejemplo,&lt;br /&gt;
--    igualBorde arbol1 arbol2  ==  True&lt;br /&gt;
--    igualBorde arbol1 arbol3  ==  False&lt;br /&gt;
--    igualBorde arbol1 arbol4  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol2 a = N2 (Arbol2 a) (Arbol2 a) &lt;br /&gt;
              | H2 a&lt;br /&gt;
              deriving Show&lt;br /&gt;
&lt;br /&gt;
arbol1, arbol2, arbol3, arbol4 :: Arbol2 Int&lt;br /&gt;
arbol1 = N2 (H2 1) (N2 (H2 2) (H2 3))&lt;br /&gt;
arbol2 = N2 (N2 (H2 1) (H2 2)) (H2 3)&lt;br /&gt;
arbol3 = N2 (N2 (H2 1) (H2 4)) (H2 3)&lt;br /&gt;
arbol4 = N2 (N2 (H2 2) (H2 3)) (H2 1)&lt;br /&gt;
&lt;br /&gt;
igualBorde :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
igualBorde t1 t2 = borde t1 == borde t2&lt;br /&gt;
&lt;br /&gt;
-- (borde t) es el borde del árbol t; es decir, la lista de las hojas&lt;br /&gt;
-- del árbol t leídas de izquierda a derecha. Por ejemplo, &lt;br /&gt;
--    borde arbol4  ==  [2,3,1]&lt;br /&gt;
borde :: Arbol2 a -&amp;gt; [a]&lt;br /&gt;
borde (N2 i d) = borde i ++ borde d&lt;br /&gt;
borde (H2 x)   = [x]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Los árboles binarios con valores en las hojas y en los&lt;br /&gt;
-- nodos se definen por&lt;br /&gt;
--    data Arbol3 a = H3 a&lt;br /&gt;
--                 | N3 a (Arbol3 a) (Arbol3 a) &lt;br /&gt;
--                 deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--         5              8             5           5&lt;br /&gt;
--        / \            / \           / \         / \&lt;br /&gt;
--       /   \          /   \         /   \       /   \&lt;br /&gt;
--      9     7        9     3       9     2     4     7&lt;br /&gt;
--     / \   / \      / \   / \     / \               / \&lt;br /&gt;
--    1   4 6   8    1   4 6   2   1   4             6   2&lt;br /&gt;
-- se pueden representar por&lt;br /&gt;
--    ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol3 Int&lt;br /&gt;
--    ej3arbol1 = N3 5 (N3 9 (H3 1) (H3 4)) (N3 7 (H3 6) (H3 8))&lt;br /&gt;
--    ej3arbol2 = N3 8 (N3 9 (H3 1) (H3 4)) (N3 3 (H3 6) (H3 2))&lt;br /&gt;
--    ej3arbol3 = N3 5 (N3 9 (H3 1) (H3 4)) (H3 2)&lt;br /&gt;
--    ej3arbol4 = N3 5 (H3 4) (N3 7 (H3 6) (H3 2))&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    igualEstructura :: Arbol3 -&amp;gt; Arbol3 -&amp;gt; Bool&lt;br /&gt;
-- tal que (igualEstructura a1 a1) se verifica si los árboles a1 y a2 &lt;br /&gt;
-- tienen la misma estructura. Por ejemplo,&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol2 == True&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol3 == False&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol4 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol3 a = H3 a&lt;br /&gt;
              | N3 a (Arbol3 a) (Arbol3 a) &lt;br /&gt;
              deriving (Show, Eq)&lt;br /&gt;
&lt;br /&gt;
ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol3 Int&lt;br /&gt;
ej3arbol1 = N3 5 (N3 9 (H3 1) (H3 4)) (N3 7 (H3 6) (H3 8))&lt;br /&gt;
ej3arbol2 = N3 8 (N3 9 (H3 1) (H3 4)) (N3 3 (H3 6) (H3 2))&lt;br /&gt;
ej3arbol3 = N3 5 (N3 9 (H3 1) (H3 4)) (H3 2)&lt;br /&gt;
ej3arbol4 = N3 5 (H3 4) (N3 7 (H3 6) (H3 2))&lt;br /&gt;
&lt;br /&gt;
igualEstructura :: Arbol3 a -&amp;gt; Arbol3 a -&amp;gt; Bool&lt;br /&gt;
igualEstructura (H3 _) (H3 _) = True&lt;br /&gt;
igualEstructura (N3 _ i1 d1) (N3 _ i2 d2) = &lt;br /&gt;
    igualEstructura i1 i2 &amp;amp;&amp;amp; igualEstructura d1 d2&lt;br /&gt;
igualEstructura _ _                       = False  &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Definir la función&lt;br /&gt;
--    algunoArbol :: Arbol3 t -&amp;gt; (t -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
-- tal que (algunoArbol a p) se verifica si algún elemento del árbol a&lt;br /&gt;
-- cumple la propiedad p. Por ejemplo,&lt;br /&gt;
--    algunoArbol (N3 5 (N3 3 (H3 1) (H3 4)) (H3 2)) (&amp;gt;4)  ==  True&lt;br /&gt;
--    algunoArbol (N3 5 (N3 3 (H3 1) (H3 4)) (H3 2)) (&amp;gt;7)  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
algunoArbol :: Arbol3 a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
algunoArbol (H3 x) p     = p x&lt;br /&gt;
algunoArbol (N3 x i d) p = p x || algunoArbol i p || algunoArbol d p&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.3. Un elemento de un árbol se dirá de nivel k si aparece&lt;br /&gt;
-- en el árbol a distancia k  de la raíz.  &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    nivel :: Int -&amp;gt; Arbol3 a -&amp;gt; [a]&lt;br /&gt;
-- tal que (nivel k a) es la lista de los elementos de nivel k del árbol&lt;br /&gt;
-- a. Por ejemplo,&lt;br /&gt;
--    nivel 0 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [7]&lt;br /&gt;
--    nivel 1 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [2,9]&lt;br /&gt;
--    nivel 2 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [5,4]&lt;br /&gt;
--    nivel 3 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
nivel :: Int -&amp;gt; Arbol3 a -&amp;gt; [a]&lt;br /&gt;
nivel 0 (H3 x)      = [x]&lt;br /&gt;
nivel 0 (N3 x _  _) = [x]&lt;br /&gt;
nivel _ (H3 _ )     = []&lt;br /&gt;
nivel k (N3 _ i d)  = nivel (k-1) i ++ nivel (k-1) d&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.4. Los divisores medios de un número son los que ocupan&lt;br /&gt;
-- la posición media entre los divisores de n, ordenados de menor a&lt;br /&gt;
-- mayor. Por ejemplo, los divisores de 60 son &lt;br /&gt;
-- [1,2,3,4,5,6,10,12,15,20,30,60] y sus divisores medios son 6 y 10.&lt;br /&gt;
-- &lt;br /&gt;
-- El árbol de factorización de un número compuesto n se construye de la&lt;br /&gt;
-- siguiente manera: &lt;br /&gt;
--    * la raíz es el número n, &lt;br /&gt;
--    * la rama izquierda es el árbol de factorización de su divisor&lt;br /&gt;
--      medio menor y&lt;br /&gt;
--    * la rama derecha es el árbol de factorización de su divisor&lt;br /&gt;
--      medio mayor&lt;br /&gt;
-- Si el número es primo, su árbol de factorización sólo tiene una hoja&lt;br /&gt;
-- con dicho número. Por ejemplo, el árbol de factorización de 60 es&lt;br /&gt;
--        60&lt;br /&gt;
--       /  \&lt;br /&gt;
--      6    10&lt;br /&gt;
--     / \   / \&lt;br /&gt;
--    2   3 2   5&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    arbolFactorizacion :: Int -&amp;gt; Arbol3&lt;br /&gt;
-- tal que (arbolFactorizacion n) es el árbol de factorización de n. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    arbolFactorizacion 60 == N3 60 (N3 6 (H3 2) (H3 3)) (N3 10 (H3 2) (H3 5))&lt;br /&gt;
--    arbolFactorizacion 45 == N3 45 (H3 5) (N3 9 (H3 3) (H3 3))&lt;br /&gt;
--    arbolFactorizacion 7  == H3 7&lt;br /&gt;
--    arbolFactorizacion 9  == N3 9 (H3 3) (H3 3)&lt;br /&gt;
--    arbolFactorizacion 14 == N3 14 (H3 2) (H3 7)&lt;br /&gt;
--    arbolFactorizacion 28 == N3 28 (N3 4 (H3 2) (H3 2)) (H3 7)&lt;br /&gt;
--    arbolFactorizacion 84 == N3 84 (H3 7) (N3 12 (H3 3) (N3 4 (H3 2) (H3 2)))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1Ş definición&lt;br /&gt;
-- =============&lt;br /&gt;
arbolFactorizacion :: Int -&amp;gt; Arbol3 Int&lt;br /&gt;
arbolFactorizacion n &lt;br /&gt;
    | esPrimo n = H3 n&lt;br /&gt;
    | otherwise = N3 n (arbolFactorizacion x) (arbolFactorizacion y)&lt;br /&gt;
    where (x,y) = divisoresMedio n&lt;br /&gt;
&lt;br /&gt;
-- (esPrimo n) se verifica si n es primo. Por ejemplo,&lt;br /&gt;
--    esPrimo 7  ==  True&lt;br /&gt;
--    esPrimo 9  ==  False&lt;br /&gt;
esPrimo :: Int -&amp;gt; Bool&lt;br /&gt;
esPrimo n = divisores n == [1,n]&lt;br /&gt;
&lt;br /&gt;
-- (divisoresMedio n) es el par formado por los divisores medios de&lt;br /&gt;
-- n. Por ejemplo,&lt;br /&gt;
--    divisoresMedio 30  ==  (5,6)&lt;br /&gt;
--    divisoresMedio  7  ==  (1,7)&lt;br /&gt;
--    divisoresMedio 16  ==  (4,4)&lt;br /&gt;
divisoresMedio :: Int -&amp;gt; (Int,Int)&lt;br /&gt;
divisoresMedio n = (n `div` x,x)&lt;br /&gt;
    where xs = divisores n&lt;br /&gt;
          x  = xs !! (length xs `div` 2)&lt;br /&gt;
&lt;br /&gt;
-- (divisores n) es la lista de los divisores de n. Por ejemplo,&lt;br /&gt;
--    divisores 30  ==  [1,2,3,5,6,10,15,30]&lt;br /&gt;
divisores :: Int -&amp;gt; [Int]&lt;br /&gt;
divisores n = [x | x &amp;lt;- [1..n], n `rem` x == 0]&lt;br /&gt;
&lt;br /&gt;
-- 2Ş definición&lt;br /&gt;
-- =============&lt;br /&gt;
arbolFactorizacion2 :: Int -&amp;gt; Arbol3 Int&lt;br /&gt;
arbolFactorizacion2 n&lt;br /&gt;
    | x == 1    = H3 n&lt;br /&gt;
    | otherwise = N3 n (arbolFactorizacion x) (arbolFactorizacion y)&lt;br /&gt;
    where (x,y) = divisoresMedio n&lt;br /&gt;
&lt;br /&gt;
-- (divisoresMedio2 n) es el par formado por los divisores medios de&lt;br /&gt;
-- n. Por ejemplo,&lt;br /&gt;
--    divisoresMedio2 30  ==  (5,6)&lt;br /&gt;
--    divisoresMedio2  7  ==  (1,7)&lt;br /&gt;
divisoresMedio2 :: Int -&amp;gt; (Int,Int)&lt;br /&gt;
divisoresMedio2 n = (n `div` x,x)&lt;br /&gt;
    where m  = ceiling (sqrt (fromIntegral n))&lt;br /&gt;
          x = head [y | y &amp;lt;- [m..n], n `rem` y == 0]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se consideran los árboles con operaciones booleanas&lt;br /&gt;
-- definidos por   &lt;br /&gt;
--    data ArbolB = HB Bool &lt;br /&gt;
--                | Conj ArbolB ArbolB&lt;br /&gt;
--                | Disy ArbolB ArbolB&lt;br /&gt;
--                | Neg ArbolB&lt;br /&gt;
-- &lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--                Conj                            Conj          &lt;br /&gt;
--               /   \                           /   \          &lt;br /&gt;
--              /     \                         /     \         &lt;br /&gt;
--           Disy      Conj                  Disy      Conj     &lt;br /&gt;
--          /   \       /  \                /   \      /   \    &lt;br /&gt;
--       Conj    Neg   Neg True          Conj    Neg   Neg  True &lt;br /&gt;
--       /  \    |     |                 /  \    |     |        &lt;br /&gt;
--    True False False False          True False True  False     &lt;br /&gt;
--&lt;br /&gt;
-- se definen por&lt;br /&gt;
--    ej1, ej2:: ArbolB&lt;br /&gt;
--    ej1 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
--                     (Neg (HB False)))&lt;br /&gt;
--               (Conj (Neg (HB False))&lt;br /&gt;
--                     (HB True))&lt;br /&gt;
--    &lt;br /&gt;
--    ej2 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
--                     (Neg (HB True)))&lt;br /&gt;
--               (Conj (Neg (HB False))&lt;br /&gt;
--                     (HB True))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorB :: ArbolB -&amp;gt; Bool&lt;br /&gt;
-- tal que (valorB ar) es el resultado de procesar el árbol realizando&lt;br /&gt;
-- las operaciones booleanas especificadas en los nodos. Por ejemplo,&lt;br /&gt;
--    valorB ej1 == True&lt;br /&gt;
--    valorB ej2 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ArbolB = HB Bool &lt;br /&gt;
            | Conj ArbolB ArbolB&lt;br /&gt;
            | Disy ArbolB ArbolB&lt;br /&gt;
            | Neg ArbolB&lt;br /&gt;
&lt;br /&gt;
ej1, ej2 :: ArbolB&lt;br /&gt;
ej1 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
                 (Neg (HB False)))&lt;br /&gt;
           (Conj (Neg (HB False))&lt;br /&gt;
                 (HB True))&lt;br /&gt;
&lt;br /&gt;
ej2 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
                 (Neg (HB True)))&lt;br /&gt;
           (Conj (Neg (HB False))&lt;br /&gt;
                 (HB True))&lt;br /&gt;
&lt;br /&gt;
valorB:: ArbolB -&amp;gt; Bool&lt;br /&gt;
valorB (HB x)     = x&lt;br /&gt;
valorB (Neg a)    = not (valorB a)&lt;br /&gt;
valorB (Conj i d) = valorB i &amp;amp;&amp;amp; valorB d&lt;br /&gt;
valorB (Disy i d) = valorB i || valorB d&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Los árboles generales se pueden representar mediante el&lt;br /&gt;
-- siguiente tipo de dato  &lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--                  deriving (Eq, Show)&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1               3               3&lt;br /&gt;
--     / \             /|\            / | \&lt;br /&gt;
--    2   3           / | \          /  |  \&lt;br /&gt;
--        |          5  4  7        5   4   7&lt;br /&gt;
--        4          |     /\       |   |  / \&lt;br /&gt;
--                   6    2  1      6   1 2   1&lt;br /&gt;
--                                     / \&lt;br /&gt;
--                                    2   3&lt;br /&gt;
--                                        |&lt;br /&gt;
--                                        4&lt;br /&gt;
-- se representan por&lt;br /&gt;
--    ejG1, ejG2, ejG3 :: ArbolG Int&lt;br /&gt;
--    ejG1 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ejG2 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
--                 NG 4 [], &lt;br /&gt;
--                 NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
--    ejG3 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
--                 NG 4 [NG 1 [NG 2 [],NG 3 [NG 4 []]]], &lt;br /&gt;
--                 NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     ramifica :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
-- tal que (ramifica a1 a2 p) el árbol que resulta de ańadir una copia&lt;br /&gt;
-- del árbol a2 a los nodos de a1 que cumplen un predicado p. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;4) =&amp;gt;  NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;3) =&amp;gt;  NG 1 [NG 2 [],NG 3 [NG 4 [NG 8 []]]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;2) =&amp;gt;  NG 1 [NG 2 [],NG 3 [NG 4 [NG 8 []],NG 8 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;1) =&amp;gt;  NG 1 [NG 2 [NG 8 []],NG 3 [NG 4 [NG 8 []],NG 8 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;0) =&amp;gt;  NG 1 [NG 2 [NG 8 []],NG 3 [NG 4 [NG 8 []],NG 8 []],NG 8 []]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
              deriving (Eq, Show)&lt;br /&gt;
&lt;br /&gt;
ejG1, ejG2, ejG3 :: ArbolG Int&lt;br /&gt;
ejG1 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
ejG2 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
           NG 4 [], &lt;br /&gt;
           NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
ejG3 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
           NG 4 [NG 1 [NG 2 [],NG 3 [NG 4 []]]], &lt;br /&gt;
           NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
&lt;br /&gt;
ramifica :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
ramifica (NG x as) a2 p  &lt;br /&gt;
         | p x       = NG x (as&amp;#039; ++ [a2])&lt;br /&gt;
         | otherwise = NG x  as&amp;#039;&lt;br /&gt;
  where as&amp;#039; = [ramifica a a2 p | a &amp;lt;- as]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir la función&lt;br /&gt;
--    nHojasG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
-- tal que (nHojas x) es el número de hojas del árbol x. Por ejemplo,&lt;br /&gt;
--    nHojasG ejG1  ==  2&lt;br /&gt;
--    nHojasG ejG2  ==  4&lt;br /&gt;
--    nHojasG ejG3  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
nHojasG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
nHojasG (NG _ []) = 1&lt;br /&gt;
nHojasG (NG _ as) = sum $ map nHojasG as&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir la función&lt;br /&gt;
--    profundidad :: ArbolG a -&amp;gt; Int&lt;br /&gt;
-- tal que (profundidadG x) es la profundidad del árbol x. Por ejemplo,&lt;br /&gt;
--    profundidadG ejG1  ==  2&lt;br /&gt;
--    profundidadG ejG2  ==  2&lt;br /&gt;
--    profundidadG ejG3  ==  4&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
profundidadG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
profundidadG (NG _ []) = 0&lt;br /&gt;
profundidadG (NG _ as) = 1 + (maximum (map profundidadG as))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.4. Definir la función&lt;br /&gt;
--    bin2gen :: Arbol3 a -&amp;gt; ArbolG a&lt;br /&gt;
-- tal que (bin2gen x) es la traducción del árbol x definido con el tipo&lt;br /&gt;
-- &amp;quot;Arbol3&amp;quot; (es decir, árbol binario) a &amp;quot;ArbolG&amp;quot; (es decir, árbol&lt;br /&gt;
-- genérico). Por ejemplo,&lt;br /&gt;
--    bin2gen (N3 9 (N3 3 (H3 2) (H3 4)) (H3 7)) ==  (NG 9 [NG 3 [NG 2 [],NG 4 []], NG 7 []])&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
bin2gen :: Arbol3 a -&amp;gt; ArbolG a&lt;br /&gt;
bin2gen (H3 v) = NG v []&lt;br /&gt;
bin2gen (N3 v i d) = NG v [bin2gen i,bin2gen d]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Las expresiones aritméticas básicas pueden&lt;br /&gt;
-- representarse usando el siguiente tipo de datos  &lt;br /&gt;
--    data Expr1 = C1 Int &lt;br /&gt;
--               | S1 Expr1 Expr1 &lt;br /&gt;
--               | P1 Expr1 Expr1  &lt;br /&gt;
--               deriving Show&lt;br /&gt;
-- Por ejemplo, la expresión 2*(3+7) se representa por&lt;br /&gt;
--    P1 (C1 2) (S1 (C1 3) (C1 7))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valor :: Expr1 -&amp;gt; Int                   &lt;br /&gt;
-- tal que (valor e) es el valor de la expresión aritmética e. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    valor (P1 (C1 2) (S1 (C1 3) (C1 7)))  ==  20&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr1 = C1 Int &lt;br /&gt;
           | S1 Expr1 Expr1 &lt;br /&gt;
           | P1 Expr1 Expr1  &lt;br /&gt;
           deriving (Show, Eq)&lt;br /&gt;
                   &lt;br /&gt;
valor :: Expr1 -&amp;gt; Int                   &lt;br /&gt;
valor (C1 x)   = x &lt;br /&gt;
valor (S1 x y) = valor x + valor y&lt;br /&gt;
valor (P1 x y) = valor x * valor y&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir la función  &lt;br /&gt;
--    aplica :: (Int -&amp;gt; Int) -&amp;gt; Expr1 -&amp;gt; Expr1&lt;br /&gt;
-- tal que (aplica f e) es la expresión obtenida aplicando la función f&lt;br /&gt;
-- a cada uno de los números de la expresión e. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; aplica (+2) (s1 (p1 (c1 3) (c1 5)) (p1 (c1 6) (c1 7)))&lt;br /&gt;
--    s1 (p1 (c1 5) (c1 7)) (p1 (c1 8) (c1 9))&lt;br /&gt;
--    ghci&amp;gt; aplica (*2) (s1 (p1 (c1 3) (c1 5)) (p1 (c1 6) (c1 7)))&lt;br /&gt;
--    s1 (p1 (c1 6) (c1 10)) (p1 (c1 12) (c1 14))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
aplica :: (Int -&amp;gt; Int) -&amp;gt; Expr1 -&amp;gt; Expr1&lt;br /&gt;
aplica f (C1 x)     = C1 (f x)&lt;br /&gt;
aplica f (S1 e1 e2) = S1 (aplica f e1) (aplica f e2)&lt;br /&gt;
aplica f (P1 e1 e2) = P1 (aplica f e1) (aplica f e2)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Las expresiones aritméticas construidas con una&lt;br /&gt;
-- variable (denotada por X), los números enteros y las operaciones de&lt;br /&gt;
-- sumar y multiplicar se pueden representar mediante el tipo de datos&lt;br /&gt;
-- Expr2 definido por     &lt;br /&gt;
--    data Expr2 = X&lt;br /&gt;
--               | C2 Int&lt;br /&gt;
--               | S2 Expr2 Expr2&lt;br /&gt;
--               | P2 Expr2 Expr2&lt;br /&gt;
-- Por ejemplo, la expresión &amp;quot;X*(13+X)&amp;quot; se representa por&lt;br /&gt;
-- &amp;quot;P2 X (S2 (C2 13) X)&amp;quot;.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorE :: Expr2 -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
-- tal que (valorE e n) es el valor de la expresión e cuando se&lt;br /&gt;
-- sustituye su variable por n. Por ejemplo,&lt;br /&gt;
--    valorE (P2 X (S2 (C2 13) X)) 2  ==  30&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Expr2 = X&lt;br /&gt;
           | C2 Int&lt;br /&gt;
           | S2 Expr2 Expr2&lt;br /&gt;
           | P2 Expr2 Expr2&lt;br /&gt;
&lt;br /&gt;
valorE :: Expr2 -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
valorE X          n = n&lt;br /&gt;
valorE (C2 a)     _ = a&lt;br /&gt;
valorE (S2 e1 e2) n = valorE e1 n + valorE e2 n&lt;br /&gt;
valorE (P2 e1 e2) n = valorE e1 n * valorE e2 n&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Definir la función&lt;br /&gt;
--    numVars :: Expr2 -&amp;gt; Int&lt;br /&gt;
-- tal que (numVars e) es el número de variables en la expresión e. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    numVars (C2 3)                 ==  0&lt;br /&gt;
--    numVars X                      ==  1&lt;br /&gt;
--    numVars (P2 X (S2 (C2 13) X))  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
numVars :: Expr2 -&amp;gt; Int&lt;br /&gt;
numVars X        = 1&lt;br /&gt;
numVars (C2 _)   = 0&lt;br /&gt;
numVars (S2 a b) = numVars a + numVars b&lt;br /&gt;
numVars (P2 a b) = numVars a + numVars b&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Las expresiones aritméticas con variables pueden&lt;br /&gt;
-- representarse usando el siguiente tipo de datos  &lt;br /&gt;
--    data Expr3 = C3 Int &lt;br /&gt;
--               | V3 Char &lt;br /&gt;
--               | S3 Expr3 Expr3 &lt;br /&gt;
--               | P3 Expr3 Expr3  &lt;br /&gt;
--               deriving Show&lt;br /&gt;
-- Por ejemplo, la expresión 2*(a+5) se representa por&lt;br /&gt;
--    P3 (C3 2) (S3 (V3 &amp;#039;a&amp;#039;) (C3 5))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valor3 :: Expr3 -&amp;gt; [(Char,Int)] -&amp;gt; Int                   &lt;br /&gt;
-- tal que (valor3 x e) es el valor3 de la expresión x en el entorno e (es&lt;br /&gt;
-- decir, el valor3 de la expresión donde las variables de x se sustituyen&lt;br /&gt;
-- por los valores según se indican en el entorno e). Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; valor3 (P3 (C3 2) (S3 (V3 &amp;#039;a&amp;#039;) (V3 &amp;#039;b&amp;#039;))) [(&amp;#039;a&amp;#039;,2),(&amp;#039;b&amp;#039;,5)]&lt;br /&gt;
--    14&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr3 = C3 Int &lt;br /&gt;
           | V3 Char &lt;br /&gt;
           | S3 Expr3 Expr3 &lt;br /&gt;
           | P3 Expr3 Expr3  &lt;br /&gt;
           deriving (Show, Eq)&lt;br /&gt;
                   &lt;br /&gt;
valor3 :: Expr3 -&amp;gt; [(Char,Int)] -&amp;gt; Int                   &lt;br /&gt;
valor3 (C3 x)   _ = x&lt;br /&gt;
valor3 (V3 x)   e = head [y | (z,y) &amp;lt;- e, z == x]  &lt;br /&gt;
valor3 (S3 x y) e = valor3 x e + valor3 y e&lt;br /&gt;
valor3 (P3 x y) e = valor3 x e * valor3 y e&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir la función&lt;br /&gt;
--    sumas :: Expr3 -&amp;gt; Int&lt;br /&gt;
-- tal que (sumas e) es el número de sumas en la expresión e. Por &lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    sumas (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  1&lt;br /&gt;
--    sumas (S3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  2&lt;br /&gt;
--    sumas (P3 (V3 &amp;#039;z&amp;#039;) (P3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
                   &lt;br /&gt;
sumas :: Expr3 -&amp;gt; Int&lt;br /&gt;
sumas (V3 _)   = 0&lt;br /&gt;
sumas (C3 _)   = 0&lt;br /&gt;
sumas (S3 x y) = 1 + sumas x + sumas y&lt;br /&gt;
sumas (P3 x y) = sumas x + sumas y&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.3. Definir la función&lt;br /&gt;
--    sustitucion :: Expr3 -&amp;gt; [(Char, Int)] -&amp;gt; Expr3&lt;br /&gt;
-- tal que (sustitucion e s) es la expresión obtenida sustituyendo las&lt;br /&gt;
-- variables de la expresión e según se indica en la sustitución s. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ghci&amp;gt; sustitucion (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;))) [(&amp;#039;x&amp;#039;,7),(&amp;#039;z&amp;#039;,9)]&lt;br /&gt;
--    P3 (C3 9) (S3 (C3 3) (C3 7))&lt;br /&gt;
--    ghci&amp;gt; sustitucion (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;y&amp;#039;))) [(&amp;#039;x&amp;#039;,7),(&amp;#039;z&amp;#039;,9)]&lt;br /&gt;
--    P3 (C3 9) (S3 (C3 3) (V3 &amp;#039;y&amp;#039;))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
                   &lt;br /&gt;
sustitucion :: Expr3 -&amp;gt; [(Char, Int)] -&amp;gt; Expr3&lt;br /&gt;
sustitucion e [] = e&lt;br /&gt;
sustitucion (V3 c) ((d,n):ps) | c == d    = C3 n&lt;br /&gt;
                              | otherwise = sustitucion (V3 c) ps&lt;br /&gt;
sustitucion (C3 n) _ = C3 n                                 &lt;br /&gt;
sustitucion (S3 e1 e2) ps = S3 (sustitucion e1 ps) (sustitucion e2 ps)&lt;br /&gt;
sustitucion (P3 e1 e2) ps = P3 (sustitucion e1 ps) (sustitucion e2 ps)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.4. Definir la función&lt;br /&gt;
--    reducible :: Expr3 -&amp;gt; Bool&lt;br /&gt;
-- tal que (reducible a) se verifica si a es una expresión reducible; es&lt;br /&gt;
-- decir, contiene una operación en la que los dos operandos son números. &lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    reducible (S3 (C3 3) (C3 4))               == True&lt;br /&gt;
--    reducible (S3 (C3 3) (V3 &amp;#039;x&amp;#039;))             == False&lt;br /&gt;
--    reducible (S3 (C3 3) (P3 (C3 4) (C3 5)))   == True&lt;br /&gt;
--    reducible (S3 (V3 &amp;#039;x&amp;#039;) (P3 (C3 4) (C3 5))) == True&lt;br /&gt;
--    reducible (S3 (C3 3) (P3 (V3 &amp;#039;x&amp;#039;) (C3 5))) == False&lt;br /&gt;
--    reducible (C3 3)                           == False&lt;br /&gt;
--    reducible (V3 &amp;#039;x&amp;#039;)                         == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
reducible :: Expr3 -&amp;gt; Bool&lt;br /&gt;
reducible (C3 _)             = False&lt;br /&gt;
reducible (V3 _)             = False&lt;br /&gt;
reducible (S3 (C3 _) (C3 _)) = True&lt;br /&gt;
reducible (S3 a b)           = reducible a || reducible b&lt;br /&gt;
reducible (P3 (C3 _) (C3 _)) = True&lt;br /&gt;
reducible (P3 a b)           = reducible a || reducible b&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Las expresiones aritméticas generales se pueden definir&lt;br /&gt;
-- usando el siguiente tipo de datos &lt;br /&gt;
--    data Expr4 = C4 Int &lt;br /&gt;
--               | Y &lt;br /&gt;
--               | S4 Expr4 Expr4 &lt;br /&gt;
--               | R4 Expr4 Expr4 &lt;br /&gt;
--               | P4 Expr4 Expr4 &lt;br /&gt;
--               | E4 Expr4 Int&lt;br /&gt;
--               deriving (Eq, Show)&lt;br /&gt;
-- Por ejemplo, la expresión &lt;br /&gt;
--    3*x - (x+2)^7&lt;br /&gt;
-- se puede definir por&lt;br /&gt;
--    R4 (P4 (C4 3) Y) (E4 (S4 Y (C4 2)) 7)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función  &lt;br /&gt;
--    maximo :: Expr4 -&amp;gt; [Int] -&amp;gt; (Int,[Int])&lt;br /&gt;
-- tal que (maximo e xs) es el par formado por el máximo valor de la&lt;br /&gt;
-- expresión e para los puntos de xs y en qué puntos alcanza el&lt;br /&gt;
-- máximo. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; maximo (E4 (S4 (C4 10) (P4 (R4 (C4 1) Y) Y)) 2) [-3..3]&lt;br /&gt;
--    (100,[0,1])&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr4 = C4 Int &lt;br /&gt;
          | Y &lt;br /&gt;
          | S4 Expr4 Expr4 &lt;br /&gt;
          | R4 Expr4 Expr4 &lt;br /&gt;
          | P4 Expr4 Expr4 &lt;br /&gt;
          | E4 Expr4 Int&lt;br /&gt;
          deriving (Eq, Show)&lt;br /&gt;
&lt;br /&gt;
maximo :: Expr4 -&amp;gt; [Int] -&amp;gt; (Int,[Int])&lt;br /&gt;
maximo e ns = (m,[n | n &amp;lt;- ns, valor4 e n == m])  &lt;br /&gt;
    where m = maximum [valor4 e n | n &amp;lt;- ns]&lt;br /&gt;
          valor4 :: Expr4 -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
          valor4 (C4 x) _ = x&lt;br /&gt;
          valor4 Y     n = n&lt;br /&gt;
          valor4 (S4 e1 e2) n = valor4 e1 n + valor4 e2 n&lt;br /&gt;
          valor4 (R4 e1 e2) n = valor4 e1 n - valor4 e2 n&lt;br /&gt;
          valor4 (P4 e1 e2) n = valor4 e1 n * valor4 e2 n&lt;br /&gt;
          valor4 (E4 e1 m1) n = valor4 e1 n ^ m1&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Las operaciones de suma, resta y  multiplicación se&lt;br /&gt;
-- pueden representar mediante el siguiente tipo de datos &lt;br /&gt;
--    data Op = Su | Re | Mu&lt;br /&gt;
-- La expresiones aritméticas con dichas operaciones se pueden&lt;br /&gt;
-- representar mediante el siguiente tipo de dato algebraico&lt;br /&gt;
--    data Expr5 = C5 Int &lt;br /&gt;
--               | A Op Expr5 Expr&lt;br /&gt;
-- Por ejemplo, la expresión&lt;br /&gt;
--    (7-3)+(2*5)&lt;br /&gt;
-- se representa por&lt;br /&gt;
--    A Su (A Re (C5 7) (C5 3)) (A Mu (C5 2) (C5 5))&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valorEG :: Expr5 -&amp;gt; Int&lt;br /&gt;
-- tal que (valorEG e) es el valorEG de la expresión e. Por ejemplo,&lt;br /&gt;
--    valorEG (A Su (A Re (C5 7) (C5 3)) (A Mu (C5 2) (C5 5)))  ==  14&lt;br /&gt;
--    valorEG (A Mu (A Re (C5 7) (C5 3)) (A Su (C5 2) (C5 5)))  ==  28&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Op = Su | Re | Mu&lt;br /&gt;
&lt;br /&gt;
data Expr5 = C5 Int | A Op Expr5 Expr5&lt;br /&gt;
&lt;br /&gt;
-- 1Ş definición&lt;br /&gt;
valorEG :: Expr5 -&amp;gt; Int&lt;br /&gt;
valorEG (C5 x)      = x&lt;br /&gt;
valorEG (A o e1 e2) = aplica2 o (valorEG e1) (valorEG e2)&lt;br /&gt;
    where aplica2 :: Op -&amp;gt; Int -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
          aplica2 Su x y = x+y&lt;br /&gt;
          aplica2 Re x y = x-y&lt;br /&gt;
          aplica2 Mu x y = x*y&lt;br /&gt;
&lt;br /&gt;
-- 2Ş definición&lt;br /&gt;
valorEG2 :: Expr5 -&amp;gt; Int&lt;br /&gt;
valorEG2 (C5 n)    = n&lt;br /&gt;
valorEG2 (A o x y) = (sig o) (valorEG2 x) (valorEG2 y)&lt;br /&gt;
  where sig Su = (+)&lt;br /&gt;
        sig Mu = (*)&lt;br /&gt;
        sig Re = (-)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Se consideran las expresiones vectoriales formadas por&lt;br /&gt;
-- un vector, la suma de dos expresiones vectoriales o el producto de un&lt;br /&gt;
-- entero por una expresión vectorial. El siguiente tipo de dato define&lt;br /&gt;
-- las expresiones vectoriales  &lt;br /&gt;
--    data ExpV = Vec Int Int&lt;br /&gt;
--              | Sum ExpV ExpV&lt;br /&gt;
--              | Mul Int ExpV&lt;br /&gt;
--              deriving Show&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorEV :: ExpV -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que (valorEV e) es el valorEV de la expresión vectorial c. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    valorEV (Vec 1 2)                                  ==  (1,2)&lt;br /&gt;
--    valorEV (Sum (Vec 1 2 ) (Vec 3 4))                 ==  (4,6)&lt;br /&gt;
--    valorEV (Mul 2 (Vec 3 4))                          ==  (6,8)&lt;br /&gt;
--    valorEV (Mul 2 (Sum (Vec 1 2 ) (Vec 3 4)))         ==  (8,12)&lt;br /&gt;
--    valorEV (Sum (Mul 2 (Vec 1 2)) (Mul 2 (Vec 3 4)))  ==  (8,12)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ExpV = Vec Int Int&lt;br /&gt;
          | Sum ExpV ExpV&lt;br /&gt;
          | Mul Int ExpV&lt;br /&gt;
          deriving Show&lt;br /&gt;
&lt;br /&gt;
-- 1Ş solución&lt;br /&gt;
-- ===========&lt;br /&gt;
valorEV :: ExpV -&amp;gt; (Int,Int)&lt;br /&gt;
valorEV (Vec x y)   = (x,y)&lt;br /&gt;
valorEV (Sum e1 e2) = (x1+x2,y1+y2) &lt;br /&gt;
    where (x1,y1) = valorEV e1  &lt;br /&gt;
          (x2,y2) = valorEV e2  &lt;br /&gt;
valorEV (Mul n e)   = (n*x,n*y) &lt;br /&gt;
    where (x,y) = valorEV e  &lt;br /&gt;
&lt;br /&gt;
-- 2Ş solución&lt;br /&gt;
-- ===========&lt;br /&gt;
valorEV2 :: ExpV -&amp;gt; (Int,Int)&lt;br /&gt;
valorEV2 (Vec a b)   = (a, b)&lt;br /&gt;
valorEV2 (Sum e1 e2) = suma (valorEV2 e1) (valorEV2 e2)&lt;br /&gt;
valorEV2 (Mul n e1)  = multiplica n (valorEV2 e1)&lt;br /&gt;
&lt;br /&gt;
suma :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
suma (a,b) (c,d) = (a+c,b+d)&lt;br /&gt;
&lt;br /&gt;
multiplica :: Int -&amp;gt; (Int, Int) -&amp;gt; (Int, Int)&lt;br /&gt;
multiplica n (a,b) = (n*a,n*b)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. (Examen 12 de marzo de 2015, grupo 4)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Consideremos los árboles binarios con etiquetas en las&lt;br /&gt;
-- hojas y en los nodos. Por ejemplo,&lt;br /&gt;
--          5       &lt;br /&gt;
--         / \      &lt;br /&gt;
--        2   4      &lt;br /&gt;
--           / \    &lt;br /&gt;
--          7   1&lt;br /&gt;
--             / \&lt;br /&gt;
--            2   3   &lt;br /&gt;
-- &lt;br /&gt;
-- Un camino es una sucesión de nodos desde la raiz hasta una hoja. Por&lt;br /&gt;
-- ejemplo, [5,2] y [5,4,1,2] son caminos que llevan a 2, mientras que&lt;br /&gt;
-- [5,4,1] no es un camino, pues no lleva a una hoja.&lt;br /&gt;
-- &lt;br /&gt;
-- Definimos el tipo de dato Arbol y el ejemplo por&lt;br /&gt;
--    data Arbol = H Int | N Arbol Int Arbol &lt;br /&gt;
--                 deriving Show&lt;br /&gt;
--    &lt;br /&gt;
--    arb1:: Arbol &lt;br /&gt;
--    arb1 = N (H 2) 5 (N (H 7) 4 (N (H 2) 1 (H 3)))&lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    maxLong :: Int -&amp;gt; Arbol -&amp;gt; Int&lt;br /&gt;
-- tal que (maxLong x a) es la longitud máxima de los caminos que&lt;br /&gt;
-- terminan en x. Por ejemplo, &lt;br /&gt;
--    maxLong 3 arb1 == 4&lt;br /&gt;
--    maxLong 2 arb1 == 4&lt;br /&gt;
--    maxLong 7 arb1 == 3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol = H Int | N Arbol Int Arbol &lt;br /&gt;
             deriving Show&lt;br /&gt;
&lt;br /&gt;
arb1:: Arbol &lt;br /&gt;
arb1 = N (H 2) 5 (N (H 7) 4 (N (H 2) 1 (H 3)))&lt;br /&gt;
&lt;br /&gt;
-- 1Ş solución (calculando los caminos)&lt;br /&gt;
-- ------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- (caminos x a) es la lista de los caminos en el árbol a desde la raíz&lt;br /&gt;
-- hasta las hojas x. Por ejemplo,&lt;br /&gt;
--    caminos 2 arb1 == [[5,2],[5,4,1,2]]&lt;br /&gt;
--    caminos 3 arb1 == [[5,4,1,3]]&lt;br /&gt;
--    caminos 1 arb1 == []&lt;br /&gt;
caminos :: Int -&amp;gt; Arbol -&amp;gt; [[Int]]&lt;br /&gt;
caminos x (H y) | x == y    = [[x]]&lt;br /&gt;
                | otherwise = []&lt;br /&gt;
caminos x (N i r d) = map (r:) (caminos x i ++ caminos x d)&lt;br /&gt;
&lt;br /&gt;
maxLong1 :: Int -&amp;gt; Arbol -&amp;gt; Int&lt;br /&gt;
maxLong1 x a = maximum (0: map length (caminos x a))&lt;br /&gt;
&lt;br /&gt;
-- 2Ş solución&lt;br /&gt;
-- -----------&lt;br /&gt;
&lt;br /&gt;
maxLong2 :: Int -&amp;gt; Arbol -&amp;gt; Int&lt;br /&gt;
maxLong2 x a = maximum (0 : aux x a)&lt;br /&gt;
    where aux x (H y) | x == y    = [1]&lt;br /&gt;
                      | otherwise = []&lt;br /&gt;
          aux x (N i r d) = map (+1) (aux x i ++ aux x d)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. (Examen 5 de diciembre de 2017, grupo 1)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Los árboles con un número variable de sucesores se&lt;br /&gt;
-- pueden representar mediante el siguiente tipo de dato&lt;br /&gt;
--    data Arbol a = N a [Arbol a]&lt;br /&gt;
--      deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1         1             1          &lt;br /&gt;
--     / \       / \           / \   &lt;br /&gt;
--    8   3     8   3         8   3  &lt;br /&gt;
--        |        /|\       /|\  |   &lt;br /&gt;
--        4       4 5 6     4 5 6 7&lt;br /&gt;
-- se representan por&lt;br /&gt;
--    ej1, ej2, ej3 :: Arbol Int&lt;br /&gt;
--    ej1 = N 1 [N 8 [],N 3 [N 4 []]]&lt;br /&gt;
--    ej2 = N 1 [N 8 [], N 3 [N 4 [], N 5 [], N 6 []]]&lt;br /&gt;
--    ej3 = N 1 [N 8 [N 4 [], N 5 [], N 6 []], N 3 [N 7 []]]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     caminosDesdeRaiz :: Arbol a -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (caminosDesdeRaiz x) es la lista de todos los caminos desde&lt;br /&gt;
-- la raiz. Por ejemplo,&lt;br /&gt;
--     caminosDesdeRaiz ej1 == [[1,8],[1,3,4]]&lt;br /&gt;
--     caminosDesdeRaiz ej2 == [[1,8],[1,3,4],[1,3,5],[1,3,6]]&lt;br /&gt;
--     caminosDesdeRaiz ej3 == [[1,8,4],[1,8,5],[1,8,6],[1,3,7]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol a = N a [Arbol a]&lt;br /&gt;
  deriving Show&lt;br /&gt;
&lt;br /&gt;
ej1, ej2, ej3 :: Arbol Int&lt;br /&gt;
ej1 = N 1 [N 8 [],N 3 [N 4 []]]&lt;br /&gt;
ej2 = N 1 [N 8 [], N 3 [N 4 [], N 5 [], N 6 []]]&lt;br /&gt;
ej3 = N 1 [N 8 [N 4 [], N 5 [], N 6 []], N 3 [N 7 []]]&lt;br /&gt;
&lt;br /&gt;
caminosDesdeRaiz :: Arbol a -&amp;gt; [[a]]&lt;br /&gt;
caminosDesdeRaiz (N r []) = [[r]]&lt;br /&gt;
caminosDesdeRaiz (N r as) = map (r:) (concatMap caminosDesdeRaiz as)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14. (Examen 1 de septiembre de 2016)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Los árboles se pueden representar mediante el siguiente&lt;br /&gt;
-- tipo de datos &lt;br /&gt;
--    data Arbol a = N a [Arbol a]&lt;br /&gt;
--                   deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1               3&lt;br /&gt;
--     / \             /|\ &lt;br /&gt;
--    2   3           / | \&lt;br /&gt;
--        |          5  4  7&lt;br /&gt;
--        4          |     /\ &lt;br /&gt;
--                   6    2  1&lt;br /&gt;
-- se representan por&lt;br /&gt;
--    ej1, ej2 :: Arbol Int&lt;br /&gt;
--    ej1 = N 1 [N 2 [],N 3 [N 4 []]]&lt;br /&gt;
--    ej2 = N 3 [N 5 [N 6 []], N 4 [], N 7 [N 2 [], N 1 []]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    ramasLargas :: Arbol b -&amp;gt; [[b]]&lt;br /&gt;
-- tal que (ramasLargas a) es la lista de las ramas más largas del árbol&lt;br /&gt;
-- a. Por ejemplo, &lt;br /&gt;
--    ramas ej1  ==  [[1,3,4]]&lt;br /&gt;
--    ramas ej2  ==  [[3,5,6],[3,7,2],[3,7,1]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol a = N a [Arbol a]&lt;br /&gt;
  deriving Show&lt;br /&gt;
&lt;br /&gt;
ej1, ej2 :: Arbol Int&lt;br /&gt;
ej1 = N 1 [N 2 [],N 3 [N 4 []]]&lt;br /&gt;
ej2 = N 3 [N 5 [N 6 []], N 4 [], N 7 [N 2 [], N 1 []]]&lt;br /&gt;
&lt;br /&gt;
ramasLargas :: Arbol b -&amp;gt; [[b]]&lt;br /&gt;
ramasLargas a = [xs | xs &amp;lt;- todasRamas,&lt;br /&gt;
                      length xs == m]&lt;br /&gt;
  where todasRamas = ramas a&lt;br /&gt;
        m = maximum (map length todasRamas)&lt;br /&gt;
&lt;br /&gt;
-- (ramas a) es la lista de todas las ramas del árbol a. Por ejemplo, &lt;br /&gt;
--    ramas ej1  ==  [[1,2],[1,3,4]]&lt;br /&gt;
--    ramas ej2  ==  [[3,5,6],[3,4],[3,7,2],[3,7,1]]&lt;br /&gt;
ramas :: Arbol b -&amp;gt; [[b]]&lt;br /&gt;
ramas (N x []) = [[x]]&lt;br /&gt;
ramas (N x as) = [x : xs | a &amp;lt;- as, xs &amp;lt;- ramas a]&lt;br /&gt;
&lt;br /&gt;
-- 2Ş solución:&lt;br /&gt;
ramas2 :: Arbol b -&amp;gt; [[b]]&lt;br /&gt;
ramas2 (N x []) = [[x]]&lt;br /&gt;
ramas2 (N x as) = concatMap (map (x:)) (map ramas2 as)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_13_Sol&amp;diff=584</id>
		<title>Relación 13 Sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_13_Sol&amp;diff=584"/>
		<updated>2022-01-11T11:59:38Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Página creada con «&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;  -- I1M 2021-22: Relación 13 solución -- Tipos de datos algebraicos (II). -- Departamento de Ciencias de la Computación e I.A. -- Universidad de…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Relación 13 solución&lt;br /&gt;
-- Tipos de datos algebraicos (II).&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- En esta relación se presenta ejercicios sobre distintos tipos de&lt;br /&gt;
-- datos algebraicos. Concretamente,&lt;br /&gt;
--    * Árboles binarios:&lt;br /&gt;
--      + Árboles binarios con valores en los nodos.&lt;br /&gt;
--      + Árboles binarios con valores en las hojas.&lt;br /&gt;
--      + Árboles binarios con valores en las hojas y en los nodos.&lt;br /&gt;
--      + Árboles booleanos.  &lt;br /&gt;
--    * Árboles generales&lt;br /&gt;
--    * Expresiones aritméticas&lt;br /&gt;
--      + Expresiones aritméticas básicas.&lt;br /&gt;
--      + Expresiones aritméticas con una variable.&lt;br /&gt;
--      + Expresiones aritméticas con varias variables.&lt;br /&gt;
--      + Expresiones aritméticas generales. &lt;br /&gt;
--      + Expresiones aritméticas con tipo de operaciones.&lt;br /&gt;
--    * Expresiones vectoriales&lt;br /&gt;
-- &lt;br /&gt;
-- Los ejercicios corresponden al tema 9 que se encuentran en &lt;br /&gt;
--    http://www.cs.us.es/~jalonso/cursos/temas/tema-9.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Los árboles binarios con valores en los nodos se&lt;br /&gt;
-- pueden definir por&lt;br /&gt;
--    data Arbol1 a = H1 &lt;br /&gt;
--                  | N1 a (Arbol1 a) (Arbol1 a)&lt;br /&gt;
--                  deriving (Show, Eq)&lt;br /&gt;
-- Por ejemplo, el árbol&lt;br /&gt;
--         9                &lt;br /&gt;
--        / \    &lt;br /&gt;
--       /   \   &lt;br /&gt;
--      8     6  &lt;br /&gt;
--     / \   / \ &lt;br /&gt;
--    3   2 4   5&lt;br /&gt;
-- se puede representar por&lt;br /&gt;
--    N1 9 (N1 8 (N1 3 H1 H1) (N1 2 H1 H1)) (N1 6 (N1 4 H1 H1) (N1 5 H1 H1))&lt;br /&gt;
--&lt;br /&gt;
-- Definir por recursión la función &lt;br /&gt;
--    sumaArbol :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
-- tal (sumaArbol x) es la suma de los valores que hay en el árbol&lt;br /&gt;
-- x. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; sumaArbol (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))  &lt;br /&gt;
--    21&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol1 a = H1 &lt;br /&gt;
             | N1 a (Arbol1 a) (Arbol1 a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
&lt;br /&gt;
sumaArbol :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
sumaArbol H1         = 0&lt;br /&gt;
sumaArbol (N1 x i d) = x + sumaArbol i + sumaArbol d&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la función &lt;br /&gt;
--    mapArbol :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
-- tal que (mapArbol f x) es el árbol que resulta de sustituir cada nodo&lt;br /&gt;
-- n del árbol x por (f n). Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; mapArbol (+1) (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))&lt;br /&gt;
--    N1 3 (N1 6 (N1 4 H1 H1) (N1 8 H1 H1)) (N1 5 H1 H1)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
mapArbol :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
mapArbol _ H1         = H1&lt;br /&gt;
mapArbol f (N1 x i d) = N1 (f x) (mapArbol f i) (mapArbol f d)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la función&lt;br /&gt;
--    ramaIzquierda :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
-- tal que (ramaIzquierda a) es la lista de los valores de los nodos de&lt;br /&gt;
-- la rama izquierda del árbol a. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; ramaIzquierda (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))&lt;br /&gt;
--    [2,5,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ramaIzquierda :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
ramaIzquierda H1         = []&lt;br /&gt;
ramaIzquierda (N1 x i _) = x : ramaIzquierda i&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.4. Diremos que un árbol está balanceado si para cada nodo&lt;br /&gt;
-- v la diferencia entre el número de nodos (con valor) de sus subárboles&lt;br /&gt;
-- izquierdo y derecho es menor o igual que uno.  &lt;br /&gt;
--&lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    balanceado :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
-- tal que (balanceado a) se verifica si el árbol a está balanceado. Por &lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    balanceado (N1 5 H1 (N1 3 H1 H1))           == True&lt;br /&gt;
--    balanceado (N1 5 H1 (N1 3 (N1 4 H1 H1) H1)) == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
balanceado :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
balanceado H1         = True&lt;br /&gt;
balanceado (N1 _ i d) = (abs (numeroNodos i - numeroNodos d) &amp;lt;= 1)&lt;br /&gt;
  &amp;amp;&amp;amp; balanceado i &amp;amp;&amp;amp; balanceado d&lt;br /&gt;
&lt;br /&gt;
-- (numeroNodos a) es el número de nodos del árbol a. Por ejemplo,&lt;br /&gt;
--    numeroNodos (N1 5 H1 (N1 3 H1 H1)) ==  2&lt;br /&gt;
numeroNodos :: Arbol1 a -&amp;gt; Int&lt;br /&gt;
numeroNodos H1         = 0&lt;br /&gt;
numeroNodos (N1 _ i d) = 1 + numeroNodos i + numeroNodos d&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Los árboles binarios con valores en las hojas se pueden&lt;br /&gt;
-- definir por&lt;br /&gt;
--    data Arbol2 a = H2 a&lt;br /&gt;
--                  | N2 (Arbol2 a) (Arbol2 a) &lt;br /&gt;
--                  deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles &lt;br /&gt;
--    árbol1          árbol2       árbol3     árbol4 &lt;br /&gt;
--       o              o           o           o    &lt;br /&gt;
--      / \            / \         / \         / \   &lt;br /&gt;
--     1   o          o   3       o   3       o   1  &lt;br /&gt;
--        / \        / \         / \         / \     &lt;br /&gt;
--       2   3      1   2       1   4       2   3    &lt;br /&gt;
-- se representan por&lt;br /&gt;
--    arbol1, arbol2, arbol3, arbol4 :: Arbol2 Int&lt;br /&gt;
--    arbol1 = N2 (H2 1) (N2 (H2 2) (H2 3))&lt;br /&gt;
--    arbol2 = N2 (N2 (H2 1) (H2 2)) (H2 3)&lt;br /&gt;
--    arbol3 = N2 (N2 (H2 1) (H2 4)) (H2 3)&lt;br /&gt;
--    arbol4 = N2 (N2 (H2 2) (H2 3)) (H2 1)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    igualBorde :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
-- tal que (igualBorde t1 t2) se verifica si los bordes de los árboles&lt;br /&gt;
-- t1 y t2 son iguales. Por ejemplo,&lt;br /&gt;
--    igualBorde arbol1 arbol2  ==  True&lt;br /&gt;
--    igualBorde arbol1 arbol3  ==  False&lt;br /&gt;
--    igualBorde arbol1 arbol4  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol2 a = N2 (Arbol2 a) (Arbol2 a) &lt;br /&gt;
              | H2 a&lt;br /&gt;
              deriving Show&lt;br /&gt;
&lt;br /&gt;
arbol1, arbol2, arbol3, arbol4 :: Arbol2 Int&lt;br /&gt;
arbol1 = N2 (H2 1) (N2 (H2 2) (H2 3))&lt;br /&gt;
arbol2 = N2 (N2 (H2 1) (H2 2)) (H2 3)&lt;br /&gt;
arbol3 = N2 (N2 (H2 1) (H2 4)) (H2 3)&lt;br /&gt;
arbol4 = N2 (N2 (H2 2) (H2 3)) (H2 1)&lt;br /&gt;
&lt;br /&gt;
igualBorde :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
igualBorde t1 t2 = borde t1 == borde t2&lt;br /&gt;
&lt;br /&gt;
-- (borde t) es el borde del árbol t; es decir, la lista de las hojas&lt;br /&gt;
-- del árbol t leídas de izquierda a derecha. Por ejemplo, &lt;br /&gt;
--    borde arbol4  ==  [2,3,1]&lt;br /&gt;
borde :: Arbol2 a -&amp;gt; [a]&lt;br /&gt;
borde (N2 i d) = borde i ++ borde d&lt;br /&gt;
borde (H2 x)   = [x]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Los árboles binarios con valores en las hojas y en los&lt;br /&gt;
-- nodos se definen por&lt;br /&gt;
--    data Arbol3 a = H3 a&lt;br /&gt;
--                 | N3 a (Arbol3 a) (Arbol3 a) &lt;br /&gt;
--                 deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--         5              8             5           5&lt;br /&gt;
--        / \            / \           / \         / \&lt;br /&gt;
--       /   \          /   \         /   \       /   \&lt;br /&gt;
--      9     7        9     3       9     2     4     7&lt;br /&gt;
--     / \   / \      / \   / \     / \               / \&lt;br /&gt;
--    1   4 6   8    1   4 6   2   1   4             6   2&lt;br /&gt;
-- se pueden representar por&lt;br /&gt;
--    ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol3 Int&lt;br /&gt;
--    ej3arbol1 = N3 5 (N3 9 (H3 1) (H3 4)) (N3 7 (H3 6) (H3 8))&lt;br /&gt;
--    ej3arbol2 = N3 8 (N3 9 (H3 1) (H3 4)) (N3 3 (H3 6) (H3 2))&lt;br /&gt;
--    ej3arbol3 = N3 5 (N3 9 (H3 1) (H3 4)) (H3 2)&lt;br /&gt;
--    ej3arbol4 = N3 5 (H3 4) (N3 7 (H3 6) (H3 2))&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    igualEstructura :: Arbol3 -&amp;gt; Arbol3 -&amp;gt; Bool&lt;br /&gt;
-- tal que (igualEstructura a1 a1) se verifica si los árboles a1 y a2 &lt;br /&gt;
-- tienen la misma estructura. Por ejemplo,&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol2 == True&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol3 == False&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol4 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol3 a = H3 a&lt;br /&gt;
              | N3 a (Arbol3 a) (Arbol3 a) &lt;br /&gt;
              deriving (Show, Eq)&lt;br /&gt;
&lt;br /&gt;
ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol3 Int&lt;br /&gt;
ej3arbol1 = N3 5 (N3 9 (H3 1) (H3 4)) (N3 7 (H3 6) (H3 8))&lt;br /&gt;
ej3arbol2 = N3 8 (N3 9 (H3 1) (H3 4)) (N3 3 (H3 6) (H3 2))&lt;br /&gt;
ej3arbol3 = N3 5 (N3 9 (H3 1) (H3 4)) (H3 2)&lt;br /&gt;
ej3arbol4 = N3 5 (H3 4) (N3 7 (H3 6) (H3 2))&lt;br /&gt;
&lt;br /&gt;
igualEstructura :: Arbol3 a -&amp;gt; Arbol3 a -&amp;gt; Bool&lt;br /&gt;
igualEstructura (H3 _) (H3 _) = True&lt;br /&gt;
igualEstructura (N3 _ i1 d1) (N3 _ i2 d2) = &lt;br /&gt;
    igualEstructura i1 i2 &amp;amp;&amp;amp; igualEstructura d1 d2&lt;br /&gt;
igualEstructura _ _                       = False  &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Definir la función&lt;br /&gt;
--    algunoArbol :: Arbol3 t -&amp;gt; (t -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
-- tal que (algunoArbol a p) se verifica si algún elemento del árbol a&lt;br /&gt;
-- cumple la propiedad p. Por ejemplo,&lt;br /&gt;
--    algunoArbol (N3 5 (N3 3 (H3 1) (H3 4)) (H3 2)) (&amp;gt;4)  ==  True&lt;br /&gt;
--    algunoArbol (N3 5 (N3 3 (H3 1) (H3 4)) (H3 2)) (&amp;gt;7)  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
algunoArbol :: Arbol3 a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
algunoArbol (H3 x) p     = p x&lt;br /&gt;
algunoArbol (N3 x i d) p = p x || algunoArbol i p || algunoArbol d p&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.3. Un elemento de un árbol se dirá de nivel k si aparece&lt;br /&gt;
-- en el árbol a distancia k  de la raíz.  &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    nivel :: Int -&amp;gt; Arbol3 a -&amp;gt; [a]&lt;br /&gt;
-- tal que (nivel k a) es la lista de los elementos de nivel k del árbol&lt;br /&gt;
-- a. Por ejemplo,&lt;br /&gt;
--    nivel 0 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [7]&lt;br /&gt;
--    nivel 1 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [2,9]&lt;br /&gt;
--    nivel 2 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [5,4]&lt;br /&gt;
--    nivel 3 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
nivel :: Int -&amp;gt; Arbol3 a -&amp;gt; [a]&lt;br /&gt;
nivel 0 (H3 x)      = [x]&lt;br /&gt;
nivel 0 (N3 x _  _) = [x]&lt;br /&gt;
nivel _ (H3 _ )     = []&lt;br /&gt;
nivel k (N3 _ i d)  = nivel (k-1) i ++ nivel (k-1) d&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.4. Los divisores medios de un número son los que ocupan&lt;br /&gt;
-- la posición media entre los divisores de n, ordenados de menor a&lt;br /&gt;
-- mayor. Por ejemplo, los divisores de 60 son &lt;br /&gt;
-- [1,2,3,4,5,6,10,12,15,20,30,60] y sus divisores medios son 6 y 10.&lt;br /&gt;
-- &lt;br /&gt;
-- El árbol de factorización de un número compuesto n se construye de la&lt;br /&gt;
-- siguiente manera: &lt;br /&gt;
--    * la raíz es el número n, &lt;br /&gt;
--    * la rama izquierda es el árbol de factorización de su divisor&lt;br /&gt;
--      medio menor y&lt;br /&gt;
--    * la rama derecha es el árbol de factorización de su divisor&lt;br /&gt;
--      medio mayor&lt;br /&gt;
-- Si el número es primo, su árbol de factorización sólo tiene una hoja&lt;br /&gt;
-- con dicho número. Por ejemplo, el árbol de factorización de 60 es&lt;br /&gt;
--        60&lt;br /&gt;
--       /  \&lt;br /&gt;
--      6    10&lt;br /&gt;
--     / \   / \&lt;br /&gt;
--    2   3 2   5&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    arbolFactorizacion :: Int -&amp;gt; Arbol3&lt;br /&gt;
-- tal que (arbolFactorizacion n) es el árbol de factorización de n. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    arbolFactorizacion 60 == N3 60 (N3 6 (H3 2) (H3 3)) (N3 10 (H3 2) (H3 5))&lt;br /&gt;
--    arbolFactorizacion 45 == N3 45 (H3 5) (N3 9 (H3 3) (H3 3))&lt;br /&gt;
--    arbolFactorizacion 7  == H3 7&lt;br /&gt;
--    arbolFactorizacion 9  == N3 9 (H3 3) (H3 3)&lt;br /&gt;
--    arbolFactorizacion 14 == N3 14 (H3 2) (H3 7)&lt;br /&gt;
--    arbolFactorizacion 28 == N3 28 (N3 4 (H3 2) (H3 2)) (H3 7)&lt;br /&gt;
--    arbolFactorizacion 84 == N3 84 (H3 7) (N3 12 (H3 3) (N3 4 (H3 2) (H3 2)))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1Ş definición&lt;br /&gt;
-- =============&lt;br /&gt;
arbolFactorizacion :: Int -&amp;gt; Arbol3 Int&lt;br /&gt;
arbolFactorizacion n &lt;br /&gt;
    | esPrimo n = H3 n&lt;br /&gt;
    | otherwise = N3 n (arbolFactorizacion x) (arbolFactorizacion y)&lt;br /&gt;
    where (x,y) = divisoresMedio n&lt;br /&gt;
&lt;br /&gt;
-- (esPrimo n) se verifica si n es primo. Por ejemplo,&lt;br /&gt;
--    esPrimo 7  ==  True&lt;br /&gt;
--    esPrimo 9  ==  False&lt;br /&gt;
esPrimo :: Int -&amp;gt; Bool&lt;br /&gt;
esPrimo n = divisores n == [1,n]&lt;br /&gt;
&lt;br /&gt;
-- (divisoresMedio n) es el par formado por los divisores medios de&lt;br /&gt;
-- n. Por ejemplo,&lt;br /&gt;
--    divisoresMedio 30  ==  (5,6)&lt;br /&gt;
--    divisoresMedio  7  ==  (1,7)&lt;br /&gt;
--    divisoresMedio 16  ==  (4,4)&lt;br /&gt;
divisoresMedio :: Int -&amp;gt; (Int,Int)&lt;br /&gt;
divisoresMedio n = (n `div` x,x)&lt;br /&gt;
    where xs = divisores n&lt;br /&gt;
          x  = xs !! (length xs `div` 2)&lt;br /&gt;
&lt;br /&gt;
-- (divisores n) es la lista de los divisores de n. Por ejemplo,&lt;br /&gt;
--    divisores 30  ==  [1,2,3,5,6,10,15,30]&lt;br /&gt;
divisores :: Int -&amp;gt; [Int]&lt;br /&gt;
divisores n = [x | x &amp;lt;- [1..n], n `rem` x == 0]&lt;br /&gt;
&lt;br /&gt;
-- 2Ş definición&lt;br /&gt;
-- =============&lt;br /&gt;
arbolFactorizacion2 :: Int -&amp;gt; Arbol3 Int&lt;br /&gt;
arbolFactorizacion2 n&lt;br /&gt;
    | x == 1    = H3 n&lt;br /&gt;
    | otherwise = N3 n (arbolFactorizacion x) (arbolFactorizacion y)&lt;br /&gt;
    where (x,y) = divisoresMedio n&lt;br /&gt;
&lt;br /&gt;
-- (divisoresMedio2 n) es el par formado por los divisores medios de&lt;br /&gt;
-- n. Por ejemplo,&lt;br /&gt;
--    divisoresMedio2 30  ==  (5,6)&lt;br /&gt;
--    divisoresMedio2  7  ==  (1,7)&lt;br /&gt;
divisoresMedio2 :: Int -&amp;gt; (Int,Int)&lt;br /&gt;
divisoresMedio2 n = (n `div` x,x)&lt;br /&gt;
    where m  = ceiling (sqrt (fromIntegral n))&lt;br /&gt;
          x = head [y | y &amp;lt;- [m..n], n `rem` y == 0]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se consideran los árboles con operaciones booleanas&lt;br /&gt;
-- definidos por   &lt;br /&gt;
--    data ArbolB = HB Bool &lt;br /&gt;
--                | Conj ArbolB ArbolB&lt;br /&gt;
--                | Disy ArbolB ArbolB&lt;br /&gt;
--                | Neg ArbolB&lt;br /&gt;
-- &lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--                Conj                            Conj          &lt;br /&gt;
--               /   \                           /   \          &lt;br /&gt;
--              /     \                         /     \         &lt;br /&gt;
--           Disy      Conj                  Disy      Conj     &lt;br /&gt;
--          /   \       /  \                /   \      /   \    &lt;br /&gt;
--       Conj    Neg   Neg True          Conj    Neg   Neg  True &lt;br /&gt;
--       /  \    |     |                 /  \    |     |        &lt;br /&gt;
--    True False False False          True False True  False     &lt;br /&gt;
--&lt;br /&gt;
-- se definen por&lt;br /&gt;
--    ej1, ej2:: ArbolB&lt;br /&gt;
--    ej1 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
--                     (Neg (HB False)))&lt;br /&gt;
--               (Conj (Neg (HB False))&lt;br /&gt;
--                     (HB True))&lt;br /&gt;
--    &lt;br /&gt;
--    ej2 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
--                     (Neg (HB True)))&lt;br /&gt;
--               (Conj (Neg (HB False))&lt;br /&gt;
--                     (HB True))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorB :: ArbolB -&amp;gt; Bool&lt;br /&gt;
-- tal que (valorB ar) es el resultado de procesar el árbol realizando&lt;br /&gt;
-- las operaciones booleanas especificadas en los nodos. Por ejemplo,&lt;br /&gt;
--    valorB ej1 == True&lt;br /&gt;
--    valorB ej2 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ArbolB = HB Bool &lt;br /&gt;
            | Conj ArbolB ArbolB&lt;br /&gt;
            | Disy ArbolB ArbolB&lt;br /&gt;
            | Neg ArbolB&lt;br /&gt;
&lt;br /&gt;
ej1, ej2 :: ArbolB&lt;br /&gt;
ej1 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
                 (Neg (HB False)))&lt;br /&gt;
           (Conj (Neg (HB False))&lt;br /&gt;
                 (HB True))&lt;br /&gt;
&lt;br /&gt;
ej2 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
                 (Neg (HB True)))&lt;br /&gt;
           (Conj (Neg (HB False))&lt;br /&gt;
                 (HB True))&lt;br /&gt;
&lt;br /&gt;
valorB:: ArbolB -&amp;gt; Bool&lt;br /&gt;
valorB (HB x)     = x&lt;br /&gt;
valorB (Neg a)    = not (valorB a)&lt;br /&gt;
valorB (Conj i d) = valorB i &amp;amp;&amp;amp; valorB d&lt;br /&gt;
valorB (Disy i d) = valorB i || valorB d&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Los árboles generales se pueden representar mediante el&lt;br /&gt;
-- siguiente tipo de dato  &lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--                  deriving (Eq, Show)&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1               3               3&lt;br /&gt;
--     / \             /|\            / | \&lt;br /&gt;
--    2   3           / | \          /  |  \&lt;br /&gt;
--        |          5  4  7        5   4   7&lt;br /&gt;
--        4          |     /\       |   |  / \&lt;br /&gt;
--                   6    2  1      6   1 2   1&lt;br /&gt;
--                                     / \&lt;br /&gt;
--                                    2   3&lt;br /&gt;
--                                        |&lt;br /&gt;
--                                        4&lt;br /&gt;
-- se representan por&lt;br /&gt;
--    ejG1, ejG2, ejG3 :: ArbolG Int&lt;br /&gt;
--    ejG1 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ejG2 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
--                 NG 4 [], &lt;br /&gt;
--                 NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
--    ejG3 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
--                 NG 4 [NG 1 [NG 2 [],NG 3 [NG 4 []]]], &lt;br /&gt;
--                 NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     ramifica :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
-- tal que (ramifica a1 a2 p) el árbol que resulta de ańadir una copia&lt;br /&gt;
-- del árbol a2 a los nodos de a1 que cumplen un predicado p. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;4) =&amp;gt;  NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;3) =&amp;gt;  NG 1 [NG 2 [],NG 3 [NG 4 [NG 8 []]]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;2) =&amp;gt;  NG 1 [NG 2 [],NG 3 [NG 4 [NG 8 []],NG 8 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;1) =&amp;gt;  NG 1 [NG 2 [NG 8 []],NG 3 [NG 4 [NG 8 []],NG 8 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;0) =&amp;gt;  NG 1 [NG 2 [NG 8 []],NG 3 [NG 4 [NG 8 []],NG 8 []],NG 8 []]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
              deriving (Eq, Show)&lt;br /&gt;
&lt;br /&gt;
ejG1, ejG2, ejG3 :: ArbolG Int&lt;br /&gt;
ejG1 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
ejG2 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
           NG 4 [], &lt;br /&gt;
           NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
ejG3 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
           NG 4 [NG 1 [NG 2 [],NG 3 [NG 4 []]]], &lt;br /&gt;
           NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
&lt;br /&gt;
ramifica :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
ramifica (NG x as) a2 p  &lt;br /&gt;
         | p x       = NG x (as&amp;#039; ++ [a2])&lt;br /&gt;
         | otherwise = NG x  as&amp;#039;&lt;br /&gt;
  where as&amp;#039; = [ramifica a a2 p | a &amp;lt;- as]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir la función&lt;br /&gt;
--    nHojasG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
-- tal que (nHojas x) es el número de hojas del árbol x. Por ejemplo,&lt;br /&gt;
--    nHojasG ejG1  ==  2&lt;br /&gt;
--    nHojasG ejG2  ==  4&lt;br /&gt;
--    nHojasG ejG3  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
nHojasG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
nHojasG (NG _ []) = 1&lt;br /&gt;
nHojasG (NG _ as) = sum $ map nHojasG as&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir la función&lt;br /&gt;
--    profundidad :: ArbolG a -&amp;gt; Int&lt;br /&gt;
-- tal que (profundidadG x) es la profundidad del árbol x. Por ejemplo,&lt;br /&gt;
--    profundidadG ejG1  ==  2&lt;br /&gt;
--    profundidadG ejG2  ==  2&lt;br /&gt;
--    profundidadG ejG3  ==  4&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
profundidadG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
profundidadG (NG _ []) = 0&lt;br /&gt;
profundidadG (NG _ as) = 1 + (maximum (map profundidadG as))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.4. Definir la función&lt;br /&gt;
--    bin2gen :: Arbol3 a -&amp;gt; ArbolG a&lt;br /&gt;
-- tal que (bin2gen x) es la traducción del árbol x definido con el tipo&lt;br /&gt;
-- &amp;quot;Arbol3&amp;quot; (es decir, árbol binario) a &amp;quot;ArbolG&amp;quot; (es decir, árbol&lt;br /&gt;
-- genérico). Por ejemplo,&lt;br /&gt;
--    bin2gen (N3 9 (N3 3 (H3 2) (H3 4)) (H3 7)) ==  (NG 9 [NG 3 [NG 2 [],NG 4 []], NG 7 []])&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
bin2gen :: Arbol3 a -&amp;gt; ArbolG a&lt;br /&gt;
bin2gen (H3 v) = NG v []&lt;br /&gt;
bin2gen (N3 v i d) = NG v [bin2gen i,bin2gen d]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Las expresiones aritméticas básicas pueden&lt;br /&gt;
-- representarse usando el siguiente tipo de datos  &lt;br /&gt;
--    data Expr1 = C1 Int &lt;br /&gt;
--               | S1 Expr1 Expr1 &lt;br /&gt;
--               | P1 Expr1 Expr1  &lt;br /&gt;
--               deriving Show&lt;br /&gt;
-- Por ejemplo, la expresión 2*(3+7) se representa por&lt;br /&gt;
--    P1 (C1 2) (S1 (C1 3) (C1 7))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valor :: Expr1 -&amp;gt; Int                   &lt;br /&gt;
-- tal que (valor e) es el valor de la expresión aritmética e. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    valor (P1 (C1 2) (S1 (C1 3) (C1 7)))  ==  20&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr1 = C1 Int &lt;br /&gt;
           | S1 Expr1 Expr1 &lt;br /&gt;
           | P1 Expr1 Expr1  &lt;br /&gt;
           deriving (Show, Eq)&lt;br /&gt;
                   &lt;br /&gt;
valor :: Expr1 -&amp;gt; Int                   &lt;br /&gt;
valor (C1 x)   = x &lt;br /&gt;
valor (S1 x y) = valor x + valor y&lt;br /&gt;
valor (P1 x y) = valor x * valor y&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir la función  &lt;br /&gt;
--    aplica :: (Int -&amp;gt; Int) -&amp;gt; Expr1 -&amp;gt; Expr1&lt;br /&gt;
-- tal que (aplica f e) es la expresión obtenida aplicando la función f&lt;br /&gt;
-- a cada uno de los números de la expresión e. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; aplica (+2) (s1 (p1 (c1 3) (c1 5)) (p1 (c1 6) (c1 7)))&lt;br /&gt;
--    s1 (p1 (c1 5) (c1 7)) (p1 (c1 8) (c1 9))&lt;br /&gt;
--    ghci&amp;gt; aplica (*2) (s1 (p1 (c1 3) (c1 5)) (p1 (c1 6) (c1 7)))&lt;br /&gt;
--    s1 (p1 (c1 6) (c1 10)) (p1 (c1 12) (c1 14))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
aplica :: (Int -&amp;gt; Int) -&amp;gt; Expr1 -&amp;gt; Expr1&lt;br /&gt;
aplica f (C1 x)     = C1 (f x)&lt;br /&gt;
aplica f (S1 e1 e2) = S1 (aplica f e1) (aplica f e2)&lt;br /&gt;
aplica f (P1 e1 e2) = P1 (aplica f e1) (aplica f e2)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Las expresiones aritméticas construidas con una&lt;br /&gt;
-- variable (denotada por X), los números enteros y las operaciones de&lt;br /&gt;
-- sumar y multiplicar se pueden representar mediante el tipo de datos&lt;br /&gt;
-- Expr2 definido por     &lt;br /&gt;
--    data Expr2 = X&lt;br /&gt;
--               | C2 Int&lt;br /&gt;
--               | S2 Expr2 Expr2&lt;br /&gt;
--               | P2 Expr2 Expr2&lt;br /&gt;
-- Por ejemplo, la expresión &amp;quot;X*(13+X)&amp;quot; se representa por&lt;br /&gt;
-- &amp;quot;P2 X (S2 (C2 13) X)&amp;quot;.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorE :: Expr2 -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
-- tal que (valorE e n) es el valor de la expresión e cuando se&lt;br /&gt;
-- sustituye su variable por n. Por ejemplo,&lt;br /&gt;
--    valorE (P2 X (S2 (C2 13) X)) 2  ==  30&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Expr2 = X&lt;br /&gt;
           | C2 Int&lt;br /&gt;
           | S2 Expr2 Expr2&lt;br /&gt;
           | P2 Expr2 Expr2&lt;br /&gt;
&lt;br /&gt;
valorE :: Expr2 -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
valorE X          n = n&lt;br /&gt;
valorE (C2 a)     _ = a&lt;br /&gt;
valorE (S2 e1 e2) n = valorE e1 n + valorE e2 n&lt;br /&gt;
valorE (P2 e1 e2) n = valorE e1 n * valorE e2 n&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Definir la función&lt;br /&gt;
--    numVars :: Expr2 -&amp;gt; Int&lt;br /&gt;
-- tal que (numVars e) es el número de variables en la expresión e. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    numVars (C2 3)                 ==  0&lt;br /&gt;
--    numVars X                      ==  1&lt;br /&gt;
--    numVars (P2 X (S2 (C2 13) X))  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
numVars :: Expr2 -&amp;gt; Int&lt;br /&gt;
numVars X        = 1&lt;br /&gt;
numVars (C2 _)   = 0&lt;br /&gt;
numVars (S2 a b) = numVars a + numVars b&lt;br /&gt;
numVars (P2 a b) = numVars a + numVars b&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Las expresiones aritméticas con variables pueden&lt;br /&gt;
-- representarse usando el siguiente tipo de datos  &lt;br /&gt;
--    data Expr3 = C3 Int &lt;br /&gt;
--               | V3 Char &lt;br /&gt;
--               | S3 Expr3 Expr3 &lt;br /&gt;
--               | P3 Expr3 Expr3  &lt;br /&gt;
--               deriving Show&lt;br /&gt;
-- Por ejemplo, la expresión 2*(a+5) se representa por&lt;br /&gt;
--    P3 (C3 2) (S3 (V3 &amp;#039;a&amp;#039;) (C3 5))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valor3 :: Expr3 -&amp;gt; [(Char,Int)] -&amp;gt; Int                   &lt;br /&gt;
-- tal que (valor3 x e) es el valor3 de la expresión x en el entorno e (es&lt;br /&gt;
-- decir, el valor3 de la expresión donde las variables de x se sustituyen&lt;br /&gt;
-- por los valores según se indican en el entorno e). Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; valor3 (P3 (C3 2) (S3 (V3 &amp;#039;a&amp;#039;) (V3 &amp;#039;b&amp;#039;))) [(&amp;#039;a&amp;#039;,2),(&amp;#039;b&amp;#039;,5)]&lt;br /&gt;
--    14&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr3 = C3 Int &lt;br /&gt;
           | V3 Char &lt;br /&gt;
           | S3 Expr3 Expr3 &lt;br /&gt;
           | P3 Expr3 Expr3  &lt;br /&gt;
           deriving (Show, Eq)&lt;br /&gt;
                   &lt;br /&gt;
valor3 :: Expr3 -&amp;gt; [(Char,Int)] -&amp;gt; Int                   &lt;br /&gt;
valor3 (C3 x)   _ = x&lt;br /&gt;
valor3 (V3 x)   e = head [y | (z,y) &amp;lt;- e, z == x]  &lt;br /&gt;
valor3 (S3 x y) e = valor3 x e + valor3 y e&lt;br /&gt;
valor3 (P3 x y) e = valor3 x e * valor3 y e&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir la función&lt;br /&gt;
--    sumas :: Expr3 -&amp;gt; Int&lt;br /&gt;
-- tal que (sumas e) es el número de sumas en la expresión e. Por &lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    sumas (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  1&lt;br /&gt;
--    sumas (S3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  2&lt;br /&gt;
--    sumas (P3 (V3 &amp;#039;z&amp;#039;) (P3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
                   &lt;br /&gt;
sumas :: Expr3 -&amp;gt; Int&lt;br /&gt;
sumas (V3 _)   = 0&lt;br /&gt;
sumas (C3 _)   = 0&lt;br /&gt;
sumas (S3 x y) = 1 + sumas x + sumas y&lt;br /&gt;
sumas (P3 x y) = sumas x + sumas y&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.3. Definir la función&lt;br /&gt;
--    sustitucion :: Expr3 -&amp;gt; [(Char, Int)] -&amp;gt; Expr3&lt;br /&gt;
-- tal que (sustitucion e s) es la expresión obtenida sustituyendo las&lt;br /&gt;
-- variables de la expresión e según se indica en la sustitución s. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ghci&amp;gt; sustitucion (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;))) [(&amp;#039;x&amp;#039;,7),(&amp;#039;z&amp;#039;,9)]&lt;br /&gt;
--    P3 (C3 9) (S3 (C3 3) (C3 7))&lt;br /&gt;
--    ghci&amp;gt; sustitucion (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;y&amp;#039;))) [(&amp;#039;x&amp;#039;,7),(&amp;#039;z&amp;#039;,9)]&lt;br /&gt;
--    P3 (C3 9) (S3 (C3 3) (V3 &amp;#039;y&amp;#039;))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
                   &lt;br /&gt;
sustitucion :: Expr3 -&amp;gt; [(Char, Int)] -&amp;gt; Expr3&lt;br /&gt;
sustitucion e [] = e&lt;br /&gt;
sustitucion (V3 c) ((d,n):ps) | c == d    = C3 n&lt;br /&gt;
                              | otherwise = sustitucion (V3 c) ps&lt;br /&gt;
sustitucion (C3 n) _ = C3 n                                 &lt;br /&gt;
sustitucion (S3 e1 e2) ps = S3 (sustitucion e1 ps) (sustitucion e2 ps)&lt;br /&gt;
sustitucion (P3 e1 e2) ps = P3 (sustitucion e1 ps) (sustitucion e2 ps)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.4. Definir la función&lt;br /&gt;
--    reducible :: Expr3 -&amp;gt; Bool&lt;br /&gt;
-- tal que (reducible a) se verifica si a es una expresión reducible; es&lt;br /&gt;
-- decir, contiene una operación en la que los dos operandos son números. &lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    reducible (S3 (C3 3) (C3 4))               == True&lt;br /&gt;
--    reducible (S3 (C3 3) (V3 &amp;#039;x&amp;#039;))             == False&lt;br /&gt;
--    reducible (S3 (C3 3) (P3 (C3 4) (C3 5)))   == True&lt;br /&gt;
--    reducible (S3 (V3 &amp;#039;x&amp;#039;) (P3 (C3 4) (C3 5))) == True&lt;br /&gt;
--    reducible (S3 (C3 3) (P3 (V3 &amp;#039;x&amp;#039;) (C3 5))) == False&lt;br /&gt;
--    reducible (C3 3)                           == False&lt;br /&gt;
--    reducible (V3 &amp;#039;x&amp;#039;)                         == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
reducible :: Expr3 -&amp;gt; Bool&lt;br /&gt;
reducible (C3 _)             = False&lt;br /&gt;
reducible (V3 _)             = False&lt;br /&gt;
reducible (S3 (C3 _) (C3 _)) = True&lt;br /&gt;
reducible (S3 a b)           = reducible a || reducible b&lt;br /&gt;
reducible (P3 (C3 _) (C3 _)) = True&lt;br /&gt;
reducible (P3 a b)           = reducible a || reducible b&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Las expresiones aritméticas generales se pueden definir&lt;br /&gt;
-- usando el siguiente tipo de datos &lt;br /&gt;
--    data Expr4 = C4 Int &lt;br /&gt;
--               | Y &lt;br /&gt;
--               | S4 Expr4 Expr4 &lt;br /&gt;
--               | R4 Expr4 Expr4 &lt;br /&gt;
--               | P4 Expr4 Expr4 &lt;br /&gt;
--               | E4 Expr4 Int&lt;br /&gt;
--               deriving (Eq, Show)&lt;br /&gt;
-- Por ejemplo, la expresión &lt;br /&gt;
--    3*x - (x+2)^7&lt;br /&gt;
-- se puede definir por&lt;br /&gt;
--    R4 (P4 (C4 3) Y) (E4 (S4 Y (C4 2)) 7)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función  &lt;br /&gt;
--    maximo :: Expr4 -&amp;gt; [Int] -&amp;gt; (Int,[Int])&lt;br /&gt;
-- tal que (maximo e xs) es el par formado por el máximo valor de la&lt;br /&gt;
-- expresión e para los puntos de xs y en qué puntos alcanza el&lt;br /&gt;
-- máximo. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; maximo (E4 (S4 (C4 10) (P4 (R4 (C4 1) Y) Y)) 2) [-3..3]&lt;br /&gt;
--    (100,[0,1])&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr4 = C4 Int &lt;br /&gt;
          | Y &lt;br /&gt;
          | S4 Expr4 Expr4 &lt;br /&gt;
          | R4 Expr4 Expr4 &lt;br /&gt;
          | P4 Expr4 Expr4 &lt;br /&gt;
          | E4 Expr4 Int&lt;br /&gt;
          deriving (Eq, Show)&lt;br /&gt;
&lt;br /&gt;
maximo :: Expr4 -&amp;gt; [Int] -&amp;gt; (Int,[Int])&lt;br /&gt;
maximo e ns = (m,[n | n &amp;lt;- ns, valor4 e n == m])  &lt;br /&gt;
    where m = maximum [valor4 e n | n &amp;lt;- ns]&lt;br /&gt;
          valor4 :: Expr4 -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
          valor4 (C4 x) _ = x&lt;br /&gt;
          valor4 Y     n = n&lt;br /&gt;
          valor4 (S4 e1 e2) n = valor4 e1 n + valor4 e2 n&lt;br /&gt;
          valor4 (R4 e1 e2) n = valor4 e1 n - valor4 e2 n&lt;br /&gt;
          valor4 (P4 e1 e2) n = valor4 e1 n * valor4 e2 n&lt;br /&gt;
          valor4 (E4 e1 m1) n = valor4 e1 n ^ m1&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Las operaciones de suma, resta y  multiplicación se&lt;br /&gt;
-- pueden representar mediante el siguiente tipo de datos &lt;br /&gt;
--    data Op = Su | Re | Mu&lt;br /&gt;
-- La expresiones aritméticas con dichas operaciones se pueden&lt;br /&gt;
-- representar mediante el siguiente tipo de dato algebraico&lt;br /&gt;
--    data Expr5 = C5 Int &lt;br /&gt;
--               | A Op Expr5 Expr&lt;br /&gt;
-- Por ejemplo, la expresión&lt;br /&gt;
--    (7-3)+(2*5)&lt;br /&gt;
-- se representa por&lt;br /&gt;
--    A Su (A Re (C5 7) (C5 3)) (A Mu (C5 2) (C5 5))&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valorEG :: Expr5 -&amp;gt; Int&lt;br /&gt;
-- tal que (valorEG e) es el valorEG de la expresión e. Por ejemplo,&lt;br /&gt;
--    valorEG (A Su (A Re (C5 7) (C5 3)) (A Mu (C5 2) (C5 5)))  ==  14&lt;br /&gt;
--    valorEG (A Mu (A Re (C5 7) (C5 3)) (A Su (C5 2) (C5 5)))  ==  28&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Op = Su | Re | Mu&lt;br /&gt;
&lt;br /&gt;
data Expr5 = C5 Int | A Op Expr5 Expr5&lt;br /&gt;
&lt;br /&gt;
-- 1Ş definición&lt;br /&gt;
valorEG :: Expr5 -&amp;gt; Int&lt;br /&gt;
valorEG (C5 x)      = x&lt;br /&gt;
valorEG (A o e1 e2) = aplica2 o (valorEG e1) (valorEG e2)&lt;br /&gt;
    where aplica2 :: Op -&amp;gt; Int -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
          aplica2 Su x y = x+y&lt;br /&gt;
          aplica2 Re x y = x-y&lt;br /&gt;
          aplica2 Mu x y = x*y&lt;br /&gt;
&lt;br /&gt;
-- 2Ş definición&lt;br /&gt;
valorEG2 :: Expr5 -&amp;gt; Int&lt;br /&gt;
valorEG2 (C5 n)    = n&lt;br /&gt;
valorEG2 (A o x y) = (sig o) (valorEG2 x) (valorEG2 y)&lt;br /&gt;
  where sig Su = (+)&lt;br /&gt;
        sig Mu = (*)&lt;br /&gt;
        sig Re = (-)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Se consideran las expresiones vectoriales formadas por&lt;br /&gt;
-- un vector, la suma de dos expresiones vectoriales o el producto de un&lt;br /&gt;
-- entero por una expresión vectorial. El siguiente tipo de dato define&lt;br /&gt;
-- las expresiones vectoriales  &lt;br /&gt;
--    data ExpV = Vec Int Int&lt;br /&gt;
--              | Sum ExpV ExpV&lt;br /&gt;
--              | Mul Int ExpV&lt;br /&gt;
--              deriving Show&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorEV :: ExpV -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que (valorEV e) es el valorEV de la expresión vectorial c. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    valorEV (Vec 1 2)                                  ==  (1,2)&lt;br /&gt;
--    valorEV (Sum (Vec 1 2 ) (Vec 3 4))                 ==  (4,6)&lt;br /&gt;
--    valorEV (Mul 2 (Vec 3 4))                          ==  (6,8)&lt;br /&gt;
--    valorEV (Mul 2 (Sum (Vec 1 2 ) (Vec 3 4)))         ==  (8,12)&lt;br /&gt;
--    valorEV (Sum (Mul 2 (Vec 1 2)) (Mul 2 (Vec 3 4)))  ==  (8,12)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ExpV = Vec Int Int&lt;br /&gt;
          | Sum ExpV ExpV&lt;br /&gt;
          | Mul Int ExpV&lt;br /&gt;
          deriving Show&lt;br /&gt;
&lt;br /&gt;
-- 1Ş solución&lt;br /&gt;
-- ===========&lt;br /&gt;
valorEV :: ExpV -&amp;gt; (Int,Int)&lt;br /&gt;
valorEV (Vec x y)   = (x,y)&lt;br /&gt;
valorEV (Sum e1 e2) = (x1+x2,y1+y2) &lt;br /&gt;
    where (x1,y1) = valorEV e1  &lt;br /&gt;
          (x2,y2) = valorEV e2  &lt;br /&gt;
valorEV (Mul n e)   = (n*x,n*y) &lt;br /&gt;
    where (x,y) = valorEV e  &lt;br /&gt;
&lt;br /&gt;
-- 2Ş solución&lt;br /&gt;
-- ===========&lt;br /&gt;
valorEV2 :: ExpV -&amp;gt; (Int,Int)&lt;br /&gt;
valorEV2 (Vec a b)   = (a, b)&lt;br /&gt;
valorEV2 (Sum e1 e2) = suma (valorEV2 e1) (valorEV2 e2)&lt;br /&gt;
valorEV2 (Mul n e1)  = multiplica n (valorEV2 e1)&lt;br /&gt;
&lt;br /&gt;
suma :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
suma (a,b) (c,d) = (a+c,b+d)&lt;br /&gt;
&lt;br /&gt;
multiplica :: Int -&amp;gt; (Int, Int) -&amp;gt; (Int, Int)&lt;br /&gt;
multiplica n (a,b) = (n*a,n*b)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. (Examen 12 de marzo de 2015, grupo 4)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Consideremos los árboles binarios con etiquetas en las&lt;br /&gt;
-- hojas y en los nodos. Por ejemplo,&lt;br /&gt;
--          5       &lt;br /&gt;
--         / \      &lt;br /&gt;
--        2   4      &lt;br /&gt;
--           / \    &lt;br /&gt;
--          7   1&lt;br /&gt;
--             / \&lt;br /&gt;
--            2   3   &lt;br /&gt;
-- &lt;br /&gt;
-- Un camino es una sucesión de nodos desde la raiz hasta una hoja. Por&lt;br /&gt;
-- ejemplo, [5,2] y [5,4,1,2] son caminos que llevan a 2, mientras que&lt;br /&gt;
-- [5,4,1] no es un camino, pues no lleva a una hoja.&lt;br /&gt;
-- &lt;br /&gt;
-- Definimos el tipo de dato Arbol y el ejemplo por&lt;br /&gt;
--    data Arbol = H Int | N Arbol Int Arbol &lt;br /&gt;
--                 deriving Show&lt;br /&gt;
--    &lt;br /&gt;
--    arb1:: Arbol &lt;br /&gt;
--    arb1 = N (H 2) 5 (N (H 7) 4 (N (H 2) 1 (H 3)))&lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    maxLong :: Int -&amp;gt; Arbol -&amp;gt; Int&lt;br /&gt;
-- tal que (maxLong x a) es la longitud máxima de los caminos que&lt;br /&gt;
-- terminan en x. Por ejemplo, &lt;br /&gt;
--    maxLong 3 arb1 == 4&lt;br /&gt;
--    maxLong 2 arb1 == 4&lt;br /&gt;
--    maxLong 7 arb1 == 3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol = H Int | N Arbol Int Arbol &lt;br /&gt;
             deriving Show&lt;br /&gt;
&lt;br /&gt;
arb1:: Arbol &lt;br /&gt;
arb1 = N (H 2) 5 (N (H 7) 4 (N (H 2) 1 (H 3)))&lt;br /&gt;
&lt;br /&gt;
-- 1Ş solución (calculando los caminos)&lt;br /&gt;
-- ------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- (caminos x a) es la lista de los caminos en el árbol a desde la raíz&lt;br /&gt;
-- hasta las hojas x. Por ejemplo,&lt;br /&gt;
--    caminos 2 arb1 == [[5,2],[5,4,1,2]]&lt;br /&gt;
--    caminos 3 arb1 == [[5,4,1,3]]&lt;br /&gt;
--    caminos 1 arb1 == []&lt;br /&gt;
caminos :: Int -&amp;gt; Arbol -&amp;gt; [[Int]]&lt;br /&gt;
caminos x (H y) | x == y    = [[x]]&lt;br /&gt;
                | otherwise = []&lt;br /&gt;
caminos x (N i r d) = map (r:) (caminos x i ++ caminos x d)&lt;br /&gt;
&lt;br /&gt;
maxLong1 :: Int -&amp;gt; Arbol -&amp;gt; Int&lt;br /&gt;
maxLong1 x a = maximum (0: map length (caminos x a))&lt;br /&gt;
&lt;br /&gt;
-- 2Ş solución&lt;br /&gt;
-- -----------&lt;br /&gt;
&lt;br /&gt;
maxLong2 :: Int -&amp;gt; Arbol -&amp;gt; Int&lt;br /&gt;
maxLong2 x a = maximum (0 : aux x a)&lt;br /&gt;
    where aux x (H y) | x == y    = [1]&lt;br /&gt;
                      | otherwise = []&lt;br /&gt;
          aux x (N i r d) = map (+1) (aux x i ++ aux x d)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. (Examen 5 de diciembre de 2017, grupo 1)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Los árboles con un número variable de sucesores se&lt;br /&gt;
-- pueden representar mediante el siguiente tipo de dato&lt;br /&gt;
--    data Arbol a = N a [Arbol a]&lt;br /&gt;
--      deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1         1             1          &lt;br /&gt;
--     / \       / \           / \   &lt;br /&gt;
--    8   3     8   3         8   3  &lt;br /&gt;
--        |        /|\       /|\  |   &lt;br /&gt;
--        4       4 5 6     4 5 6 7&lt;br /&gt;
-- se representan por&lt;br /&gt;
--    ej1, ej2, ej3 :: Arbol Int&lt;br /&gt;
--    ej1 = N 1 [N 8 [],N 3 [N 4 []]]&lt;br /&gt;
--    ej2 = N 1 [N 8 [], N 3 [N 4 [], N 5 [], N 6 []]]&lt;br /&gt;
--    ej3 = N 1 [N 8 [N 4 [], N 5 [], N 6 []], N 3 [N 7 []]]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     caminosDesdeRaiz :: Arbol a -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (caminosDesdeRaiz x) es la lista de todos los caminos desde&lt;br /&gt;
-- la raiz. Por ejemplo,&lt;br /&gt;
--     caminosDesdeRaiz ej1 == [[1,8],[1,3,4]]&lt;br /&gt;
--     caminosDesdeRaiz ej2 == [[1,8],[1,3,4],[1,3,5],[1,3,6]]&lt;br /&gt;
--     caminosDesdeRaiz ej3 == [[1,8,4],[1,8,5],[1,8,6],[1,3,7]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol a = N a [Arbol a]&lt;br /&gt;
  deriving Show&lt;br /&gt;
&lt;br /&gt;
ej1, ej2, ej3 :: Arbol Int&lt;br /&gt;
ej1 = N 1 [N 8 [],N 3 [N 4 []]]&lt;br /&gt;
ej2 = N 1 [N 8 [], N 3 [N 4 [], N 5 [], N 6 []]]&lt;br /&gt;
ej3 = N 1 [N 8 [N 4 [], N 5 [], N 6 []], N 3 [N 7 []]]&lt;br /&gt;
&lt;br /&gt;
caminosDesdeRaiz :: Arbol a -&amp;gt; [[a]]&lt;br /&gt;
caminosDesdeRaiz (N r []) = [[r]]&lt;br /&gt;
caminosDesdeRaiz (N r as) = map (r:) (concatMap caminosDesdeRaiz as)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14. (Examen 1 de septiembre de 2016)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Los árboles se pueden representar mediante el siguiente&lt;br /&gt;
-- tipo de datos &lt;br /&gt;
--    data Arbol a = N a [Arbol a]&lt;br /&gt;
--                   deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1               3&lt;br /&gt;
--     / \             /|\ &lt;br /&gt;
--    2   3           / | \&lt;br /&gt;
--        |          5  4  7&lt;br /&gt;
--        4          |     /\ &lt;br /&gt;
--                   6    2  1&lt;br /&gt;
-- se representan por&lt;br /&gt;
--    ej1, ej2 :: Arbol Int&lt;br /&gt;
--    ej1 = N 1 [N 2 [],N 3 [N 4 []]]&lt;br /&gt;
--    ej2 = N 3 [N 5 [N 6 []], N 4 [], N 7 [N 2 [], N 1 []]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    ramasLargas :: Arbol b -&amp;gt; [[b]]&lt;br /&gt;
-- tal que (ramasLargas a) es la lista de las ramas más largas del árbol&lt;br /&gt;
-- a. Por ejemplo, &lt;br /&gt;
--    ramas ej1  ==  [[1,3,4]]&lt;br /&gt;
--    ramas ej2  ==  [[3,5,6],[3,7,2],[3,7,1]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol a = N a [Arbol a]&lt;br /&gt;
  deriving Show&lt;br /&gt;
&lt;br /&gt;
ej1, ej2 :: Arbol Int&lt;br /&gt;
ej1 = N 1 [N 2 [],N 3 [N 4 []]]&lt;br /&gt;
ej2 = N 3 [N 5 [N 6 []], N 4 [], N 7 [N 2 [], N 1 []]]&lt;br /&gt;
&lt;br /&gt;
ramasLargas :: Arbol b -&amp;gt; [[b]]&lt;br /&gt;
ramasLargas a = [xs | xs &amp;lt;- todasRamas,&lt;br /&gt;
                      length xs == m]&lt;br /&gt;
  where todasRamas = ramas a&lt;br /&gt;
        m = maximum (map length todasRamas)&lt;br /&gt;
&lt;br /&gt;
-- (ramas a) es la lista de todas las ramas del árbol a. Por ejemplo, &lt;br /&gt;
--    ramas ej1  ==  [[1,2],[1,3,4]]&lt;br /&gt;
--    ramas ej2  ==  [[3,5,6],[3,4],[3,7,2],[3,7,1]]&lt;br /&gt;
ramas :: Arbol b -&amp;gt; [[b]]&lt;br /&gt;
ramas (N x []) = [[x]]&lt;br /&gt;
ramas (N x as) = [x : xs | a &amp;lt;- as, xs &amp;lt;- ramas a]&lt;br /&gt;
&lt;br /&gt;
-- 2Ş solución:&lt;br /&gt;
ramas2 :: Arbol b -&amp;gt; [[b]]&lt;br /&gt;
ramas2 (N x []) = [[x]]&lt;br /&gt;
ramas2 (N x as) = concatMap (map (x:)) (map ramas2 as)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_13&amp;diff=583</id>
		<title>Relación 13</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_13&amp;diff=583"/>
		<updated>2022-01-11T11:59:12Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Página creada con «&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;  -- I1M 2021-22: Relación 13 (14 de enero de 2022) -- Tipos de datos algebraicos (II). -- Departamento de Ciencias de la Computación e I.A. -- Uni…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Relación 13 (14 de enero de 2022)&lt;br /&gt;
-- Tipos de datos algebraicos (II).&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- En esta relación se presenta ejercicios sobre distintos tipos de&lt;br /&gt;
-- datos algebraicos. Concretamente,&lt;br /&gt;
--    * Árboles binarios:&lt;br /&gt;
--      + Árboles binarios con valores en los nodos.&lt;br /&gt;
--      + Árboles binarios con valores en las hojas.&lt;br /&gt;
--      + Árboles binarios con valores en las hojas y en los nodos.&lt;br /&gt;
--      + Árboles booleanos.  &lt;br /&gt;
--    * Árboles generales&lt;br /&gt;
--    * Expresiones aritméticas&lt;br /&gt;
--      + Expresiones aritméticas básicas.&lt;br /&gt;
--      + Expresiones aritméticas con una variable.&lt;br /&gt;
--      + Expresiones aritméticas con varias variables.&lt;br /&gt;
--      + Expresiones aritméticas generales. &lt;br /&gt;
--      + Expresiones aritméticas con tipo de operaciones.&lt;br /&gt;
--    * Expresiones vectoriales&lt;br /&gt;
-- &lt;br /&gt;
-- Los ejercicios corresponden al tema 9 que se encuentran en &lt;br /&gt;
--    http://www.cs.us.es/~jalonso/cursos/temas/tema-9.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Los árboles binarios con valores en los nodos se&lt;br /&gt;
-- pueden definir por&lt;br /&gt;
--    data Arbol1 a = H1 &lt;br /&gt;
--                  | N1 a (Arbol1 a) (Arbol1 a)&lt;br /&gt;
--                  deriving (Show, Eq)&lt;br /&gt;
-- Por ejemplo, el árbol&lt;br /&gt;
--         9                &lt;br /&gt;
--        / \    &lt;br /&gt;
--       /   \   &lt;br /&gt;
--      8     6  &lt;br /&gt;
--     / \   / \ &lt;br /&gt;
--    3   2 4   5&lt;br /&gt;
-- se puede representar por&lt;br /&gt;
--    N1 9 (N1 8 (N1 3 H1 H1) (N1 2 H1 H1)) (N1 6 (N1 4 H1 H1) (N1 5 H1 H1))&lt;br /&gt;
--&lt;br /&gt;
-- Definir por recursión la función &lt;br /&gt;
--    sumaArbol :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
-- tal (sumaArbol x) es la suma de los valores que hay en el árbol&lt;br /&gt;
-- x. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; sumaArbol (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))  &lt;br /&gt;
--    21&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol1 a = H1 &lt;br /&gt;
             | N1 a (Arbol1 a) (Arbol1 a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
&lt;br /&gt;
sumaArbol :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
sumaArbol = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la función &lt;br /&gt;
--    mapArbol :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
-- tal que (mapArbol f x) es el árbol que resulta de sustituir cada nodo&lt;br /&gt;
-- n del árbol x por (f n). Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; mapArbol (+1) (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))&lt;br /&gt;
--    N1 3 (N1 6 (N1 4 H1 H1) (N1 8 H1 H1)) (N1 5 H1 H1)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
mapArbol :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
mapArbol = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la función&lt;br /&gt;
--    ramaIzquierda :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
-- tal que (ramaIzquierda a) es la lista de los valores de los nodos de&lt;br /&gt;
-- la rama izquierda del árbol a. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; ramaIzquierda (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))&lt;br /&gt;
--    [2,5,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ramaIzquierda :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
ramaIzquierda = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.4. Diremos que un árbol está balanceado si para cada nodo&lt;br /&gt;
-- v la diferencia entre el número de nodos (con valor) de sus subárboles&lt;br /&gt;
-- izquierdo y derecho es menor o igual que uno.  &lt;br /&gt;
--&lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    balanceado :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
-- tal que (balanceado a) se verifica si el árbol a está balanceado. Por &lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    balanceado (N1 5 H1 (N1 3 H1 H1))           == True&lt;br /&gt;
--    balanceado (N1 5 H1 (N1 3 (N1 4 H1 H1) H1)) == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
balanceado :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
balanceado = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Los árboles binarios con valores en las hojas se pueden&lt;br /&gt;
-- definir por&lt;br /&gt;
--    data Arbol2 a = H2 a&lt;br /&gt;
--                  | N2 (Arbol2 a) (Arbol2 a) &lt;br /&gt;
--                  deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles &lt;br /&gt;
--    árbol1          árbol2       árbol3     árbol4 &lt;br /&gt;
--       o              o           o           o    &lt;br /&gt;
--      / \            / \         / \         / \   &lt;br /&gt;
--     1   o          o   3       o   3       o   1  &lt;br /&gt;
--        / \        / \         / \         / \     &lt;br /&gt;
--       2   3      1   2       1   4       2   3    &lt;br /&gt;
-- se representan por&lt;br /&gt;
--    arbol1, arbol2, arbol3, arbol4 :: Arbol2 Int&lt;br /&gt;
--    arbol1 = N2 (H2 1) (N2 (H2 2) (H2 3))&lt;br /&gt;
--    arbol2 = N2 (N2 (H2 1) (H2 2)) (H2 3)&lt;br /&gt;
--    arbol3 = N2 (N2 (H2 1) (H2 4)) (H2 3)&lt;br /&gt;
--    arbol4 = N2 (N2 (H2 2) (H2 3)) (H2 1)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    igualBorde :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
-- tal que (igualBorde t1 t2) se verifica si los bordes de los árboles&lt;br /&gt;
-- t1 y t2 son iguales. Por ejemplo,&lt;br /&gt;
--    igualBorde arbol1 arbol2  ==  True&lt;br /&gt;
--    igualBorde arbol1 arbol3  ==  False&lt;br /&gt;
--    igualBorde arbol1 arbol4  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol2 a = N2 (Arbol2 a) (Arbol2 a) &lt;br /&gt;
              | H2 a&lt;br /&gt;
              deriving Show&lt;br /&gt;
&lt;br /&gt;
arbol1, arbol2, arbol3, arbol4 :: Arbol2 Int&lt;br /&gt;
arbol1 = N2 (H2 1) (N2 (H2 2) (H2 3))&lt;br /&gt;
arbol2 = N2 (N2 (H2 1) (H2 2)) (H2 3)&lt;br /&gt;
arbol3 = N2 (N2 (H2 1) (H2 4)) (H2 3)&lt;br /&gt;
arbol4 = N2 (N2 (H2 2) (H2 3)) (H2 1)&lt;br /&gt;
&lt;br /&gt;
igualBorde :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
igualBorde t1 t2 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Los árboles binarios con valores en las hojas y en los&lt;br /&gt;
-- nodos se definen por&lt;br /&gt;
--    data Arbol3 a = H3 a&lt;br /&gt;
--                 | N3 a (Arbol3 a) (Arbol3 a) &lt;br /&gt;
--                 deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--         5              8             5           5&lt;br /&gt;
--        / \            / \           / \         / \&lt;br /&gt;
--       /   \          /   \         /   \       /   \&lt;br /&gt;
--      9     7        9     3       9     2     4     7&lt;br /&gt;
--     / \   / \      / \   / \     / \               / \&lt;br /&gt;
--    1   4 6   8    1   4 6   2   1   4             6   2&lt;br /&gt;
-- se pueden representar por&lt;br /&gt;
--    ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol3 Int&lt;br /&gt;
--    ej3arbol1 = N3 5 (N3 9 (H3 1) (H3 4)) (N3 7 (H3 6) (H3 8))&lt;br /&gt;
--    ej3arbol2 = N3 8 (N3 9 (H3 1) (H3 4)) (N3 3 (H3 6) (H3 2))&lt;br /&gt;
--    ej3arbol3 = N3 5 (N3 9 (H3 1) (H3 4)) (H3 2)&lt;br /&gt;
--    ej3arbol4 = N3 5 (H3 4) (N3 7 (H3 6) (H3 2))&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    igualEstructura :: Arbol3 -&amp;gt; Arbol3 -&amp;gt; Bool&lt;br /&gt;
-- tal que (igualEstructura a1 a1) se verifica si los árboles a1 y a2 &lt;br /&gt;
-- tienen la misma estructura. Por ejemplo,&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol2 == True&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol3 == False&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol4 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol3 a = H3 a&lt;br /&gt;
              | N3 a (Arbol3 a) (Arbol3 a) &lt;br /&gt;
              deriving Show&lt;br /&gt;
&lt;br /&gt;
ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol3 Int&lt;br /&gt;
ej3arbol1 = N3 5 (N3 9 (H3 1) (H3 4)) (N3 7 (H3 6) (H3 8))&lt;br /&gt;
ej3arbol2 = N3 8 (N3 9 (H3 1) (H3 4)) (N3 3 (H3 6) (H3 2))&lt;br /&gt;
ej3arbol3 = N3 5 (N3 9 (H3 1) (H3 4)) (H3 2)&lt;br /&gt;
ej3arbol4 = N3 5 (H3 4) (N3 7 (H3 6) (H3 2))&lt;br /&gt;
&lt;br /&gt;
igualEstructura :: Arbol3 a -&amp;gt; Arbol3 a -&amp;gt; Bool&lt;br /&gt;
igualEstructura = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Definir la función&lt;br /&gt;
--    algunoArbol :: Arbol3 t -&amp;gt; (t -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
-- tal que (algunoArbol a p) se verifica si algún elemento del árbol a&lt;br /&gt;
-- cumple la propiedad p. Por ejemplo,&lt;br /&gt;
--    algunoArbol3 (N3 5 (N3 3 (H3 1) (H3 4)) (H3 2)) (&amp;gt;4)  ==  True&lt;br /&gt;
--    algunoArbol3 (N3 5 (N3 3 (H3 1) (H3 4)) (H3 2)) (&amp;gt;7)  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
algunoArbol :: Arbol3 a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
algunoArbol = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.3. Un elemento de un árbol se dirá de nivel k si aparece&lt;br /&gt;
-- en el árbol a distancia k  de la raíz.  &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    nivel :: Int -&amp;gt; Arbol3 a -&amp;gt; [a]&lt;br /&gt;
-- tal que (nivel k a) es la lista de los elementos de nivel k del árbol&lt;br /&gt;
-- a. Por ejemplo,&lt;br /&gt;
--    nivel 0 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [7]&lt;br /&gt;
--    nivel 1 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [2,9]&lt;br /&gt;
--    nivel 2 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [5,4]&lt;br /&gt;
--    nivel 3 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
nivel :: Int -&amp;gt; Arbol3 a -&amp;gt; [a]&lt;br /&gt;
nivel = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.4.  Los divisores medios de un número son los que ocupan&lt;br /&gt;
-- la posición media entre los divisores de n, ordenados de menor a&lt;br /&gt;
-- mayor. Por ejemplo, los divisores de 60 son &lt;br /&gt;
-- [1,2,3,4,5,6,10,12,15,20,30,60] y sus divisores medios son 6 y 10.&lt;br /&gt;
-- &lt;br /&gt;
-- El árbol de factorización de un número compuesto n se construye de la&lt;br /&gt;
-- siguiente manera: &lt;br /&gt;
--    * la raíz es el número n, &lt;br /&gt;
--    * la rama izquierda es el árbol de factorización de su divisor&lt;br /&gt;
--      medio menor y&lt;br /&gt;
--    * la rama derecha es el árbol de factorización de su divisor&lt;br /&gt;
--      medio mayor&lt;br /&gt;
-- Si el número es primo, su árbol de factorización sólo tiene una hoja&lt;br /&gt;
-- con dicho número. Por ejemplo, el árbol de factorización de 60 es&lt;br /&gt;
--        60&lt;br /&gt;
--       /  \&lt;br /&gt;
--      6    10&lt;br /&gt;
--     / \   / \&lt;br /&gt;
--    2   3 2   5&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    arbolFactorizacion :: Int -&amp;gt; Arbol3&lt;br /&gt;
-- tal que (arbolFactorizacion n) es el árbol de factorización de n. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    arbolFactorizacion 60 == N3 60 (N3 6 (H3 2) (H3 3)) (N3 10 (H3 2) (H3 5))&lt;br /&gt;
--    arbolFactorizacion 45 == N3 45 (H3 5) (N3 9 (H3 3) (H3 3))&lt;br /&gt;
--    arbolFactorizacion 7  == H3 7&lt;br /&gt;
--    arbolFactorizacion 14 == N3 14 (H3 2) (H3 7)&lt;br /&gt;
--    arbolFactorizacion 28 == N3 28 (N3 4 (H3 2) (H3 2)) (H3 7)&lt;br /&gt;
--    arbolFactorizacion 84 == N3 84 (H3 7) (N3 12 (H3 3) (N3 4 (H3 2) (H3 2)))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
arbolFactorizacion :: Int -&amp;gt; Arbol3 Int&lt;br /&gt;
arbolFactorizacion n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se consideran los árboles con operaciones booleanas&lt;br /&gt;
-- definidos por   &lt;br /&gt;
--    data ArbolB = HB Bool &lt;br /&gt;
--                | Conj ArbolB ArbolB&lt;br /&gt;
--                | Disy ArbolB ArbolB&lt;br /&gt;
--                | Neg ArbolB&lt;br /&gt;
-- &lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--                Conj                            Conj          &lt;br /&gt;
--               /   \                           /   \          &lt;br /&gt;
--              /     \                         /     \         &lt;br /&gt;
--           Disy      Conj                  Disy      Conj     &lt;br /&gt;
--          /   \       /  \                /   \      /   \    &lt;br /&gt;
--       Conj    Neg   Neg True          Conj    Neg   Neg  True &lt;br /&gt;
--       /  \    |     |                 /  \    |     |        &lt;br /&gt;
--    True False False False          True False True  False     &lt;br /&gt;
--&lt;br /&gt;
-- se definen por&lt;br /&gt;
--    ej1, ej2:: ArbolB&lt;br /&gt;
--    ej1 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
--                     (Neg (HB False)))&lt;br /&gt;
--               (Conj (Neg (HB False))&lt;br /&gt;
--                     (HB True))&lt;br /&gt;
--    &lt;br /&gt;
--    ej2 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
--                     (Neg (HB True)))&lt;br /&gt;
--               (Conj (Neg (HB False))&lt;br /&gt;
--                     (HB True))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorB :: ArbolB -&amp;gt; Bool&lt;br /&gt;
-- tal que (valorB ar) es el resultado de procesar el árbol realizando&lt;br /&gt;
-- las operaciones booleanas especificadas en los nodos. Por ejemplo,&lt;br /&gt;
--    valorB ej1 == True&lt;br /&gt;
--    valorB ej2 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ArbolB = HB Bool &lt;br /&gt;
            | Conj ArbolB ArbolB&lt;br /&gt;
            | Disy ArbolB ArbolB&lt;br /&gt;
            | Neg ArbolB&lt;br /&gt;
&lt;br /&gt;
ej1, ej2:: ArbolB&lt;br /&gt;
ej1 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
                 (Neg (HB False)))&lt;br /&gt;
           (Conj (Neg (HB False))&lt;br /&gt;
                 (HB True))&lt;br /&gt;
&lt;br /&gt;
ej2 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
                 (Neg (HB True)))&lt;br /&gt;
           (Conj (Neg (HB False))&lt;br /&gt;
                 (HB True))&lt;br /&gt;
&lt;br /&gt;
valorB:: ArbolB -&amp;gt; Bool&lt;br /&gt;
valorB = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Los árboles generales se pueden representar mediante el&lt;br /&gt;
-- siguiente tipo de dato  &lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--                  deriving (Eq, Show)&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1               3               3&lt;br /&gt;
--     / \             /|\            / | \&lt;br /&gt;
--    2   3           / | \          /  |  \&lt;br /&gt;
--        |          5  4  7        5   4   7&lt;br /&gt;
--        4          |     /\       |   |  / \&lt;br /&gt;
--                   6    2  1      6   1 2   1&lt;br /&gt;
--                                     / \&lt;br /&gt;
--                                    2   3&lt;br /&gt;
--                                        |&lt;br /&gt;
--                                        4&lt;br /&gt;
-- se representan por&lt;br /&gt;
--    ejG1, ejG2, ejG3 :: ArbolG Int&lt;br /&gt;
--    ejG1 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ejG2 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
--                 NG 4 [], &lt;br /&gt;
--                 NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
--    ejG3 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
--                 NG 4 [NG 1 [NG 2 [],NG 3 [NG 4 []]]], &lt;br /&gt;
--                 NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     ramifica :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
-- tal que (ramifica a1 a2 p) el árbol que resulta de ańadir una copia&lt;br /&gt;
-- del árbol a2 a los nodos de a1 que cumplen un predicado p. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;4) =&amp;gt; NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;3) =&amp;gt; NG 1 [NG 2 [],NG 3 [NG 4 [NG 8 []]]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;2) =&amp;gt; NG 1 [NG 2 [],NG 3 [NG 4 [NG 8 []],NG 8 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;1) =&amp;gt; NG 1 [NG 2 [NG 8 []],NG 3 [NG 4 [NG 8 []],NG 8 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;0) =&amp;gt; NG 1 [NG 2 [NG 8 []],NG 3 [NG 4 [NG 8 []],NG 8 []],NG 8 []]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
              deriving (Eq, Show)&lt;br /&gt;
&lt;br /&gt;
ejG1, ejG2, ejG3 :: ArbolG Int&lt;br /&gt;
ejG1 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
ejG2 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
           NG 4 [], &lt;br /&gt;
           NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
ejG3 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
           NG 4 [NG 1 [NG 2 [],NG 3 [NG 4 []]]], &lt;br /&gt;
           NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
&lt;br /&gt;
ramifica :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
ramifica = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir la función&lt;br /&gt;
--    nHojasG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
-- tal que (nHojas x) es el número de hojas del árbol x. Por ejemplo,&lt;br /&gt;
--    nHojasG ejG1  ==  2&lt;br /&gt;
--    nHojasG ejG2  ==  4&lt;br /&gt;
--    nHojasG ejG3  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
nHojasG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
nHojasG = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir la función&lt;br /&gt;
--    profundidad :: ArbolG a -&amp;gt; Int&lt;br /&gt;
-- tal que (profundidadG x) es la profundidad del árbol x. Por ejemplo,&lt;br /&gt;
--    profundidadG ejG1  ==  2&lt;br /&gt;
--    profundidadG ejG2  ==  2&lt;br /&gt;
--    profundidadG ejG3  ==  4&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
profundidadG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
profundidadG = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.4. Definir la función&lt;br /&gt;
--    bin2gen :: Arbol3 a -&amp;gt; ArbolG a&lt;br /&gt;
-- tal que (bin2gen x) es la traducción del árbol x definido con el tipo&lt;br /&gt;
-- &amp;quot;Arbol3&amp;quot; (es decir, árbol binario) a &amp;quot;ArbolG&amp;quot; (es decir, árbol&lt;br /&gt;
-- genérico). Por ejemplo,&lt;br /&gt;
--    bin2gen (N3 9 (N3 3 (H3 2) (H3 4)) (H3 7)) ==  (NG 9 [NG 3 [NG 2 [],NG 4 []], NG 7 []])&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
bin2gen :: Arbol3 a -&amp;gt; ArbolG a&lt;br /&gt;
bin2gen = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Las expresiones aritméticas básicas pueden&lt;br /&gt;
-- representarse usando el siguiente tipo de datos  &lt;br /&gt;
--    data Expr1 = C1 Int &lt;br /&gt;
--               | S1 Expr1 Expr1 &lt;br /&gt;
--               | P1 Expr1 Expr1  &lt;br /&gt;
--               deriving Show&lt;br /&gt;
-- Por ejemplo, la expresión 2*(3+7) se representa por&lt;br /&gt;
--    P1 (C1 2) (S1 (C1 3) (C1 7))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valor :: Expr1 -&amp;gt; Int                   &lt;br /&gt;
-- tal que (valor e) es el valor de la expresión aritmética e. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    valor (P1 (C1 2) (S1 (C1 3) (C1 7)))  ==  20&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr1 = C1 Int &lt;br /&gt;
           | S1 Expr1 Expr1 &lt;br /&gt;
           | P1 Expr1 Expr1  &lt;br /&gt;
           deriving Show&lt;br /&gt;
                   &lt;br /&gt;
valor :: Expr1 -&amp;gt; Int                   &lt;br /&gt;
valor = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir la función  &lt;br /&gt;
--    aplica :: (Int -&amp;gt; Int) -&amp;gt; Expr1 -&amp;gt; Expr1&lt;br /&gt;
-- tal que (aplica f e) es la expresión obtenida aplicando la función f&lt;br /&gt;
-- a cada uno de los números de la expresión e. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; aplica (+2) (S1 (P1 (C1 3) (C1 5)) (P1 (C1 6) (C1 7)))&lt;br /&gt;
--    S1 (P1 (C1 5) (C1 7)) (P1 (C1 8) (C1 9))&lt;br /&gt;
--    ghci&amp;gt; aplica (*2) (S1 (P1 (C1 3) (C1 5)) (P1 (C1 6) (C1 7)))&lt;br /&gt;
--    S1 (P1 (C1 6) (C1 10)) (P1 (C1 12) (C1 14))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
aplica :: (Int -&amp;gt; Int) -&amp;gt; Expr1 -&amp;gt; Expr1&lt;br /&gt;
aplica = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Las expresiones aritméticas construidas con una&lt;br /&gt;
-- variable (denotada por X), los números enteros y las operaciones de&lt;br /&gt;
-- sumar y multiplicar se pueden representar mediante el tipo de datos&lt;br /&gt;
-- Expr2 definido por     &lt;br /&gt;
--    data Expr2 = X&lt;br /&gt;
--               | C2 Int&lt;br /&gt;
--               | S2 Expr2 Expr2&lt;br /&gt;
--               | P2 Expr2 Expr2&lt;br /&gt;
-- Por ejemplo, la expresión &amp;quot;X*(13+X)&amp;quot; se representa por&lt;br /&gt;
-- &amp;quot;P2 X (S2 (C2 13) X)&amp;quot;.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorE :: Expr2 -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
-- tal que (valorE e n) es el valor de la expresión e cuando se&lt;br /&gt;
-- sustituye su variable por n. Por ejemplo,&lt;br /&gt;
--    valorE (P2 X (S2 (C2 13) X)) 2  ==  30&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Expr2 = X&lt;br /&gt;
           | C2 Int&lt;br /&gt;
           | S2 Expr2 Expr2&lt;br /&gt;
           | P2 Expr2 Expr2&lt;br /&gt;
&lt;br /&gt;
valorE :: Expr2 -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
valorE = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Definir la función&lt;br /&gt;
--    numVars :: Expr2 -&amp;gt; Int&lt;br /&gt;
-- tal que (numVars e) es el número de variables en la expresión e. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    numVars (C2 3)                 ==  0&lt;br /&gt;
--    numVars X                      ==  1&lt;br /&gt;
--    numVars (P2 X (S2 (C2 13) X))  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
numVars :: Expr2 -&amp;gt; Int&lt;br /&gt;
numVars = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Las expresiones aritméticas con variables pueden&lt;br /&gt;
-- representarse usando el siguiente tipo de datos  &lt;br /&gt;
--    data Expr3 = C3 Int &lt;br /&gt;
--               | V3 Char &lt;br /&gt;
--               | S3 Expr3 Expr3 &lt;br /&gt;
--               | P3 Expr3 Expr3  &lt;br /&gt;
--               deriving Show&lt;br /&gt;
-- Por ejemplo, la expresión 2*(a+5) se representa por&lt;br /&gt;
--    P3 (C3 2) (S3 (V3 &amp;#039;a&amp;#039;) (C3 5))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valor3 :: Expr3 -&amp;gt; [(Char,Int)] -&amp;gt; Int                   &lt;br /&gt;
-- tal que (valor3 x e) es el valor3 de la expresión x en el entorno e (es&lt;br /&gt;
-- decir, el valor3 de la expresión donde las variables de x se sustituyen&lt;br /&gt;
-- por los valores según se indican en el entorno e). Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; valor3 (P3 (C3 2) (S3 (V3 &amp;#039;a&amp;#039;) (V3 &amp;#039;b&amp;#039;))) [(&amp;#039;a&amp;#039;,2),(&amp;#039;b&amp;#039;,5)]&lt;br /&gt;
--    14&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr3 = C3 Int &lt;br /&gt;
           | V3 Char &lt;br /&gt;
           | S3 Expr3 Expr3 &lt;br /&gt;
           | P3 Expr3 Expr3  &lt;br /&gt;
           deriving Show&lt;br /&gt;
                   &lt;br /&gt;
valor3 :: Expr3 -&amp;gt; [(Char,Int)] -&amp;gt; Int                   &lt;br /&gt;
valor3 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir la función&lt;br /&gt;
--    sumas :: Expr3 -&amp;gt; Int&lt;br /&gt;
-- tal que (sumas e) es el número de sumas en la expresión e. Por &lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    sumas (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  1&lt;br /&gt;
--    sumas (S3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  2&lt;br /&gt;
--    sumas (P3 (V3 &amp;#039;z&amp;#039;) (P3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
                   &lt;br /&gt;
sumas :: Expr3 -&amp;gt; Int&lt;br /&gt;
sumas = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.3. Definir la función&lt;br /&gt;
--    sustitucion :: Expr3 -&amp;gt; [(Char, Int)] -&amp;gt; Expr3&lt;br /&gt;
-- tal que (sustitucion e s) es la expresión obtenida sustituyendo las&lt;br /&gt;
-- variables de la expresión e según se indica en la sustitución s. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ghci&amp;gt; sustitucion (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;))) [(&amp;#039;x&amp;#039;,7),(&amp;#039;z&amp;#039;,9)]&lt;br /&gt;
--    P3 (C3 9) (S3 (C3 3) (C3 7))&lt;br /&gt;
--    ghci&amp;gt; sustitucion (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;y&amp;#039;))) [(&amp;#039;x&amp;#039;,7),(&amp;#039;z&amp;#039;,9)]&lt;br /&gt;
--    P3 (C3 9) (S3 (C3 3) (V3 &amp;#039;y&amp;#039;))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
                   &lt;br /&gt;
sustitucion :: Expr3 -&amp;gt; [(Char, Int)] -&amp;gt; Expr3&lt;br /&gt;
sustitucion = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.4. Definir la función&lt;br /&gt;
--    reducible :: Expr3 -&amp;gt; Bool&lt;br /&gt;
-- tal que (reducible a) se verifica si a es una expresión reducible; es&lt;br /&gt;
-- decir, contiene una operación en la que los dos operandos son números. &lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    reducible (S3 (C3 3) (C3 4))               == True&lt;br /&gt;
--    reducible (S3 (C3 3) (V3 &amp;#039;x&amp;#039;))             == False&lt;br /&gt;
--    reducible (S3 (C3 3) (P3 (C3 4) (C3 5)))   == True&lt;br /&gt;
--    reducible (S3 (V3 &amp;#039;x&amp;#039;) (P3 (C3 4) (C3 5))) == True&lt;br /&gt;
--    reducible (S3 (C3 3) (P3 (V3 &amp;#039;x&amp;#039;) (C3 5))) == False&lt;br /&gt;
--    reducible (C3 3)                           == False&lt;br /&gt;
--    reducible (V3 &amp;#039;x&amp;#039;)                         == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
reducible :: Expr3 -&amp;gt; Bool&lt;br /&gt;
reducible = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Las expresiones aritméticas generales se pueden definir&lt;br /&gt;
-- usando el siguiente tipo de datos &lt;br /&gt;
--    data Expr4 = C4 Int &lt;br /&gt;
--               | Y &lt;br /&gt;
--               | S4 Expr4 Expr4 &lt;br /&gt;
--               | R4 Expr4 Expr4 &lt;br /&gt;
--               | P4 Expr4 Expr4 &lt;br /&gt;
--               | E4 Expr4 Int&lt;br /&gt;
--               deriving (Eq, Show)&lt;br /&gt;
-- Por ejemplo, la expresión &lt;br /&gt;
--    3*x - (x+2)^7&lt;br /&gt;
-- se puede definir por&lt;br /&gt;
--    R4 (P4 (C4 3) Y) (E4 (S4 Y (C4 2)) 7)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función  &lt;br /&gt;
--    maximo :: Expr4 -&amp;gt; [Int] -&amp;gt; (Int,[Int])&lt;br /&gt;
-- tal que (maximo e xs) es el par formado por el máximo valor de la&lt;br /&gt;
-- expresión e para los puntos de xs y en qué puntos alcanza el&lt;br /&gt;
-- máximo. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; maximo (E4 (S4 (C4 10) (P4 (R4 (C4 1) Y) Y)) 2) [-3..3]&lt;br /&gt;
--    (100,[0,1])&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr4 = C4 Int &lt;br /&gt;
          | Y &lt;br /&gt;
          | S4 Expr4 Expr4 &lt;br /&gt;
          | R4 Expr4 Expr4 &lt;br /&gt;
          | P4 Expr4 Expr4 &lt;br /&gt;
          | E4 Expr4 Int&lt;br /&gt;
          deriving (Eq, Show)&lt;br /&gt;
&lt;br /&gt;
maximo :: Expr4 -&amp;gt; [Int] -&amp;gt; (Int,[Int])&lt;br /&gt;
maximo e ns = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Las operaciones de suma, resta y  multiplicación se&lt;br /&gt;
-- pueden representar mediante el siguiente tipo de datos &lt;br /&gt;
--    data Op = Su | Re | Mu&lt;br /&gt;
-- La expresiones aritméticas con dichas operaciones se pueden&lt;br /&gt;
-- representar mediante el siguiente tipo de dato algebraico&lt;br /&gt;
--    data Expr5 = C5 Int &lt;br /&gt;
--               | A Op Expr5 Expr&lt;br /&gt;
-- Por ejemplo, la expresión&lt;br /&gt;
--    (7-3)+(2*5)&lt;br /&gt;
-- se representa por&lt;br /&gt;
--    A Su (A Re (C5 7) (C5 3)) (A Mu (C5 2) (C5 5))&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valorEG :: Expr5 -&amp;gt; Int&lt;br /&gt;
-- tal que (valorEG e) es el valorEG de la expresión e. Por ejemplo,&lt;br /&gt;
--    valorEG (A Su (A Re (C5 7) (C5 3)) (A Mu (C5 2) (C5 5)))  ==  14&lt;br /&gt;
--    valorEG (A Mu (A Re (C5 7) (C5 3)) (A Su (C5 2) (C5 5)))  ==  28&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Op = Su | Re | Mu&lt;br /&gt;
&lt;br /&gt;
data Expr5 = C5 Int | A Op Expr5 Expr5&lt;br /&gt;
&lt;br /&gt;
valorEG :: Expr5 -&amp;gt; Int&lt;br /&gt;
valorEG = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Se consideran las expresiones vectoriales formadas por&lt;br /&gt;
-- un vector, la suma de dos expresiones vectoriales o el producto de un&lt;br /&gt;
-- entero por una expresión vectorial. El siguiente tipo de dato define&lt;br /&gt;
-- las expresiones vectoriales  &lt;br /&gt;
--    data ExpV = Vec Int Int&lt;br /&gt;
--              | Sum ExpV ExpV&lt;br /&gt;
--              | Mul Int ExpV&lt;br /&gt;
--              deriving Show&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorEV :: ExpV -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que (valorEV e) es el valorEV de la expresión vectorial c. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    valorEV (Vec 1 2)                                  ==  (1,2)&lt;br /&gt;
--    valorEV (Sum (Vec 1 2 ) (Vec 3 4))                 ==  (4,6)&lt;br /&gt;
--    valorEV (Mul 2 (Vec 3 4))                          ==  (6,8)&lt;br /&gt;
--    valorEV (Mul 2 (Sum (Vec 1 2 ) (Vec 3 4)))         ==  (8,12)&lt;br /&gt;
--    valorEV (Sum (Mul 2 (Vec 1 2)) (Mul 2 (Vec 3 4)))  ==  (8,12)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ExpV = Vec Int Int&lt;br /&gt;
          | Sum ExpV ExpV&lt;br /&gt;
          | Mul Int ExpV&lt;br /&gt;
          deriving Show&lt;br /&gt;
&lt;br /&gt;
valorEV :: ExpV -&amp;gt; (Int,Int)&lt;br /&gt;
valorEV = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. (Examen 12 de marzo de 2015, grupo 4)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Consideremos los árboles binarios con etiquetas en las&lt;br /&gt;
-- hojas y en los nodos. Por ejemplo,&lt;br /&gt;
--          5       &lt;br /&gt;
--         / \      &lt;br /&gt;
--        2   4      &lt;br /&gt;
--           / \    &lt;br /&gt;
--          7   1&lt;br /&gt;
--             / \&lt;br /&gt;
--            2   3   &lt;br /&gt;
-- &lt;br /&gt;
-- Un camino es una sucesión de nodos desde la raiz hasta una hoja. Por&lt;br /&gt;
-- ejemplo, [5,2] y [5,4,1,2] son caminos que llevan a 2, mientras que&lt;br /&gt;
-- [5,4,1] no es un camino, pues no lleva a una hoja.&lt;br /&gt;
-- &lt;br /&gt;
-- Definimos el tipo de dato Arbol y el ejemplo por&lt;br /&gt;
--    data Arbol = H Int | N Arbol Int Arbol &lt;br /&gt;
--                 deriving Show&lt;br /&gt;
--    &lt;br /&gt;
--    arb1:: Arbol &lt;br /&gt;
--    arb1 = N (H 2) 5 (N (H 7) 4 (N (H 2) 1 (H 3)))&lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    maxLong :: Int -&amp;gt; Arbol -&amp;gt; Int&lt;br /&gt;
-- tal que (maxLong x a) es la longitud máxima de los caminos que&lt;br /&gt;
-- terminan en x. Por ejemplo, &lt;br /&gt;
--    maxLong 3 arb1 == 4&lt;br /&gt;
--    maxLong 2 arb1 == 4&lt;br /&gt;
--    maxLong 7 arb1 == 3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol = H Int | N Arbol Int Arbol &lt;br /&gt;
             deriving Show&lt;br /&gt;
&lt;br /&gt;
arb1:: Arbol &lt;br /&gt;
arb1 = N (H 2) 5 (N (H 7) 4 (N (H 2) 1 (H 3)))&lt;br /&gt;
&lt;br /&gt;
maxLong :: Int -&amp;gt; Arbol -&amp;gt; Int&lt;br /&gt;
maxLong = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. (Examen 5 de diciembre de 2017, grupo 1)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Los árboles con un número variable de sucesores se&lt;br /&gt;
-- pueden representar mediante el siguiente tipo de dato&lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--      deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1         1             1          &lt;br /&gt;
--     / \       / \           / \   &lt;br /&gt;
--    8   3     8   3         8   3  &lt;br /&gt;
--        |        /|\       /|\  |   &lt;br /&gt;
--        4       4 5 6     4 5 6 7&lt;br /&gt;
-- se representan por&lt;br /&gt;
--   ej21, ej22, ej23 :: ArbolG Int&lt;br /&gt;
--   ej21 = NG 1 [NG 8 [],NG 3 [NG 4 []]]&lt;br /&gt;
--   ej22 = NG 1 [NG 8 [], NG 3 [NG 4 [], NG 5 [], NG 6 []]]&lt;br /&gt;
--   ej23 = NG 1 [NG 8 [NG 4 [], NG 5 [], NG 6 []], NG 3 [NG 7 []]]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     caminosDesdeRaiz :: ArbolG a -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (caminosDesdeRaiz x) es la lista de todos los caminos desde&lt;br /&gt;
-- la raiz. Por ejemplo,&lt;br /&gt;
--     caminosDesdeRaiz ej21 == [[1,8],[1,3,4]]&lt;br /&gt;
--     caminosDesdeRaiz ej22 == [[1,8],[1,3,4],[1,3,5],[1,3,6]]&lt;br /&gt;
--     caminosDesdeRaiz ej23 == [[1,8,4],[1,8,5],[1,8,6],[1,3,7]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ej21, ej22, ej23 :: ArbolG Int&lt;br /&gt;
ej21 = NG 1 [NG 8 [],NG 3 [NG 4 []]]&lt;br /&gt;
ej22 = NG 1 [NG 8 [], NG 3 [NG 4 [], NG 5 [], NG 6 []]]&lt;br /&gt;
ej23 = NG 1 [NG 8 [NG 4 [], NG 5 [], NG 6 []], NG 3 [NG 7 []]]&lt;br /&gt;
&lt;br /&gt;
caminosDesdeRaiz :: ArbolG a -&amp;gt; [[a]]&lt;br /&gt;
caminosDesdeRaiz = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14. (Examen 1 de septiembre de 2016)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Los árboles se pueden representar mediante el siguiente&lt;br /&gt;
-- tipo de datos &lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--      deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1               3&lt;br /&gt;
--     / \             /|\ &lt;br /&gt;
--    2   3           / | \&lt;br /&gt;
--        |          5  4  7&lt;br /&gt;
--        4          |     /\ &lt;br /&gt;
--                   6    2  1&lt;br /&gt;
-- se representan por&lt;br /&gt;
--    ej31, ej32 :: ArbolG Int&lt;br /&gt;
--    ej31 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ej32 = NG 3 [NG 5 [NG 6 []], NG 4 [], NG 7 [NG 2 [], NG 1 []]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    ramasLargas :: ArbolG b -&amp;gt; [[b]]&lt;br /&gt;
-- tal que (ramasLargas a) es la lista de las ramas más largas del árbol&lt;br /&gt;
-- a. Por ejemplo, &lt;br /&gt;
--    ramas ej31  ==  [[1,3,4]]&lt;br /&gt;
--    ramas ej32  ==  [[3,5,6],[3,7,2],[3,7,1]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ej31, ej32 :: ArbolG Int&lt;br /&gt;
ej31 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
ej32 = NG 3 [NG 5 [NG 6 []], NG 4 [], NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
&lt;br /&gt;
ramasLargas :: ArbolG b -&amp;gt; [[b]]&lt;br /&gt;
ramasLargas = undefined&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Archivo:Rel_13.hs&amp;diff=582</id>
		<title>Archivo:Rel 13.hs</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Archivo:Rel_13.hs&amp;diff=582"/>
		<updated>2022-01-11T11:58:38Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=581</id>
		<title>Informática (1º Matemáticas)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=581"/>
		<updated>2022-01-11T11:47:42Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: /* Relación de Ejercicios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==Relación de Ejercicios==&lt;br /&gt;
&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Definiciones por composición sobre números, listas y booleanos. [ [[Media:Rel_1.hs |Enunciado]], [[Relación 1 |Solución colaborativa]], [[Relación 1 Sol |Solución]]  ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Definiciones con condicionales, guardas o patrones. [ [[Media:Rel_2.hs |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Relación 2 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión. [ [[Media:Rel_3.hs |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Relación 3 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión (extra). [ [[Media:Rel_4.hs |Enunciado]], [[Relación 4 |Solución colaborativa editada]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión con cadenas: El cifrado césar. [ [[Media:Rel_5.hs |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Relación 5 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión. [ [[Media:Rel_6.hs |Enunciado]], [[Relación 6 |Solución colaborativa]], [[Relación 6 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión y comprensión (extra). [ [[Media:Rel_7.hs |Enunciado]], [[Relación 7 |Solución colaborativa]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados (extra). [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Propiedades del número 2021. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10 |Solución colaborativa]], [[Relación 10 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Listas infinitas y evaluación perezosa. [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11 |Solución colaborativa]], [[Relación 11 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (I), Árboles binarios. [ [[Media:Rel_12.hs |Enunciado]], [[Relación 12|Solución colaborativa]]&amp;lt;!--, [[Relación 12 Sol |Solución]]--&amp;gt; ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (II), Árboles binarios, expresiones y árboles genéricos. [ [[Media:Rel_13.hs |Enunciado]], [[Relación 13|Solución colaborativa]], [[Relación 13 Sol |Solución ]] ]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: El algoritmo de Luhn. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones sobre cadenas. [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la programación funcional con listas infinitas. [ [[Media:Rel_14.hs |Enunciado]], [[Relación 14 colab|Solución colaborativa]], [[Relación 14|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: Ecuación con factoriales. [ [[Media:Rel_15.hs |Enunciado]], [[Relación 15 colab |Solución colaborativa]], [[Relación 15 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 16&amp;#039;&amp;#039;&amp;#039;: El juego del nim y las funciones de entrada/salida. [ [[Media:Rel_16.hs |Enunciado]], [[Relación 16 colab|Solución colaborativa]], [[Relación 16 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 17&amp;#039;&amp;#039;&amp;#039;: Cálculo del número pi mediante el método de Montecarlo. [ [[Media:Rel_17.hs |Enunciado]], [[Relación 17 |Solución colaborativa]], [[Rel 17 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 18&amp;#039;&amp;#039;&amp;#039;: Aproximaciones de pi. [ [[Media:Rel_18.hs |Enunciado]], [http://www.cs.us.es/~mjoseh/Digitos_de_pi.txt Fichero con los dígitos de pi], [[Relación 18 |Solución colaborativa]], [[Rel 18 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 19&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices. [ [[Media:Rel_19.hs |Enunciado]], [[Relación 19 |Solución colaborativa]], [[Relación 19 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Método de Gauss para triangularizar matrices. [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 |Solución colaborativa]], [[Relación 20 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 21&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices con librerías Data.Matrix y Data.Vector. [ [[Media:Rel_21.hs |Enunciado]], [[Relación 21 |Solución colaborativa]], [[Relación 21 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 22&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices: ejercicios de exámenes (para repasar). [ [[Media:Rel_22.hs |Enunciado]], [[Relación 22 |Solución colaborativa]], [[Relación 22 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 23&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_23.hs |Enunciado]], [[Relación 23 |Solución colaborativa]], [[Relación 23 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico (2): límites, bisección, integrales y bajada. [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva. [ [[Media:Rel_25.hs |Enunciado]], [[Relación 25 |Solución colaborativa]], [[Relación 25 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 26&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva con librerías (solucionada). [ [[Relación 26 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 27&amp;#039;&amp;#039;&amp;#039;: Combinatoria. [ [[Media:Rel_27.hs |Enunciado]], [[Relación 27 |Solución colaborativa]], [[Relación 27 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: El TAD de las pilas.  [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 |Solución colaborativa]], [[Relación 28 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de las colas.  [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 |Solución colaborativa]], [[Relación 29 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de conjuntos.  [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 colab |Solución colaborativa]], [[Relación 31 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 32&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. Regla de Ruffini. [ [[Media:Rel_32.hs |Enunciado]], [[Relación 32 colab |Solución colaborativa]], [[Relación 32 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g1.hs |Enunciado]], [[Exam 3g1 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g2.hs |Enunciado]], [[Exam 3g2 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de los montículos. Librería en https://cutt.ly/tbDyRlr [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Media:Relación_33_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Media:Relación_34_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería Data.Set. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 |Solución colaborativa]], [[Media:Relación_35_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 36&amp;#039;&amp;#039;&amp;#039;: Problemas básicos con el TAD de los grafos. [ [[Media:Rel_36.hs |Enunciado]], [[Relación 36 Colab |Solución colaborativa]], [[Media:Relación_36_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante listas. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica I&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_1.hs |Enunciado]], [[Programación dinámica I |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica II&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_2.hs |Enunciado]], [[Programación Dinámica II |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Grafos&amp;#039;&amp;#039;&amp;#039;: Ejercicios de examen sobre grafos. ([[Media:masgrafos.hs |Enunciado]], [[Grafos (Ej. examen) |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Técnica Divide y vencerás&amp;#039;&amp;#039;&amp;#039;: Puzzle. ([[Media:triomino.hs |Enunciado]], [[Triominos |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica III&amp;#039;&amp;#039;&amp;#039;: Ejercicios de programación dinámica. ([[Media:dinamica3_3.hs |Enunciado]], [[Programación Dinámica III |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso I&amp;#039;&amp;#039;&amp;#039;. ([[Media:Lychrel.hs |Enunciado]], [[Repaso I. Números de Lychrel |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso II: ejercicios de examen&amp;#039;&amp;#039;&amp;#039;. ([[Media:ejExamenes.hs |Enunciado]], [[Repaso II.  |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios Complementarios.&amp;#039;&amp;#039;&amp;#039;([[Media:ejcomplementarios.hs |Enunciado]], [[Ejercicios Complementarios|Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Más ejercicios de examen.&amp;#039;&amp;#039;&amp;#039;([[Media:ejExam.hs |Enunciado]], [[Ejercicios de examen|Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- MÁS EJERCICIOS DE OTROS AÑOS&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Ejercicios de exámenes sobre grafos. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 Colab |Solución colaborativa]], [[Relación 37 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~mjoseh/cursos/i1m-20/doc/manual-Data.Set.html Data.Set]. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Relación 34 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico en Maxima: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_25.mac |Enunciado]], [[Relación 25 |Solución colaborativa]] [[Relación 25 Sol |Solución]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/manual-Data.Set.html Data.Set] (erratas solucionadas). [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 colab |Solución colaborativa]], [[Relación 28 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: División y factorización de polinomios mediante la regla de Ruffini. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Caminos en una retícula. [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Apilamiento de barriles. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 |Solución colaborativa]], [[Relación 31 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante diccionarios. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 Colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de los multiconjuntos mediante diccionarios. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: El problema del granjero mediante búsqueda en espacio de estado. [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Relación 33 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Resolución de problemas mediante búsqueda en espacios de estados. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 colab |Solución colaborativa]], [[Relación 35 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados de repaso.  [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 colab |Solución colaborativa]] ]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Curso Actual==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 1&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(12/11/2021)&amp;#039;&amp;#039;: [ [[Media:Exam1_G2.hs |Enunciado]], [[Parcial 1 |Solución colaborativa]], [[Parcial 1 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 2&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(20/01/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 3&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(08/04/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 4&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(10/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 5&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(24/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Cursos Anteriores==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://github.com/jaalonso/Examenes_de_PF_con_Haskell/blob/master/README.org Repositorio de Exámenes]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Curso 2020/21 Grupo 2&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 11/12/20 |Examen 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(11/12/2020)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 16/02/21 |Examen 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(16/02/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 23/04/21 |Examen 3 Turno 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(23/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 28/04/21 |Examen 3 Turno 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(28/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 21/06/21 |Examen 4]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(21/06/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 05/07/2021 |Examen Julio]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(05/07/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 07/09/2021 |Examen Septiembre]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(07/09/2021)&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=580</id>
		<title>Informática (1º Matemáticas)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=580"/>
		<updated>2022-01-07T18:39:33Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: /* Relación de Ejercicios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==Relación de Ejercicios==&lt;br /&gt;
&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Definiciones por composición sobre números, listas y booleanos. [ [[Media:Rel_1.hs |Enunciado]], [[Relación 1 |Solución colaborativa]], [[Relación 1 Sol |Solución]]  ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Definiciones con condicionales, guardas o patrones. [ [[Media:Rel_2.hs |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Relación 2 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión. [ [[Media:Rel_3.hs |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Relación 3 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión (extra). [ [[Media:Rel_4.hs |Enunciado]], [[Relación 4 |Solución colaborativa editada]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión con cadenas: El cifrado césar. [ [[Media:Rel_5.hs |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Relación 5 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión. [ [[Media:Rel_6.hs |Enunciado]], [[Relación 6 |Solución colaborativa]], [[Relación 6 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión y comprensión (extra). [ [[Media:Rel_7.hs |Enunciado]], [[Relación 7 |Solución colaborativa]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados (extra). [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Propiedades del número 2021. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10 |Solución colaborativa]], [[Relación 10 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Listas infinitas y evaluación perezosa. [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11 |Solución colaborativa]], [[Relación 11 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos, Árboles binarios. [ [[Media:Rel_12.hs |Enunciado]], [[Relación 12|Solución colaborativa]]&amp;lt;!--, [[Relación 12 Sol |Solución]]--&amp;gt; ]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: El algoritmo de Luhn. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones sobre cadenas. [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (II). [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11|Solución colaborativa]], [[Relación 11 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la programación funcional con listas infinitas. [ [[Media:Rel_14.hs |Enunciado]], [[Relación 14 colab|Solución colaborativa]], [[Relación 14|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: Ecuación con factoriales. [ [[Media:Rel_15.hs |Enunciado]], [[Relación 15 colab |Solución colaborativa]], [[Relación 15 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 16&amp;#039;&amp;#039;&amp;#039;: El juego del nim y las funciones de entrada/salida. [ [[Media:Rel_16.hs |Enunciado]], [[Relación 16 colab|Solución colaborativa]], [[Relación 16 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 17&amp;#039;&amp;#039;&amp;#039;: Cálculo del número pi mediante el método de Montecarlo. [ [[Media:Rel_17.hs |Enunciado]], [[Relación 17 |Solución colaborativa]], [[Rel 17 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 18&amp;#039;&amp;#039;&amp;#039;: Aproximaciones de pi. [ [[Media:Rel_18.hs |Enunciado]], [http://www.cs.us.es/~mjoseh/Digitos_de_pi.txt Fichero con los dígitos de pi], [[Relación 18 |Solución colaborativa]], [[Rel 18 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 19&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices. [ [[Media:Rel_19.hs |Enunciado]], [[Relación 19 |Solución colaborativa]], [[Relación 19 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Método de Gauss para triangularizar matrices. [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 |Solución colaborativa]], [[Relación 20 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 21&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices con librerías Data.Matrix y Data.Vector. [ [[Media:Rel_21.hs |Enunciado]], [[Relación 21 |Solución colaborativa]], [[Relación 21 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 22&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices: ejercicios de exámenes (para repasar). [ [[Media:Rel_22.hs |Enunciado]], [[Relación 22 |Solución colaborativa]], [[Relación 22 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 23&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_23.hs |Enunciado]], [[Relación 23 |Solución colaborativa]], [[Relación 23 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico (2): límites, bisección, integrales y bajada. [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva. [ [[Media:Rel_25.hs |Enunciado]], [[Relación 25 |Solución colaborativa]], [[Relación 25 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 26&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva con librerías (solucionada). [ [[Relación 26 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 27&amp;#039;&amp;#039;&amp;#039;: Combinatoria. [ [[Media:Rel_27.hs |Enunciado]], [[Relación 27 |Solución colaborativa]], [[Relación 27 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: El TAD de las pilas.  [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 |Solución colaborativa]], [[Relación 28 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de las colas.  [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 |Solución colaborativa]], [[Relación 29 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de conjuntos.  [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 colab |Solución colaborativa]], [[Relación 31 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 32&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. Regla de Ruffini. [ [[Media:Rel_32.hs |Enunciado]], [[Relación 32 colab |Solución colaborativa]], [[Relación 32 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g1.hs |Enunciado]], [[Exam 3g1 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g2.hs |Enunciado]], [[Exam 3g2 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de los montículos. Librería en https://cutt.ly/tbDyRlr [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Media:Relación_33_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Media:Relación_34_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería Data.Set. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 |Solución colaborativa]], [[Media:Relación_35_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 36&amp;#039;&amp;#039;&amp;#039;: Problemas básicos con el TAD de los grafos. [ [[Media:Rel_36.hs |Enunciado]], [[Relación 36 Colab |Solución colaborativa]], [[Media:Relación_36_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante listas. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica I&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_1.hs |Enunciado]], [[Programación dinámica I |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica II&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_2.hs |Enunciado]], [[Programación Dinámica II |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Grafos&amp;#039;&amp;#039;&amp;#039;: Ejercicios de examen sobre grafos. ([[Media:masgrafos.hs |Enunciado]], [[Grafos (Ej. examen) |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Técnica Divide y vencerás&amp;#039;&amp;#039;&amp;#039;: Puzzle. ([[Media:triomino.hs |Enunciado]], [[Triominos |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica III&amp;#039;&amp;#039;&amp;#039;: Ejercicios de programación dinámica. ([[Media:dinamica3_3.hs |Enunciado]], [[Programación Dinámica III |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso I&amp;#039;&amp;#039;&amp;#039;. ([[Media:Lychrel.hs |Enunciado]], [[Repaso I. Números de Lychrel |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso II: ejercicios de examen&amp;#039;&amp;#039;&amp;#039;. ([[Media:ejExamenes.hs |Enunciado]], [[Repaso II.  |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios Complementarios.&amp;#039;&amp;#039;&amp;#039;([[Media:ejcomplementarios.hs |Enunciado]], [[Ejercicios Complementarios|Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Más ejercicios de examen.&amp;#039;&amp;#039;&amp;#039;([[Media:ejExam.hs |Enunciado]], [[Ejercicios de examen|Solución colaborativa]]).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;!-- EJERCICIOS DEL CURSO PASADO&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Ejercicios de exámenes sobre grafos. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 Colab |Solución colaborativa]], [[Relación 37 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~mjoseh/cursos/i1m-20/doc/manual-Data.Set.html Data.Set]. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Relación 34 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico en Maxima: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_25.mac |Enunciado]], [[Relación 25 |Solución colaborativa]] [[Relación 25 Sol |Solución]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/manual-Data.Set.html Data.Set] (erratas solucionadas). [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 colab |Solución colaborativa]], [[Relación 28 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: División y factorización de polinomios mediante la regla de Ruffini. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Caminos en una retícula. [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Apilamiento de barriles. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 |Solución colaborativa]], [[Relación 31 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante diccionarios. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 Colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de los multiconjuntos mediante diccionarios. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: El problema del granjero mediante búsqueda en espacio de estado. [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Relación 33 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Resolución de problemas mediante búsqueda en espacios de estados. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 colab |Solución colaborativa]], [[Relación 35 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados de repaso.  [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 colab |Solución colaborativa]] ]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Curso Actual==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 1&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(12/11/2021)&amp;#039;&amp;#039;: [ [[Media:Exam1_G2.hs |Enunciado]], [[Parcial 1 |Solución colaborativa]], [[Parcial 1 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 2&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(20/01/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 3&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(08/04/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 4&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(10/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 5&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(24/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Cursos Anteriores==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://github.com/jaalonso/Examenes_de_PF_con_Haskell/blob/master/README.org Repositorio de Exámenes]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Curso 2020/21 Grupo 2&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 11/12/20 |Examen 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(11/12/2020)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 16/02/21 |Examen 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(16/02/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 23/04/21 |Examen 3 Turno 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(23/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 28/04/21 |Examen 3 Turno 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(28/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 21/06/21 |Examen 4]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(21/06/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 05/07/2021 |Examen Julio]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(05/07/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 07/09/2021 |Examen Septiembre]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(07/09/2021)&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=567</id>
		<title>Informática (1º Matemáticas)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=567"/>
		<updated>2021-12-19T18:17:51Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: /* Relación de Ejercicios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==Relación de Ejercicios==&lt;br /&gt;
&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Definiciones por composición sobre números, listas y booleanos. [ [[Media:Rel_1.hs |Enunciado]], [[Relación 1 |Solución colaborativa]], [[Relación 1 Sol |Solución]]  ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Definiciones con condicionales, guardas o patrones. [ [[Media:Rel_2.hs |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Relación 2 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión. [ [[Media:Rel_3.hs |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Relación 3 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión (extra). [ [[Media:Rel_4.hs |Enunciado]], [[Relación 4 |Solución colaborativa editada]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión con cadenas: El cifrado césar. [ [[Media:Rel_5.hs |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Relación 5 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión. [ [[Media:Rel_6.hs |Enunciado]], [[Relación 6 |Solución colaborativa]], [[Relación 6 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión y comprensión (extra). [ [[Media:Rel_7.hs |Enunciado]], [[Relación 7 |Solución colaborativa]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados (extra). [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Propiedades del número 2021. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10 |Solución colaborativa]]&amp;lt;!--, [[Relación 10 Sol |Solución ]]--&amp;gt; ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Listas infinitas y evaluación perezosa. [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11 |Solución colaborativa]]&amp;lt;!--, [[Relación 11 Sol |Solución ]]--&amp;gt; ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos, Árboles binarios. [ [[Media:Rel_12.hs |Enunciado]], [[Relación 12|Solución colaborativa]]&amp;lt;!--, [[Relación 12 Sol |Solución]]--&amp;gt; ]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: El algoritmo de Luhn. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones sobre cadenas. [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (II). [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11|Solución colaborativa]], [[Relación 11 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la programación funcional con listas infinitas. [ [[Media:Rel_14.hs |Enunciado]], [[Relación 14 colab|Solución colaborativa]], [[Relación 14|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: Ecuación con factoriales. [ [[Media:Rel_15.hs |Enunciado]], [[Relación 15 colab |Solución colaborativa]], [[Relación 15 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 16&amp;#039;&amp;#039;&amp;#039;: El juego del nim y las funciones de entrada/salida. [ [[Media:Rel_16.hs |Enunciado]], [[Relación 16 colab|Solución colaborativa]], [[Relación 16 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 17&amp;#039;&amp;#039;&amp;#039;: Cálculo del número pi mediante el método de Montecarlo. [ [[Media:Rel_17.hs |Enunciado]], [[Relación 17 |Solución colaborativa]], [[Rel 17 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 18&amp;#039;&amp;#039;&amp;#039;: Aproximaciones de pi. [ [[Media:Rel_18.hs |Enunciado]], [http://www.cs.us.es/~mjoseh/Digitos_de_pi.txt Fichero con los dígitos de pi], [[Relación 18 |Solución colaborativa]], [[Rel 18 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 19&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices. [ [[Media:Rel_19.hs |Enunciado]], [[Relación 19 |Solución colaborativa]], [[Relación 19 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Método de Gauss para triangularizar matrices. [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 |Solución colaborativa]], [[Relación 20 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 21&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices con librerías Data.Matrix y Data.Vector. [ [[Media:Rel_21.hs |Enunciado]], [[Relación 21 |Solución colaborativa]], [[Relación 21 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 22&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices: ejercicios de exámenes (para repasar). [ [[Media:Rel_22.hs |Enunciado]], [[Relación 22 |Solución colaborativa]], [[Relación 22 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 23&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_23.hs |Enunciado]], [[Relación 23 |Solución colaborativa]], [[Relación 23 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico (2): límites, bisección, integrales y bajada. [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva. [ [[Media:Rel_25.hs |Enunciado]], [[Relación 25 |Solución colaborativa]], [[Relación 25 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 26&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva con librerías (solucionada). [ [[Relación 26 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 27&amp;#039;&amp;#039;&amp;#039;: Combinatoria. [ [[Media:Rel_27.hs |Enunciado]], [[Relación 27 |Solución colaborativa]], [[Relación 27 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: El TAD de las pilas.  [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 |Solución colaborativa]], [[Relación 28 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de las colas.  [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 |Solución colaborativa]], [[Relación 29 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de conjuntos.  [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 colab |Solución colaborativa]], [[Relación 31 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 32&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. Regla de Ruffini. [ [[Media:Rel_32.hs |Enunciado]], [[Relación 32 colab |Solución colaborativa]], [[Relación 32 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g1.hs |Enunciado]], [[Exam 3g1 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g2.hs |Enunciado]], [[Exam 3g2 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de los montículos. Librería en https://cutt.ly/tbDyRlr [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Media:Relación_33_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Media:Relación_34_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería Data.Set. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 |Solución colaborativa]], [[Media:Relación_35_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 36&amp;#039;&amp;#039;&amp;#039;: Problemas básicos con el TAD de los grafos. [ [[Media:Rel_36.hs |Enunciado]], [[Relación 36 Colab |Solución colaborativa]], [[Media:Relación_36_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante listas. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica I&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_1.hs |Enunciado]], [[Programación dinámica I |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica II&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_2.hs |Enunciado]], [[Programación Dinámica II |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Grafos&amp;#039;&amp;#039;&amp;#039;: Ejercicios de examen sobre grafos. ([[Media:masgrafos.hs |Enunciado]], [[Grafos (Ej. examen) |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Técnica Divide y vencerás&amp;#039;&amp;#039;&amp;#039;: Puzzle. ([[Media:triomino.hs |Enunciado]], [[Triominos |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica III&amp;#039;&amp;#039;&amp;#039;: Ejercicios de programación dinámica. ([[Media:dinamica3_3.hs |Enunciado]], [[Programación Dinámica III |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso I&amp;#039;&amp;#039;&amp;#039;. ([[Media:Lychrel.hs |Enunciado]], [[Repaso I. Números de Lychrel |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso II: ejercicios de examen&amp;#039;&amp;#039;&amp;#039;. ([[Media:ejExamenes.hs |Enunciado]], [[Repaso II.  |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios Complementarios.&amp;#039;&amp;#039;&amp;#039;([[Media:ejcomplementarios.hs |Enunciado]], [[Ejercicios Complementarios|Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Más ejercicios de examen.&amp;#039;&amp;#039;&amp;#039;([[Media:ejExam.hs |Enunciado]], [[Ejercicios de examen|Solución colaborativa]]).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;!-- EJERCICIOS DEL CURSO PASADO&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Ejercicios de exámenes sobre grafos. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 Colab |Solución colaborativa]], [[Relación 37 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~mjoseh/cursos/i1m-20/doc/manual-Data.Set.html Data.Set]. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Relación 34 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico en Maxima: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_25.mac |Enunciado]], [[Relación 25 |Solución colaborativa]] [[Relación 25 Sol |Solución]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/manual-Data.Set.html Data.Set] (erratas solucionadas). [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 colab |Solución colaborativa]], [[Relación 28 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: División y factorización de polinomios mediante la regla de Ruffini. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Caminos en una retícula. [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Apilamiento de barriles. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 |Solución colaborativa]], [[Relación 31 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante diccionarios. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 Colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de los multiconjuntos mediante diccionarios. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: El problema del granjero mediante búsqueda en espacio de estado. [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Relación 33 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Resolución de problemas mediante búsqueda en espacios de estados. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 colab |Solución colaborativa]], [[Relación 35 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados de repaso.  [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 colab |Solución colaborativa]] ]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Curso Actual==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 1&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(12/11/2021)&amp;#039;&amp;#039;: [ [[Media:Exam1_G2.hs |Enunciado]], [[Parcial 1 |Solución colaborativa]], [[Parcial 1 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 2&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(20/01/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 3&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(08/04/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 4&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(10/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 5&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(24/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Cursos Anteriores==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://github.com/jaalonso/Examenes_de_PF_con_Haskell/blob/master/README.org Repositorio de Exámenes]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Curso 2020/21 Grupo 2&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 11/12/20 |Examen 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(11/12/2020)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 16/02/21 |Examen 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(16/02/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 23/04/21 |Examen 3 Turno 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(23/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 28/04/21 |Examen 3 Turno 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(28/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 21/06/21 |Examen 4]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(21/06/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 05/07/2021 |Examen Julio]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(05/07/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 07/09/2021 |Examen Septiembre]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(07/09/2021)&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_12_Sol&amp;diff=566</id>
		<title>Relación 12 Sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_12_Sol&amp;diff=566"/>
		<updated>2021-12-19T18:17:31Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Protegió «Relación 12 Sol» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Relación 12 Solución&lt;br /&gt;
-- Tipos de datos algebraicos: Árboles binarios.&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- En esta relación se presenta ejercicios sobre árboles binarios&lt;br /&gt;
-- definidos como tipos de datos algebraicos.&lt;br /&gt;
-- &lt;br /&gt;
-- Los ejercicios corresponden al tema 9 que se encuentra en &lt;br /&gt;
--    http://www.cs.us.es/cursos/i1m/temas/tema-9.html&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
import Control.Monad&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Nota. En los siguientes ejercicios se trabajará con los árboles&lt;br /&gt;
-- binarios definidos como sigue &lt;br /&gt;
--    data Arbol a = H &lt;br /&gt;
--                 | N a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Por ejemplo, el árbol&lt;br /&gt;
--         9 &lt;br /&gt;
--        / \&lt;br /&gt;
--       /   \&lt;br /&gt;
--      3     7&lt;br /&gt;
--     / \  &lt;br /&gt;
--    2   4 &lt;br /&gt;
-- se representa por&lt;br /&gt;
--    N 9 (N 3 (H 2) (H 4)) (H 7) &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = H a&lt;br /&gt;
             | N a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Definir la función&lt;br /&gt;
--    nHojas :: Arbol a -&amp;gt; Int&lt;br /&gt;
-- tal que (nHojas x) es el número de hojas del árbol x. Por ejemplo,&lt;br /&gt;
--    nHojas (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nHojas :: Arbol a -&amp;gt; Int&lt;br /&gt;
nHojas (H _)     = 1&lt;br /&gt;
nHojas (N _ i d) = nHojas i + nHojas d&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la función&lt;br /&gt;
--    nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
-- tal que (nNodos x) es el número de nodos del árbol x. Por ejemplo,&lt;br /&gt;
--    nNodos (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos (H _)     = 0&lt;br /&gt;
nNodos (N _ i d) = 1 + nNodos i + nNodos d&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Comprobar con QuickCheck que en todo árbol binario el&lt;br /&gt;
-- número de sus hojas es igual al número de sus nodos más uno.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nHojas :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nHojas x =&lt;br /&gt;
  nHojas x == nNodos x + 1&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_nHojas&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir la función&lt;br /&gt;
--    profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
-- tal que (profundidad x) es la profundidad del árbol x. Por ejemplo,&lt;br /&gt;
--    profundidad (N 9 (N 3 (H 2) (H 4)) (H 7))              ==  2&lt;br /&gt;
--    profundidad (N 9 (N 3 (H 2) (N 1 (H 4) (H 5))) (H 7))  ==  3&lt;br /&gt;
--    profundidad (N 4 (N 5 (H 4) (H 2)) (N 3 (H 7) (H 4)))  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad (H _)     = 0&lt;br /&gt;
profundidad (N _ i d) = 1 + max (profundidad i) (profundidad d)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Comprobar con QuickCheck que para todo árbol biario&lt;br /&gt;
-- x, se tiene que&lt;br /&gt;
--    nNodos x &amp;lt;= 2^(profundidad x) - 1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodosProfundidad :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodosProfundidad x =&lt;br /&gt;
   nNodos x &amp;lt;= 2 ^ profundidad x - 1&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_nNodosProfundidad&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir la función&lt;br /&gt;
--    preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
-- tal que (preorden x) es la lista correspondiente al recorrido&lt;br /&gt;
-- preorden del árbol x; es decir, primero visita la raíz del árbol, a&lt;br /&gt;
-- continuación recorre el subárbol izquierdo y, finalmente, recorre el&lt;br /&gt;
-- subárbol derecho. Por ejemplo,&lt;br /&gt;
--    preorden (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden (H x)     = [x]&lt;br /&gt;
preorden (N x i d) = x : (preorden i ++ preorden d)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Comprobar con QuickCheck que la longitud de la lista&lt;br /&gt;
-- obtenida recorriendo un árbol en sentido preorden es igual al número&lt;br /&gt;
-- de nodos del árbol más el número de hojas.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_length_preorden :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_length_preorden x =&lt;br /&gt;
   length (preorden x) == nNodos x + nHojas x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_length_preorden&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.3. Definir la función&lt;br /&gt;
--    postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
-- tal que (postorden x) es la lista correspondiente al recorrido&lt;br /&gt;
-- postorden del árbol x; es decir, primero recorre el subárbol&lt;br /&gt;
-- izquierdo, a continuación el subárbol derecho y, finalmente, la raíz&lt;br /&gt;
-- del árbol. Por ejemplo,&lt;br /&gt;
--    postorden (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden (H x)     = [x]&lt;br /&gt;
postorden (N x i d) = postorden i ++ postorden d ++ [x]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.4. Definir, usando un acumulador, la función&lt;br /&gt;
--    preordenIt :: Arbol a -&amp;gt; [a]&lt;br /&gt;
-- tal que (preordenIt x) es la lista correspondiente al recorrido&lt;br /&gt;
-- preorden del árbol x; es decir, primero visita la raíz del árbol, a&lt;br /&gt;
-- continuación recorre el subárbol izquierdo y, finalmente, recorre el&lt;br /&gt;
-- subárbol derecho. Por ejemplo,&lt;br /&gt;
--    preordenIt (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  [9,3,2,4,7]&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: No usar (++) en la definición&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preordenIt :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preordenIt x&amp;#039; = preordenItAux x&amp;#039; []&lt;br /&gt;
    where preordenItAux (H x) xs     = x:xs&lt;br /&gt;
          preordenItAux (N x i d) xs = &lt;br /&gt;
              x : preordenItAux i (preordenItAux d xs)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.5. Comprobar con QuickCheck que preordenIt es equivalente&lt;br /&gt;
-- a preorden. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_preordenIt :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_preordenIt x =&lt;br /&gt;
    preordenIt x == preorden x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_preordenIt&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. Definir la función&lt;br /&gt;
--    espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (espejo x) es la imagen especular del árbol x. Por ejemplo,&lt;br /&gt;
--    espejo (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (H 7) (N 3 (H 4) (H 2))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo (H x)     = H x&lt;br /&gt;
espejo (N x i d) = N x (espejo d) (espejo i)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Comprobar con QuickCheck que para todo árbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo x = &lt;br /&gt;
  espejo (espejo x) == x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_espejo&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Comprobar con QuickCheck que para todo árbol binario&lt;br /&gt;
-- x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = postorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_reverse_preorden_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_reverse_preorden_espejo x =&lt;br /&gt;
  reverse (preorden (espejo x)) == postorden x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Comprobar con QuickCheck que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_recorrido :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_recorrido x =&lt;br /&gt;
  postorden (espejo x) == reverse (preorden x)&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_recorrido&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. La función take está definida por&lt;br /&gt;
--    take :: Int -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
--    take 0            = []&lt;br /&gt;
--    take (n+1) []     = []&lt;br /&gt;
--    take (n+1) (x:xs) = x : take n xs&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    takeArbol ::  Int -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (takeArbol n t) es el subárbol de t de profundidad n. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    takeArbol 0 (N 9 (N 3 (H 2) (H 4)) (H 7)) == H 9&lt;br /&gt;
--    takeArbol 1 (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (H 3) (H 7)&lt;br /&gt;
--    takeArbol 2 (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (N 3 (H 2) (H 4)) (H 7)&lt;br /&gt;
--    takeArbol 3 (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (N 3 (H 2) (H 4)) (H 7)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
takeArbol :: Int -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
takeArbol _ (H x)     = H x&lt;br /&gt;
takeArbol 0 (N x _ _) = H x&lt;br /&gt;
takeArbol n (N x i d) = &lt;br /&gt;
    N x (takeArbol (n-1) i) (takeArbol (n-1) d)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Comprobar con QuickCheck que la profundidad de &lt;br /&gt;
-- (takeArbol n x) es menor o igual que n, para todo número natural n y&lt;br /&gt;
-- todo árbol x. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_takeArbol :: Int -&amp;gt; Arbol Int -&amp;gt; Property&lt;br /&gt;
prop_takeArbol n x =&lt;br /&gt;
  n &amp;gt;= 0 ==&amp;gt; profundidad (takeArbol n x) &amp;lt;= n&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_takeArbol&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. La función&lt;br /&gt;
--    repeat :: a -&amp;gt; [a]&lt;br /&gt;
-- está definida de forma que (repeat x) es la lista formada por&lt;br /&gt;
-- infinitos elementos x. Por ejemplo,&lt;br /&gt;
--    repeat 3  ==  [3,3,3,3,3,3,3,3,3,3,3,3,3,...&lt;br /&gt;
-- La definición de repeat es&lt;br /&gt;
--    repeat x = xs where xs = x:xs&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    repeatArbol :: a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (repeatArbol x) es es árbol con infinitos nodos x. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    takeArbol 0 (repeatArbol 3) == H 3&lt;br /&gt;
--    takeArbol 1 (repeatArbol 3) == N 3 (H 3) (H 3)&lt;br /&gt;
--    takeArbol 2 (repeatArbol 3) == N 3 (N 3 (H 3) (H 3)) (N 3 (H 3) (H 3))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
repeatArbol :: a -&amp;gt; Arbol a&lt;br /&gt;
repeatArbol x = N x t t&lt;br /&gt;
  where t = repeatArbol x&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. La función &lt;br /&gt;
--    replicate :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- está definida por &lt;br /&gt;
--    replicate n = take n . repeat&lt;br /&gt;
-- es tal que (replicate n x) es la lista de longitud n cuyos elementos&lt;br /&gt;
-- son x. Por ejemplo,&lt;br /&gt;
--    replicate 3 5  ==  [5,5,5]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    replicateArbol :: Int -&amp;gt; a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (replicate n x) es el árbol de profundidad n cuyos nodos son&lt;br /&gt;
-- x. Por ejemplo,&lt;br /&gt;
--    replicateArbol 0 5  ==  H 5&lt;br /&gt;
--    replicateArbol 1 5  ==  N 5 (H 5) (H 5)&lt;br /&gt;
--    replicateArbol 2 5  ==  N 5 (N 5 (H 5) (H 5)) (N 5 (H 5) (H 5))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
replicateArbol :: Int -&amp;gt; a -&amp;gt; Arbol a&lt;br /&gt;
replicateArbol n = takeArbol n . repeatArbol&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Comprobar con QuickCheck que el número de hojas de &lt;br /&gt;
-- (replicateArbol n x) es 2^n, para todo número natural n&lt;br /&gt;
--&lt;br /&gt;
-- Nota. Al hacer la comprobación limitar el tamańo de las pruebas como&lt;br /&gt;
-- se indica a continuación&lt;br /&gt;
--    quickCheckWith (stdArgs {maxSize=7}) prop_replicateArbol&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_replicateArbol :: Int -&amp;gt; Int -&amp;gt; Property&lt;br /&gt;
prop_replicateArbol n x =&lt;br /&gt;
  n &amp;gt;= 0 ==&amp;gt; nHojas (replicateArbol n x) == 2^n&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheckWith (stdArgs {maxSize=7}) prop_replicateArbol&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir la función&lt;br /&gt;
--    mapArbol :: (a -&amp;gt; a) -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (mapArbol f x) es el árbol obtenido aplicándole a cada nodo de&lt;br /&gt;
-- x la función f. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; mapArbol (*2) (N 9 (N 3 (H 2) (H 4)) (H 7)) &lt;br /&gt;
--    N 18 (N 6 (H 4) (H 8)) (H 14)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
mapArbol :: (a -&amp;gt; a) -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
mapArbol f (H x)     = H (f x)&lt;br /&gt;
mapArbol f (N x i d) = N (f x) (mapArbol f i) (mapArbol f d)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que &lt;br /&gt;
--    (mapArbol (1+)) . espejo = espejo . (mapArbol (1+))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_mapArbol_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_mapArbol_espejo x =&lt;br /&gt;
    (mapArbol (1+) . espejo) x == (espejo . mapArbol (1+)) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_mapArbol_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que&lt;br /&gt;
--    (map (1+)) . preorden = preorden . (mapArbol (1+)) &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_map_preorden :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_map_preorden x =&lt;br /&gt;
    (map (1+) . preorden) x == (preorden . mapArbol (1+)) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_map_preorden&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Nota. Para comprobar propiedades de árboles con QuickCheck se&lt;br /&gt;
-- utilizará el siguiente generador.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
instance Arbitrary a =&amp;gt; Arbitrary (Arbol a) where&lt;br /&gt;
  arbitrary = sized arbol&lt;br /&gt;
    where&lt;br /&gt;
      arbol 0       = fmap H arbitrary &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [fmap H arbitrary,&lt;br /&gt;
                             liftM3 N arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
      arbol _       = error &amp;quot;Imposible&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_12_Sol&amp;diff=565</id>
		<title>Relación 12 Sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_12_Sol&amp;diff=565"/>
		<updated>2021-12-19T18:17:23Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Página creada con «&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;  -- I1M 2021-22: Relación 12 Solución -- Tipos de datos algebraicos: Árboles binarios. -- Departamento de Ciencias de la Computación e I.A. -- U…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Relación 12 Solución&lt;br /&gt;
-- Tipos de datos algebraicos: Árboles binarios.&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- En esta relación se presenta ejercicios sobre árboles binarios&lt;br /&gt;
-- definidos como tipos de datos algebraicos.&lt;br /&gt;
-- &lt;br /&gt;
-- Los ejercicios corresponden al tema 9 que se encuentra en &lt;br /&gt;
--    http://www.cs.us.es/cursos/i1m/temas/tema-9.html&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
import Control.Monad&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Nota. En los siguientes ejercicios se trabajará con los árboles&lt;br /&gt;
-- binarios definidos como sigue &lt;br /&gt;
--    data Arbol a = H &lt;br /&gt;
--                 | N a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Por ejemplo, el árbol&lt;br /&gt;
--         9 &lt;br /&gt;
--        / \&lt;br /&gt;
--       /   \&lt;br /&gt;
--      3     7&lt;br /&gt;
--     / \  &lt;br /&gt;
--    2   4 &lt;br /&gt;
-- se representa por&lt;br /&gt;
--    N 9 (N 3 (H 2) (H 4)) (H 7) &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = H a&lt;br /&gt;
             | N a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Definir la función&lt;br /&gt;
--    nHojas :: Arbol a -&amp;gt; Int&lt;br /&gt;
-- tal que (nHojas x) es el número de hojas del árbol x. Por ejemplo,&lt;br /&gt;
--    nHojas (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nHojas :: Arbol a -&amp;gt; Int&lt;br /&gt;
nHojas (H _)     = 1&lt;br /&gt;
nHojas (N _ i d) = nHojas i + nHojas d&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la función&lt;br /&gt;
--    nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
-- tal que (nNodos x) es el número de nodos del árbol x. Por ejemplo,&lt;br /&gt;
--    nNodos (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos (H _)     = 0&lt;br /&gt;
nNodos (N _ i d) = 1 + nNodos i + nNodos d&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Comprobar con QuickCheck que en todo árbol binario el&lt;br /&gt;
-- número de sus hojas es igual al número de sus nodos más uno.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nHojas :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nHojas x =&lt;br /&gt;
  nHojas x == nNodos x + 1&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_nHojas&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir la función&lt;br /&gt;
--    profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
-- tal que (profundidad x) es la profundidad del árbol x. Por ejemplo,&lt;br /&gt;
--    profundidad (N 9 (N 3 (H 2) (H 4)) (H 7))              ==  2&lt;br /&gt;
--    profundidad (N 9 (N 3 (H 2) (N 1 (H 4) (H 5))) (H 7))  ==  3&lt;br /&gt;
--    profundidad (N 4 (N 5 (H 4) (H 2)) (N 3 (H 7) (H 4)))  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad (H _)     = 0&lt;br /&gt;
profundidad (N _ i d) = 1 + max (profundidad i) (profundidad d)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Comprobar con QuickCheck que para todo árbol biario&lt;br /&gt;
-- x, se tiene que&lt;br /&gt;
--    nNodos x &amp;lt;= 2^(profundidad x) - 1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodosProfundidad :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodosProfundidad x =&lt;br /&gt;
   nNodos x &amp;lt;= 2 ^ profundidad x - 1&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_nNodosProfundidad&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir la función&lt;br /&gt;
--    preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
-- tal que (preorden x) es la lista correspondiente al recorrido&lt;br /&gt;
-- preorden del árbol x; es decir, primero visita la raíz del árbol, a&lt;br /&gt;
-- continuación recorre el subárbol izquierdo y, finalmente, recorre el&lt;br /&gt;
-- subárbol derecho. Por ejemplo,&lt;br /&gt;
--    preorden (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden (H x)     = [x]&lt;br /&gt;
preorden (N x i d) = x : (preorden i ++ preorden d)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Comprobar con QuickCheck que la longitud de la lista&lt;br /&gt;
-- obtenida recorriendo un árbol en sentido preorden es igual al número&lt;br /&gt;
-- de nodos del árbol más el número de hojas.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_length_preorden :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_length_preorden x =&lt;br /&gt;
   length (preorden x) == nNodos x + nHojas x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_length_preorden&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.3. Definir la función&lt;br /&gt;
--    postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
-- tal que (postorden x) es la lista correspondiente al recorrido&lt;br /&gt;
-- postorden del árbol x; es decir, primero recorre el subárbol&lt;br /&gt;
-- izquierdo, a continuación el subárbol derecho y, finalmente, la raíz&lt;br /&gt;
-- del árbol. Por ejemplo,&lt;br /&gt;
--    postorden (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden (H x)     = [x]&lt;br /&gt;
postorden (N x i d) = postorden i ++ postorden d ++ [x]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.4. Definir, usando un acumulador, la función&lt;br /&gt;
--    preordenIt :: Arbol a -&amp;gt; [a]&lt;br /&gt;
-- tal que (preordenIt x) es la lista correspondiente al recorrido&lt;br /&gt;
-- preorden del árbol x; es decir, primero visita la raíz del árbol, a&lt;br /&gt;
-- continuación recorre el subárbol izquierdo y, finalmente, recorre el&lt;br /&gt;
-- subárbol derecho. Por ejemplo,&lt;br /&gt;
--    preordenIt (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  [9,3,2,4,7]&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: No usar (++) en la definición&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preordenIt :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preordenIt x&amp;#039; = preordenItAux x&amp;#039; []&lt;br /&gt;
    where preordenItAux (H x) xs     = x:xs&lt;br /&gt;
          preordenItAux (N x i d) xs = &lt;br /&gt;
              x : preordenItAux i (preordenItAux d xs)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.5. Comprobar con QuickCheck que preordenIt es equivalente&lt;br /&gt;
-- a preorden. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_preordenIt :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_preordenIt x =&lt;br /&gt;
    preordenIt x == preorden x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_preordenIt&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. Definir la función&lt;br /&gt;
--    espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (espejo x) es la imagen especular del árbol x. Por ejemplo,&lt;br /&gt;
--    espejo (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (H 7) (N 3 (H 4) (H 2))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo (H x)     = H x&lt;br /&gt;
espejo (N x i d) = N x (espejo d) (espejo i)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Comprobar con QuickCheck que para todo árbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo x = &lt;br /&gt;
  espejo (espejo x) == x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_espejo&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Comprobar con QuickCheck que para todo árbol binario&lt;br /&gt;
-- x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = postorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_reverse_preorden_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_reverse_preorden_espejo x =&lt;br /&gt;
  reverse (preorden (espejo x)) == postorden x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Comprobar con QuickCheck que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_recorrido :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_recorrido x =&lt;br /&gt;
  postorden (espejo x) == reverse (preorden x)&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_recorrido&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. La función take está definida por&lt;br /&gt;
--    take :: Int -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
--    take 0            = []&lt;br /&gt;
--    take (n+1) []     = []&lt;br /&gt;
--    take (n+1) (x:xs) = x : take n xs&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    takeArbol ::  Int -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (takeArbol n t) es el subárbol de t de profundidad n. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    takeArbol 0 (N 9 (N 3 (H 2) (H 4)) (H 7)) == H 9&lt;br /&gt;
--    takeArbol 1 (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (H 3) (H 7)&lt;br /&gt;
--    takeArbol 2 (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (N 3 (H 2) (H 4)) (H 7)&lt;br /&gt;
--    takeArbol 3 (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (N 3 (H 2) (H 4)) (H 7)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
takeArbol :: Int -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
takeArbol _ (H x)     = H x&lt;br /&gt;
takeArbol 0 (N x _ _) = H x&lt;br /&gt;
takeArbol n (N x i d) = &lt;br /&gt;
    N x (takeArbol (n-1) i) (takeArbol (n-1) d)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Comprobar con QuickCheck que la profundidad de &lt;br /&gt;
-- (takeArbol n x) es menor o igual que n, para todo número natural n y&lt;br /&gt;
-- todo árbol x. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_takeArbol :: Int -&amp;gt; Arbol Int -&amp;gt; Property&lt;br /&gt;
prop_takeArbol n x =&lt;br /&gt;
  n &amp;gt;= 0 ==&amp;gt; profundidad (takeArbol n x) &amp;lt;= n&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_takeArbol&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. La función&lt;br /&gt;
--    repeat :: a -&amp;gt; [a]&lt;br /&gt;
-- está definida de forma que (repeat x) es la lista formada por&lt;br /&gt;
-- infinitos elementos x. Por ejemplo,&lt;br /&gt;
--    repeat 3  ==  [3,3,3,3,3,3,3,3,3,3,3,3,3,...&lt;br /&gt;
-- La definición de repeat es&lt;br /&gt;
--    repeat x = xs where xs = x:xs&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    repeatArbol :: a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (repeatArbol x) es es árbol con infinitos nodos x. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    takeArbol 0 (repeatArbol 3) == H 3&lt;br /&gt;
--    takeArbol 1 (repeatArbol 3) == N 3 (H 3) (H 3)&lt;br /&gt;
--    takeArbol 2 (repeatArbol 3) == N 3 (N 3 (H 3) (H 3)) (N 3 (H 3) (H 3))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
repeatArbol :: a -&amp;gt; Arbol a&lt;br /&gt;
repeatArbol x = N x t t&lt;br /&gt;
  where t = repeatArbol x&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. La función &lt;br /&gt;
--    replicate :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- está definida por &lt;br /&gt;
--    replicate n = take n . repeat&lt;br /&gt;
-- es tal que (replicate n x) es la lista de longitud n cuyos elementos&lt;br /&gt;
-- son x. Por ejemplo,&lt;br /&gt;
--    replicate 3 5  ==  [5,5,5]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    replicateArbol :: Int -&amp;gt; a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (replicate n x) es el árbol de profundidad n cuyos nodos son&lt;br /&gt;
-- x. Por ejemplo,&lt;br /&gt;
--    replicateArbol 0 5  ==  H 5&lt;br /&gt;
--    replicateArbol 1 5  ==  N 5 (H 5) (H 5)&lt;br /&gt;
--    replicateArbol 2 5  ==  N 5 (N 5 (H 5) (H 5)) (N 5 (H 5) (H 5))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
replicateArbol :: Int -&amp;gt; a -&amp;gt; Arbol a&lt;br /&gt;
replicateArbol n = takeArbol n . repeatArbol&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Comprobar con QuickCheck que el número de hojas de &lt;br /&gt;
-- (replicateArbol n x) es 2^n, para todo número natural n&lt;br /&gt;
--&lt;br /&gt;
-- Nota. Al hacer la comprobación limitar el tamańo de las pruebas como&lt;br /&gt;
-- se indica a continuación&lt;br /&gt;
--    quickCheckWith (stdArgs {maxSize=7}) prop_replicateArbol&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_replicateArbol :: Int -&amp;gt; Int -&amp;gt; Property&lt;br /&gt;
prop_replicateArbol n x =&lt;br /&gt;
  n &amp;gt;= 0 ==&amp;gt; nHojas (replicateArbol n x) == 2^n&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheckWith (stdArgs {maxSize=7}) prop_replicateArbol&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir la función&lt;br /&gt;
--    mapArbol :: (a -&amp;gt; a) -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (mapArbol f x) es el árbol obtenido aplicándole a cada nodo de&lt;br /&gt;
-- x la función f. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; mapArbol (*2) (N 9 (N 3 (H 2) (H 4)) (H 7)) &lt;br /&gt;
--    N 18 (N 6 (H 4) (H 8)) (H 14)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
mapArbol :: (a -&amp;gt; a) -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
mapArbol f (H x)     = H (f x)&lt;br /&gt;
mapArbol f (N x i d) = N (f x) (mapArbol f i) (mapArbol f d)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que &lt;br /&gt;
--    (mapArbol (1+)) . espejo = espejo . (mapArbol (1+))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_mapArbol_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_mapArbol_espejo x =&lt;br /&gt;
    (mapArbol (1+) . espejo) x == (espejo . mapArbol (1+)) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_mapArbol_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que&lt;br /&gt;
--    (map (1+)) . preorden = preorden . (mapArbol (1+)) &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_map_preorden :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_map_preorden x =&lt;br /&gt;
    (map (1+) . preorden) x == (preorden . mapArbol (1+)) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_map_preorden&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Nota. Para comprobar propiedades de árboles con QuickCheck se&lt;br /&gt;
-- utilizará el siguiente generador.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
instance Arbitrary a =&amp;gt; Arbitrary (Arbol a) where&lt;br /&gt;
  arbitrary = sized arbol&lt;br /&gt;
    where&lt;br /&gt;
      arbol 0       = fmap H arbitrary &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [fmap H arbitrary,&lt;br /&gt;
                             liftM3 N arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
      arbol _       = error &amp;quot;Imposible&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_12&amp;diff=564</id>
		<title>Relación 12</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_12&amp;diff=564"/>
		<updated>2021-12-19T18:16:45Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Página creada con «&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;  -- I1M 2021-22: Relación 12 (7 de enero de 2022) -- Tipos de datos algebraicos: Árboles binarios. -- Departamento de Ciencias de la Computación…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Relación 12 (7 de enero de 2022)&lt;br /&gt;
-- Tipos de datos algebraicos: Árboles binarios.&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- En esta relación se presenta ejercicios sobre árboles binarios&lt;br /&gt;
-- definidos como tipos de datos algebraicos.&lt;br /&gt;
-- &lt;br /&gt;
-- Los ejercicios corresponden al tema 9 que se encuentra en &lt;br /&gt;
--    http://www.cs.us.es/cursos/i1m/temas/tema-9.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Nota. En los siguientes ejercicios se trabajará con los árboles&lt;br /&gt;
-- binarios definidos como sigue &lt;br /&gt;
--    data Arbol a = H a&lt;br /&gt;
--                 | N a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Por ejemplo, el árbol&lt;br /&gt;
--         9 &lt;br /&gt;
--        / \&lt;br /&gt;
--       /   \&lt;br /&gt;
--      3     7&lt;br /&gt;
--     / \  &lt;br /&gt;
--    2   4 &lt;br /&gt;
-- se representa por&lt;br /&gt;
--    N 9 (N 3 (H 2) (H 4)) (H 7) &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol a = H a&lt;br /&gt;
             | N a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Definir la función&lt;br /&gt;
--    nHojas :: Arbol a -&amp;gt; Int&lt;br /&gt;
-- tal que (nHojas x) es el número de hojas del árbol x. Por ejemplo,&lt;br /&gt;
--    nHojas (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
nHojas :: Arbol a -&amp;gt; Int&lt;br /&gt;
nHojas = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la función&lt;br /&gt;
--    nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
-- tal que (nNodos x) es el número de nodos del árbol x. Por ejemplo,&lt;br /&gt;
--    nNodos (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Comprobar con QuickCheck que en todo árbol binario el&lt;br /&gt;
-- número de sus hojas es igual al número de sus nodos más uno.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nHojas :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nHojas x = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir la función&lt;br /&gt;
--    profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
-- tal que (profundidad x) es la profundidad del árbol x. Por ejemplo,&lt;br /&gt;
--    profundidad (N 9 (N 3 (H 2) (H 4)) (H 7))              ==  2&lt;br /&gt;
--    profundidad (N 9 (N 3 (H 2) (N 1 (H 4) (H 5))) (H 7))  ==  3&lt;br /&gt;
--    profundidad (N 4 (N 5 (H 4) (H 2)) (N 3 (H 7) (H 4)))  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Comprobar con QuickCheck que para todo árbol biario&lt;br /&gt;
-- x, se tiene que&lt;br /&gt;
--    nNodos x &amp;lt;= 2^(profundidad x) - 1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodosProfundidad :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodosProfundidad x = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir la función&lt;br /&gt;
--    preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
-- tal que (preorden x) es la lista correspondiente al recorrido&lt;br /&gt;
-- preorden del árbol x; es decir, primero visita la raíz del árbol, a&lt;br /&gt;
-- continuación recorre el subárbol izquierdo y, finalmente, recorre el&lt;br /&gt;
-- subárbol derecho. Por ejemplo,&lt;br /&gt;
--    preorden (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Comprobar con QuickCheck que la longitud de la lista&lt;br /&gt;
-- obtenida recorriendo un árbol en sentido preorden es igual al número&lt;br /&gt;
-- de nodos del árbol más el número de hojas.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_length_preorden :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_length_preorden x = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.3. Definir la función&lt;br /&gt;
--    postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
-- tal que (postorden x) es la lista correspondiente al recorrido&lt;br /&gt;
-- postorden del árbol x; es decir, primero recorre el subárbol&lt;br /&gt;
-- izquierdo, a continuación el subárbol derecho y, finalmente, la raíz&lt;br /&gt;
-- del árbol. Por ejemplo,&lt;br /&gt;
--    postorden (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.4. Definir, usando un acumulador, la función&lt;br /&gt;
--    preordenIt :: Arbol a -&amp;gt; [a]&lt;br /&gt;
-- tal que (preordenIt x) es la lista correspondiente al recorrido&lt;br /&gt;
-- preorden del árbol x; es decir, primero visita la raíz del árbol, a&lt;br /&gt;
-- continuación recorre el subárbol izquierdo y, finalmente, recorre el&lt;br /&gt;
-- subárbol derecho. Por ejemplo,&lt;br /&gt;
--    preordenIt (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  [9,3,2,4,7]&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: No usar (++) en la definición&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
preordenIt :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preordenIt x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.5. Comprobar con QuickCheck que preordenIt es equivalente&lt;br /&gt;
-- a preorden. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_preordenIt :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_preordenIt x = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. Definir la función&lt;br /&gt;
--    espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (espejo x) es la imagen especular del árbol x. Por ejemplo,&lt;br /&gt;
--    espejo (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (H 7) (N 3 (H 4) (H 2))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Comprobar con QuickCheck que para todo árbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo x = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Comprobar con QuickCheck que para todo árbol binario&lt;br /&gt;
-- x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = postorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_reverse_preorden_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_reverse_preorden_espejo x = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Comprobar con QuickCheck que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_recorrido :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_recorrido x = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. La función take está definida por&lt;br /&gt;
--    take :: Int -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
--    take 0            = []&lt;br /&gt;
--    take (n+1) []     = []&lt;br /&gt;
--    take (n+1) (x:xs) = x : take n xs&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    takeArbol ::  Int -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (takeArbol n t) es el subárbol de t de profundidad n. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    takeArbol 0 (N 9 (N 3 (H 2) (H 4)) (H 7)) == H 9&lt;br /&gt;
--    takeArbol 1 (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (H 3) (H 7)&lt;br /&gt;
--    takeArbol 2 (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (N 3 (H 2) (H 4)) (H 7)&lt;br /&gt;
--    takeArbol 3 (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (N 3 (H 2) (H 4)) (H 7)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
takeArbol :: Int -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
takeArbol = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Comprobar con QuickCheck que la profundidad de &lt;br /&gt;
-- (takeArbol n x) es menor o igual que n, para todo número natural n y&lt;br /&gt;
-- todo árbol x. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_takeArbol:: Int -&amp;gt; Arbol Int -&amp;gt; Property&lt;br /&gt;
prop_takeArbol n x = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. La función&lt;br /&gt;
--    repeat :: a -&amp;gt; [a]&lt;br /&gt;
-- está definida de forma que (repeat x) es la lista formada por&lt;br /&gt;
-- infinitos elementos x. Por ejemplo,&lt;br /&gt;
--    repeat 3  ==  [3,3,3,3,3,3,3,3,3,3,3,3,3,...&lt;br /&gt;
-- La definición de repeat es&lt;br /&gt;
--    repeat x = xs where xs = x:xs&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    repeatArbol :: a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (repeatArbol x) es es árbol con infinitos nodos x. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    takeArbol 0 (repeatArbol 3) == H 3&lt;br /&gt;
--    takeArbol 1 (repeatArbol 3) == N 3 (H 3) (H 3)&lt;br /&gt;
--    takeArbol 2 (repeatArbol 3) == N 3 (N 3 (H 3) (H 3)) (N 3 (H 3) (H 3))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
repeatArbol :: a -&amp;gt; Arbol a&lt;br /&gt;
repeatArbol x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. La función &lt;br /&gt;
--    replicate :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- está definida por &lt;br /&gt;
--    replicate n = take n . repeat&lt;br /&gt;
-- es tal que (replicate n x) es la lista de longitud n cuyos elementos&lt;br /&gt;
-- son x. Por ejemplo,&lt;br /&gt;
--    replicate 3 5  ==  [5,5,5]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    replicateArbol :: Int -&amp;gt; a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (replicate n x) es el árbol de profundidad n cuyos nodos son&lt;br /&gt;
-- x. Por ejemplo,&lt;br /&gt;
--    replicateArbol 0 5  ==  H 5&lt;br /&gt;
--    replicateArbol 1 5  ==  N 5 (H 5) (H 5)&lt;br /&gt;
--    replicateArbol 2 5  ==  N 5 (N 5 (H 5) (H 5)) (N 5 (H 5) (H 5))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
replicateArbol :: Int -&amp;gt; a -&amp;gt; Arbol a&lt;br /&gt;
replicateArbol n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Comprobar con QuickCheck que el número de hojas de &lt;br /&gt;
-- (replicateArbol n x) es 2^n, para todo número natural n&lt;br /&gt;
--&lt;br /&gt;
-- Nota. Al hacer la comprobación limitar el tamańo de las pruebas como&lt;br /&gt;
-- se indica a continuación&lt;br /&gt;
--    quickCheckWith (stdArgs {maxSize=7}) prop_replicateArbol&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_replicateArbol :: Int -&amp;gt; Int -&amp;gt; Property&lt;br /&gt;
prop_replicateArbol n x = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir la función&lt;br /&gt;
--    mapArbol :: (a -&amp;gt; a) -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (mapArbol f x) es el árbol obtenido aplicándole a cada nodo de&lt;br /&gt;
-- x la función f. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; mapArbol (*2) (N 9 (N 3 (H 2) (H 4)) (H 7)) &lt;br /&gt;
--    N 18 (N 6 (H 4) (H 8)) (H 14)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
mapArbol :: (a -&amp;gt; a) -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
mapArbol = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que &lt;br /&gt;
--    (mapArbol (1+)) . espejo = espejo . (mapArbol (1+))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_mapArbol_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_mapArbol_espejo x = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que&lt;br /&gt;
--    (map (1+)) . preorden = preorden . (mapArbol (1+)) &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_map_preorden :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_map_preorden x = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Nota. Para comprobar propiedades de árboles con QuickCheck se&lt;br /&gt;
-- utilizará el siguiente generador.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
instance Arbitrary a =&amp;gt; Arbitrary (Arbol a) where&lt;br /&gt;
  arbitrary = sized arbol&lt;br /&gt;
    where&lt;br /&gt;
      arbol 0       = liftM H arbitrary &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [liftM H arbitrary,&lt;br /&gt;
                             liftM3 N arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
      arbol _       = error &amp;quot;Imposible&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Archivo:Rel_12.hs&amp;diff=563</id>
		<title>Archivo:Rel 12.hs</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Archivo:Rel_12.hs&amp;diff=563"/>
		<updated>2021-12-19T18:15:44Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=562</id>
		<title>Informática (1º Matemáticas)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=562"/>
		<updated>2021-12-19T18:14:25Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: /* Relación de Ejercicios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==Relación de Ejercicios==&lt;br /&gt;
&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Definiciones por composición sobre números, listas y booleanos. [ [[Media:Rel_1.hs |Enunciado]], [[Relación 1 |Solución colaborativa]], [[Relación 1 Sol |Solución]]  ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Definiciones con condicionales, guardas o patrones. [ [[Media:Rel_2.hs |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Relación 2 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión. [ [[Media:Rel_3.hs |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Relación 3 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión (extra). [ [[Media:Rel_4.hs |Enunciado]], [[Relación 4 |Solución colaborativa editada]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión con cadenas: El cifrado césar. [ [[Media:Rel_5.hs |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Relación 5 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión. [ [[Media:Rel_6.hs |Enunciado]], [[Relación 6 |Solución colaborativa]], [[Relación 6 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión y comprensión (extra). [ [[Media:Rel_7.hs |Enunciado]], [[Relación 7 |Solución colaborativa]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados (extra). [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Propiedades del número 2021. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10 |Solución colaborativa]]&amp;lt;!--, [[Relación 10 Sol |Solución ]]--&amp;gt; ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Listas infinitas y evaluación perezosa. [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11 |Solución colaborativa]]&amp;lt;!--, [[Relación 11 Sol |Solución ]]--&amp;gt; ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos, Árboles binarios. [ [[Media:Rel_12.hs |Enunciado]], [[Relación 12|Solución colaborativa]], [[Relación 12 Sol |Solución]] ]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: El algoritmo de Luhn. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones sobre cadenas. [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (II). [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11|Solución colaborativa]], [[Relación 11 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la programación funcional con listas infinitas. [ [[Media:Rel_14.hs |Enunciado]], [[Relación 14 colab|Solución colaborativa]], [[Relación 14|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: Ecuación con factoriales. [ [[Media:Rel_15.hs |Enunciado]], [[Relación 15 colab |Solución colaborativa]], [[Relación 15 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 16&amp;#039;&amp;#039;&amp;#039;: El juego del nim y las funciones de entrada/salida. [ [[Media:Rel_16.hs |Enunciado]], [[Relación 16 colab|Solución colaborativa]], [[Relación 16 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 17&amp;#039;&amp;#039;&amp;#039;: Cálculo del número pi mediante el método de Montecarlo. [ [[Media:Rel_17.hs |Enunciado]], [[Relación 17 |Solución colaborativa]], [[Rel 17 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 18&amp;#039;&amp;#039;&amp;#039;: Aproximaciones de pi. [ [[Media:Rel_18.hs |Enunciado]], [http://www.cs.us.es/~mjoseh/Digitos_de_pi.txt Fichero con los dígitos de pi], [[Relación 18 |Solución colaborativa]], [[Rel 18 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 19&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices. [ [[Media:Rel_19.hs |Enunciado]], [[Relación 19 |Solución colaborativa]], [[Relación 19 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Método de Gauss para triangularizar matrices. [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 |Solución colaborativa]], [[Relación 20 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 21&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices con librerías Data.Matrix y Data.Vector. [ [[Media:Rel_21.hs |Enunciado]], [[Relación 21 |Solución colaborativa]], [[Relación 21 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 22&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices: ejercicios de exámenes (para repasar). [ [[Media:Rel_22.hs |Enunciado]], [[Relación 22 |Solución colaborativa]], [[Relación 22 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 23&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_23.hs |Enunciado]], [[Relación 23 |Solución colaborativa]], [[Relación 23 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico (2): límites, bisección, integrales y bajada. [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva. [ [[Media:Rel_25.hs |Enunciado]], [[Relación 25 |Solución colaborativa]], [[Relación 25 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 26&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva con librerías (solucionada). [ [[Relación 26 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 27&amp;#039;&amp;#039;&amp;#039;: Combinatoria. [ [[Media:Rel_27.hs |Enunciado]], [[Relación 27 |Solución colaborativa]], [[Relación 27 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: El TAD de las pilas.  [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 |Solución colaborativa]], [[Relación 28 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de las colas.  [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 |Solución colaborativa]], [[Relación 29 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de conjuntos.  [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 colab |Solución colaborativa]], [[Relación 31 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 32&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. Regla de Ruffini. [ [[Media:Rel_32.hs |Enunciado]], [[Relación 32 colab |Solución colaborativa]], [[Relación 32 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g1.hs |Enunciado]], [[Exam 3g1 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g2.hs |Enunciado]], [[Exam 3g2 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de los montículos. Librería en https://cutt.ly/tbDyRlr [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Media:Relación_33_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Media:Relación_34_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería Data.Set. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 |Solución colaborativa]], [[Media:Relación_35_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 36&amp;#039;&amp;#039;&amp;#039;: Problemas básicos con el TAD de los grafos. [ [[Media:Rel_36.hs |Enunciado]], [[Relación 36 Colab |Solución colaborativa]], [[Media:Relación_36_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante listas. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica I&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_1.hs |Enunciado]], [[Programación dinámica I |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica II&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_2.hs |Enunciado]], [[Programación Dinámica II |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Grafos&amp;#039;&amp;#039;&amp;#039;: Ejercicios de examen sobre grafos. ([[Media:masgrafos.hs |Enunciado]], [[Grafos (Ej. examen) |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Técnica Divide y vencerás&amp;#039;&amp;#039;&amp;#039;: Puzzle. ([[Media:triomino.hs |Enunciado]], [[Triominos |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica III&amp;#039;&amp;#039;&amp;#039;: Ejercicios de programación dinámica. ([[Media:dinamica3_3.hs |Enunciado]], [[Programación Dinámica III |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso I&amp;#039;&amp;#039;&amp;#039;. ([[Media:Lychrel.hs |Enunciado]], [[Repaso I. Números de Lychrel |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso II: ejercicios de examen&amp;#039;&amp;#039;&amp;#039;. ([[Media:ejExamenes.hs |Enunciado]], [[Repaso II.  |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios Complementarios.&amp;#039;&amp;#039;&amp;#039;([[Media:ejcomplementarios.hs |Enunciado]], [[Ejercicios Complementarios|Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Más ejercicios de examen.&amp;#039;&amp;#039;&amp;#039;([[Media:ejExam.hs |Enunciado]], [[Ejercicios de examen|Solución colaborativa]]).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;!-- EJERCICIOS DEL CURSO PASADO&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Ejercicios de exámenes sobre grafos. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 Colab |Solución colaborativa]], [[Relación 37 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~mjoseh/cursos/i1m-20/doc/manual-Data.Set.html Data.Set]. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Relación 34 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico en Maxima: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_25.mac |Enunciado]], [[Relación 25 |Solución colaborativa]] [[Relación 25 Sol |Solución]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/manual-Data.Set.html Data.Set] (erratas solucionadas). [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 colab |Solución colaborativa]], [[Relación 28 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: División y factorización de polinomios mediante la regla de Ruffini. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Caminos en una retícula. [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Apilamiento de barriles. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 |Solución colaborativa]], [[Relación 31 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante diccionarios. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 Colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de los multiconjuntos mediante diccionarios. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: El problema del granjero mediante búsqueda en espacio de estado. [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Relación 33 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Resolución de problemas mediante búsqueda en espacios de estados. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 colab |Solución colaborativa]], [[Relación 35 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados de repaso.  [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 colab |Solución colaborativa]] ]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Curso Actual==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 1&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(12/11/2021)&amp;#039;&amp;#039;: [ [[Media:Exam1_G2.hs |Enunciado]], [[Parcial 1 |Solución colaborativa]], [[Parcial 1 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 2&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(20/01/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 3&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(08/04/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 4&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(10/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 5&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(24/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Cursos Anteriores==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://github.com/jaalonso/Examenes_de_PF_con_Haskell/blob/master/README.org Repositorio de Exámenes]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Curso 2020/21 Grupo 2&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 11/12/20 |Examen 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(11/12/2020)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 16/02/21 |Examen 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(16/02/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 23/04/21 |Examen 3 Turno 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(23/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 28/04/21 |Examen 3 Turno 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(28/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 21/06/21 |Examen 4]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(21/06/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 05/07/2021 |Examen Julio]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(05/07/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 07/09/2021 |Examen Septiembre]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(07/09/2021)&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=543</id>
		<title>Informática (1º Matemáticas)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=543"/>
		<updated>2021-12-13T16:58:47Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: /* Relación de Ejercicios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==Relación de Ejercicios==&lt;br /&gt;
&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Definiciones por composición sobre números, listas y booleanos. [ [[Media:Rel_1.hs |Enunciado]], [[Relación 1 |Solución colaborativa]], [[Relación 1 Sol |Solución]]  ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Definiciones con condicionales, guardas o patrones. [ [[Media:Rel_2.hs |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Relación 2 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión. [ [[Media:Rel_3.hs |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Relación 3 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión (extra). [ [[Media:Rel_4.hs |Enunciado]], [[Relación 4 |Solución colaborativa editada]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión con cadenas: El cifrado césar. [ [[Media:Rel_5.hs |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Relación 5 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión. [ [[Media:Rel_6.hs |Enunciado]], [[Relación 6 |Solución colaborativa]], [[Relación 6 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión y comprensión (extra). [ [[Media:Rel_7.hs |Enunciado]], [[Relación 7 |Solución colaborativa]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados (extra). [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Propiedades del número 2021. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10 |Solución colaborativa]]&amp;lt;!--, [[Relación 10 Sol |Solución ]]--&amp;gt; ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Listas infinitas y evaluación perezosa. [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11 |Solución colaborativa]]&amp;lt;!--, [[Relación 11 Sol |Solución ]]--&amp;gt; ]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: El algoritmo de Luhn. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones sobre cadenas. [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos, Árboles binarios. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10|Solución colaborativa]], [[Relación 10 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (II). [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11|Solución colaborativa]], [[Relación 11 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la programación funcional con listas infinitas. [ [[Media:Rel_14.hs |Enunciado]], [[Relación 14 colab|Solución colaborativa]], [[Relación 14|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: Ecuación con factoriales. [ [[Media:Rel_15.hs |Enunciado]], [[Relación 15 colab |Solución colaborativa]], [[Relación 15 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 16&amp;#039;&amp;#039;&amp;#039;: El juego del nim y las funciones de entrada/salida. [ [[Media:Rel_16.hs |Enunciado]], [[Relación 16 colab|Solución colaborativa]], [[Relación 16 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 17&amp;#039;&amp;#039;&amp;#039;: Cálculo del número pi mediante el método de Montecarlo. [ [[Media:Rel_17.hs |Enunciado]], [[Relación 17 |Solución colaborativa]], [[Rel 17 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 18&amp;#039;&amp;#039;&amp;#039;: Aproximaciones de pi. [ [[Media:Rel_18.hs |Enunciado]], [http://www.cs.us.es/~mjoseh/Digitos_de_pi.txt Fichero con los dígitos de pi], [[Relación 18 |Solución colaborativa]], [[Rel 18 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 19&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices. [ [[Media:Rel_19.hs |Enunciado]], [[Relación 19 |Solución colaborativa]], [[Relación 19 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Método de Gauss para triangularizar matrices. [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 |Solución colaborativa]], [[Relación 20 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 21&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices con librerías Data.Matrix y Data.Vector. [ [[Media:Rel_21.hs |Enunciado]], [[Relación 21 |Solución colaborativa]], [[Relación 21 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 22&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices: ejercicios de exámenes (para repasar). [ [[Media:Rel_22.hs |Enunciado]], [[Relación 22 |Solución colaborativa]], [[Relación 22 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 23&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_23.hs |Enunciado]], [[Relación 23 |Solución colaborativa]], [[Relación 23 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico (2): límites, bisección, integrales y bajada. [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva. [ [[Media:Rel_25.hs |Enunciado]], [[Relación 25 |Solución colaborativa]], [[Relación 25 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 26&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva con librerías (solucionada). [ [[Relación 26 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 27&amp;#039;&amp;#039;&amp;#039;: Combinatoria. [ [[Media:Rel_27.hs |Enunciado]], [[Relación 27 |Solución colaborativa]], [[Relación 27 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: El TAD de las pilas.  [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 |Solución colaborativa]], [[Relación 28 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de las colas.  [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 |Solución colaborativa]], [[Relación 29 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de conjuntos.  [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 colab |Solución colaborativa]], [[Relación 31 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 32&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. Regla de Ruffini. [ [[Media:Rel_32.hs |Enunciado]], [[Relación 32 colab |Solución colaborativa]], [[Relación 32 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g1.hs |Enunciado]], [[Exam 3g1 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g2.hs |Enunciado]], [[Exam 3g2 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de los montículos. Librería en https://cutt.ly/tbDyRlr [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Media:Relación_33_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Media:Relación_34_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería Data.Set. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 |Solución colaborativa]], [[Media:Relación_35_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 36&amp;#039;&amp;#039;&amp;#039;: Problemas básicos con el TAD de los grafos. [ [[Media:Rel_36.hs |Enunciado]], [[Relación 36 Colab |Solución colaborativa]], [[Media:Relación_36_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante listas. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica I&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_1.hs |Enunciado]], [[Programación dinámica I |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica II&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_2.hs |Enunciado]], [[Programación Dinámica II |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Grafos&amp;#039;&amp;#039;&amp;#039;: Ejercicios de examen sobre grafos. ([[Media:masgrafos.hs |Enunciado]], [[Grafos (Ej. examen) |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Técnica Divide y vencerás&amp;#039;&amp;#039;&amp;#039;: Puzzle. ([[Media:triomino.hs |Enunciado]], [[Triominos |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica III&amp;#039;&amp;#039;&amp;#039;: Ejercicios de programación dinámica. ([[Media:dinamica3_3.hs |Enunciado]], [[Programación Dinámica III |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso I&amp;#039;&amp;#039;&amp;#039;. ([[Media:Lychrel.hs |Enunciado]], [[Repaso I. Números de Lychrel |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso II: ejercicios de examen&amp;#039;&amp;#039;&amp;#039;. ([[Media:ejExamenes.hs |Enunciado]], [[Repaso II.  |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios Complementarios.&amp;#039;&amp;#039;&amp;#039;([[Media:ejcomplementarios.hs |Enunciado]], [[Ejercicios Complementarios|Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Más ejercicios de examen.&amp;#039;&amp;#039;&amp;#039;([[Media:ejExam.hs |Enunciado]], [[Ejercicios de examen|Solución colaborativa]]).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;!-- EJERCICIOS DEL CURSO PASADO&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Ejercicios de exámenes sobre grafos. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 Colab |Solución colaborativa]], [[Relación 37 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~mjoseh/cursos/i1m-20/doc/manual-Data.Set.html Data.Set]. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Relación 34 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico en Maxima: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_25.mac |Enunciado]], [[Relación 25 |Solución colaborativa]] [[Relación 25 Sol |Solución]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/manual-Data.Set.html Data.Set] (erratas solucionadas). [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 colab |Solución colaborativa]], [[Relación 28 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: División y factorización de polinomios mediante la regla de Ruffini. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Caminos en una retícula. [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Apilamiento de barriles. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 |Solución colaborativa]], [[Relación 31 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante diccionarios. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 Colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de los multiconjuntos mediante diccionarios. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: El problema del granjero mediante búsqueda en espacio de estado. [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Relación 33 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Resolución de problemas mediante búsqueda en espacios de estados. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 colab |Solución colaborativa]], [[Relación 35 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados de repaso.  [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 colab |Solución colaborativa]] ]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Curso Actual==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 1&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(12/11/2021)&amp;#039;&amp;#039;: [ [[Media:Exam1_G2.hs |Enunciado]], [[Parcial 1 |Solución colaborativa]], [[Parcial 1 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 2&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(20/01/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 3&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(08/04/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 4&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(10/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 5&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(24/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Cursos Anteriores==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://github.com/jaalonso/Examenes_de_PF_con_Haskell/blob/master/README.org Repositorio de Exámenes]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Curso 2020/21 Grupo 2&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 11/12/20 |Examen 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(11/12/2020)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 16/02/21 |Examen 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(16/02/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 23/04/21 |Examen 3 Turno 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(23/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 28/04/21 |Examen 3 Turno 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(28/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 21/06/21 |Examen 4]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(21/06/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 05/07/2021 |Examen Julio]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(05/07/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 07/09/2021 |Examen Septiembre]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(07/09/2021)&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_11_Sol&amp;diff=542</id>
		<title>Relación 11 Sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_11_Sol&amp;diff=542"/>
		<updated>2021-12-13T16:58:32Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Protegió «Relación 11 Sol» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Relación 11 solución&lt;br /&gt;
-- Evaluación perezosa y listas infinitas.&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- En esta relación se presentan ejercicios con listas infinitas y&lt;br /&gt;
-- evaluación perezosa. Estos ejercicios corresponden al tema 10 que&lt;br /&gt;
-- se encuentra en  &lt;br /&gt;
--    https://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-10.html&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías auxiliares                                  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Definir, por recursión, la función &lt;br /&gt;
--    repite :: a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repite x) es la lista infinita cuyos elementos son x. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    repite 5           ==  [5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,...&lt;br /&gt;
--    take 3 (repite 5)  ==  [5,5,5]&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función repite es equivalente a la función repeat definida&lt;br /&gt;
-- en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- 1ª definición:&lt;br /&gt;
repite1 :: a -&amp;gt; [a]&lt;br /&gt;
repite1 x = x : repite1 x&lt;br /&gt;
 &lt;br /&gt;
-- 2ª definición:&lt;br /&gt;
repite2 :: a -&amp;gt; [a]&lt;br /&gt;
repite2 x = ys &lt;br /&gt;
    where ys = x:ys&lt;br /&gt;
 &lt;br /&gt;
-- La 2ª definición es más eficiente:&lt;br /&gt;
--    ghci&amp;gt; last (take 100000000 (repite1 5))&lt;br /&gt;
--    5&lt;br /&gt;
--    (46.56 secs, 16001567944 bytes)&lt;br /&gt;
--    ghci&amp;gt; last (take 100000000 (repite2 5))&lt;br /&gt;
--    5&lt;br /&gt;
--    (2.34 secs, 5601589608 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- Usaremos como repite la 2ª definición&lt;br /&gt;
repite :: a -&amp;gt; [a]&lt;br /&gt;
repite = repite2&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir, por comprensión, la función &lt;br /&gt;
--    repiteC :: a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repiteC x) es la lista infinita cuyos elementos son x. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    repiteC 5           ==  [5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,...&lt;br /&gt;
--    take 3 (repiteC 5)  ==  [5,5,5]&lt;br /&gt;
--&lt;br /&gt;
-- Nota: La función repiteC es equivalente a la función repeat definida&lt;br /&gt;
-- en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
repiteC :: a -&amp;gt; [a]&lt;br /&gt;
repiteC x = [x | _ &amp;lt;- [1..]]&lt;br /&gt;
 &lt;br /&gt;
-- La función repite2 es más eficiente que repiteC&lt;br /&gt;
--    ghci&amp;gt; last (take 10000000 (repiteC 5))&lt;br /&gt;
--    5&lt;br /&gt;
--    (6.05 secs, 1,997,740,536 bytes)&lt;br /&gt;
--    ghci&amp;gt; last (take 10000000 (repite2 5))&lt;br /&gt;
--    5&lt;br /&gt;
--    (0.31 secs, 541,471,280 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir, por recursión, la función &lt;br /&gt;
--    repiteFinitaR :: Int-&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repiteFinitaR n x) es la lista con n elementos iguales a&lt;br /&gt;
-- x. Por ejemplo, &lt;br /&gt;
--    repiteFinitaR 3 5  ==  [5,5,5]&lt;br /&gt;
--&lt;br /&gt;
-- Nota: La función repiteFinitaR es equivalente a la función replicate&lt;br /&gt;
-- definida en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
repiteFinitaR :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
repiteFinitaR n x | n &amp;lt;= 0    = []&lt;br /&gt;
                  | otherwise = x : repiteFinitaR (n-1) x&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir, por comprensión, la función &lt;br /&gt;
--    repiteFinitaC :: Int-&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repiteFinitaC n x) es la lista con n elementos iguales a&lt;br /&gt;
-- x. Por ejemplo, &lt;br /&gt;
--    repiteFinitaC 3 5  ==  [5,5,5]&lt;br /&gt;
--&lt;br /&gt;
-- Nota: La función repiteFinitaC es equivalente a la función replicate&lt;br /&gt;
-- definida en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
repiteFinitaC :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
repiteFinitaC n x = [x | _ &amp;lt;- [1..n]]&lt;br /&gt;
 &lt;br /&gt;
-- La función repiteFinitaC es más eficiente que repiteFinitaR&lt;br /&gt;
--    ghci&amp;gt; last (repiteFinitaR 10000000 5)&lt;br /&gt;
--    5&lt;br /&gt;
--    (17.04 secs, 2,475,222,448 bytes)&lt;br /&gt;
--    ghci&amp;gt; last (repiteFinitaC 10000000 5)&lt;br /&gt;
--    5&lt;br /&gt;
--    (5.43 secs, 1,511,227,176 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.3. Definir, usando repite, la función &lt;br /&gt;
--    repiteFinita :: Int-&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repiteFinita n x) es la lista con n elementos iguales a&lt;br /&gt;
-- x. Por ejemplo, &lt;br /&gt;
--    repiteFinita 3 5  ==  [5,5,5]&lt;br /&gt;
--&lt;br /&gt;
-- Nota: La función repiteFinita es equivalente a la función replicate&lt;br /&gt;
-- definida en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
repiteFinita :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
repiteFinita n x = take n (repite x)&lt;br /&gt;
 &lt;br /&gt;
-- La función repiteFinita es más eficiente que repiteFinitaC&lt;br /&gt;
--    ghci&amp;gt; last (repiteFinitaC 10000000 5)&lt;br /&gt;
--    5&lt;br /&gt;
--    (5.43 secs, 1,511,227,176 bytes)&lt;br /&gt;
--    ghci&amp;gt; last (repiteFinita 10000000 5)&lt;br /&gt;
--    5&lt;br /&gt;
--    (0.29 secs, 541,809,248 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- 2ª definición&lt;br /&gt;
repiteFinita2 :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
repiteFinita2 n = take n . repite &lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.4. Comprobar con QuickCheck que las funciones&lt;br /&gt;
-- repiteFinitaR, repiteFinitaC y repiteFinita son equivalentes a&lt;br /&gt;
-- replicate. &lt;br /&gt;
--&lt;br /&gt;
-- Nota. Al hacer la comprobación limitar el tamaño de las pruebas como&lt;br /&gt;
-- se indica a continuación&lt;br /&gt;
--    quickCheckWith (stdArgs {maxSize=7}) prop_repiteFinitaEquiv&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_repiteFinitaEquiv :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_repiteFinitaEquiv n x =&lt;br /&gt;
    repiteFinitaR n x == y &amp;amp;&amp;amp;&lt;br /&gt;
    repiteFinitaC n x == y &amp;amp;&amp;amp;&lt;br /&gt;
    repiteFinita  n x == y&lt;br /&gt;
    where y = replicate n x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheckWith (stdArgs {maxSize=20}) prop_repiteFinitaEquiv&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.5. Comprobar con QuickCheck que la longitud de&lt;br /&gt;
-- (repiteFinita n x) es n, si n es positivo y 0 si no lo es.&lt;br /&gt;
--&lt;br /&gt;
-- Nota. Al hacer la comprobación limitar el tamaño de las pruebas como&lt;br /&gt;
-- se indica a continuación&lt;br /&gt;
--    quickCheckWith (stdArgs {maxSize=30}) prop_repiteFinitaLongitud&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_repiteFinitaLongitud :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_repiteFinitaLongitud n x &lt;br /&gt;
    | n &amp;gt; 0     = length (repiteFinita n x) == n&lt;br /&gt;
    | otherwise = null (repiteFinita n x)&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheckWith (stdArgs {maxSize=30}) prop_repiteFinitaLongitud&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- La expresión de la propiedad se puede simplificar&lt;br /&gt;
prop_repiteFinitaLongitud2 :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_repiteFinitaLongitud2 n x =&lt;br /&gt;
    length (repiteFinita n x) == (if n &amp;gt; 0 then n else 0)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.6. Comprobar con QuickCheck que todos los elementos de &lt;br /&gt;
-- (repiteFinita n x) son iguales a x.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_repiteFinitaIguales :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_repiteFinitaIguales n x =&lt;br /&gt;
    all (==x) (repiteFinita n x)&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheckWith (stdArgs {maxSize=30}) prop_repiteFinitaIguales&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir, por comprensión, la función&lt;br /&gt;
--    ecoC :: String -&amp;gt; String&lt;br /&gt;
-- tal que (ecoC xs) es la cadena obtenida a partir de la cadena xs&lt;br /&gt;
-- repitiendo cada elemento tantas veces como indica su posición: el&lt;br /&gt;
-- primer elemento se repite 1 vez, el segundo 2 veces y así&lt;br /&gt;
-- sucesivamente. Por ejemplo, &lt;br /&gt;
--    ecoC &amp;quot;abcd&amp;quot;  ==  &amp;quot;abbcccdddd&amp;quot;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
ecoC :: String -&amp;gt; String&lt;br /&gt;
ecoC xs = concat [replicate i x | (i,x) &amp;lt;- zip [1..] xs]&lt;br /&gt;
 &lt;br /&gt;
-- 2ª definición&lt;br /&gt;
ecoC1 :: String -&amp;gt; String&lt;br /&gt;
ecoC1 = concat . zipWith replicate [1..]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Definir, por recursión, la función&lt;br /&gt;
--    ecoR :: String -&amp;gt; String&lt;br /&gt;
-- tal que (ecoR xs) es la cadena obtenida a partir de la cadena xs&lt;br /&gt;
-- repitiendo cada elemento tantas veces como indica su posición: el&lt;br /&gt;
-- primer elemento se repite 1 vez, el segundo 2 veces y así&lt;br /&gt;
-- sucesivamente. Por ejemplo, &lt;br /&gt;
--    ecoR &amp;quot;abcd&amp;quot;  ==  &amp;quot;abbcccdddd&amp;quot;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- 1ª definición &lt;br /&gt;
ecoR :: String -&amp;gt; String&lt;br /&gt;
ecoR = aux 1&lt;br /&gt;
  where aux _ []     = []&lt;br /&gt;
        aux n (x:xs) = replicate n x ++ aux (n+1) xs&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir, por recursión, la función&lt;br /&gt;
--    itera :: (a -&amp;gt; a) -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- tal que (itera f x) es la lista cuyo primer elemento es x y los&lt;br /&gt;
-- siguientes elementos se calculan aplicando la función f al elemento&lt;br /&gt;
-- anterior. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; itera (+1) 3&lt;br /&gt;
--    [3,4,5,6,7,8,9,10,11,12,{Interrupted!}&lt;br /&gt;
--    ghci&amp;gt; itera (*2) 1&lt;br /&gt;
--    [1,2,4,8,16,32,64,{Interrupted!}&lt;br /&gt;
--    ghci&amp;gt; itera (`div` 10) 1972&lt;br /&gt;
--    [1972,197,19,1,0,0,0,0,0,0,{Interrupted!}&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función itera es equivalente a la función iterate definida&lt;br /&gt;
-- en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
itera :: (a -&amp;gt; a) -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
itera f x = x : itera f (f x)&lt;br /&gt;
 &lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. Definir, por recursión, la función&lt;br /&gt;
--    agrupaR :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (agrupaR n xs) es la lista formada por listas de n elementos&lt;br /&gt;
-- consecutivos de la lista xs (salvo posiblemente la última que puede&lt;br /&gt;
-- tener menos de n elementos). Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; agrupaR 2 [3,1,5,8,2,7]&lt;br /&gt;
--    [[3,1],[5,8],[2,7]]&lt;br /&gt;
--    ghci&amp;gt; agrupaR 2 [3,1,5,8,2,7,9] &lt;br /&gt;
--    [[3,1],[5,8],[2,7],[9]]&lt;br /&gt;
--    ghci&amp;gt; agrupaR 5 &amp;quot;todo necio confunde valor y precio&amp;quot;&lt;br /&gt;
--    [&amp;quot;todo &amp;quot;,&amp;quot;necio&amp;quot;,&amp;quot; conf&amp;quot;,&amp;quot;unde &amp;quot;,&amp;quot;valor&amp;quot;,&amp;quot; y pr&amp;quot;,&amp;quot;ecio&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------------- &lt;br /&gt;
 &lt;br /&gt;
agrupaR :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
agrupaR _ [] = []&lt;br /&gt;
agrupaR n xs = take n xs : agrupaR n (drop n xs)&lt;br /&gt;
 &lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir, de manera no recursiva con iterate, la función&lt;br /&gt;
--    agrupa :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (agrupa n xs) es la lista formada por listas de n elementos&lt;br /&gt;
-- consecutivos de la lista xs (salvo posiblemente la última que puede&lt;br /&gt;
-- tener menos de n elementos). Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; agrupa 2 [3,1,5,8,2,7]&lt;br /&gt;
--    [[3,1],[5,8],[2,7]]&lt;br /&gt;
--    ghci&amp;gt; agrupa 2 [3,1,5,8,2,7,9] &lt;br /&gt;
--    [[3,1],[5,8],[2,7],[9]]&lt;br /&gt;
--    ghci&amp;gt; agrupa 5 &amp;quot;todo necio confunde valor y precio&amp;quot;&lt;br /&gt;
--    [&amp;quot;todo &amp;quot;,&amp;quot;necio&amp;quot;,&amp;quot; conf&amp;quot;,&amp;quot;unde &amp;quot;,&amp;quot;valor&amp;quot;,&amp;quot; y pr&amp;quot;,&amp;quot;ecio&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------------- &lt;br /&gt;
 &lt;br /&gt;
agrupa :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
agrupa n = takeWhile (not . null)&lt;br /&gt;
         . map (take n)&lt;br /&gt;
         . iterate (drop n)&lt;br /&gt;
 &lt;br /&gt;
-- Puede verse su funcionamiento en el siguiente ejemplo,&lt;br /&gt;
--    iterate (drop 2) [5..10]  &lt;br /&gt;
--    ==&amp;gt; [[5,6,7,8,9,10],[7,8,9,10],[9,10],[],[],...&lt;br /&gt;
--    map (take 2) (iterate (drop 2) [5..10])&lt;br /&gt;
--    ==&amp;gt; [[5,6],[7,8],[9,10],[],[],[],[],...&lt;br /&gt;
--    takeWhile (not . null) (map (take 2) (iterate (drop 2) [5..10]))&lt;br /&gt;
--    ==&amp;gt; [[5,6],[7,8],[9,10]]&lt;br /&gt;
 &lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Comprobar con QuickCheck que todos los grupos de&lt;br /&gt;
-- (agrupa n xs) tienen longitud n (salvo el último que puede tener una&lt;br /&gt;
-- longitud menor). &lt;br /&gt;
-- ---------------------------------------------------------------------------- &lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_AgrupaLongitud :: Int -&amp;gt; [Int] -&amp;gt; Property&lt;br /&gt;
prop_AgrupaLongitud n xs =&lt;br /&gt;
    n &amp;gt; 0 &amp;amp;&amp;amp; not (null gs) ==&amp;gt;&lt;br /&gt;
      and [length g == n | g &amp;lt;- init gs] &amp;amp;&amp;amp;&lt;br /&gt;
      0 &amp;lt; length (last gs) &amp;amp;&amp;amp; length (last gs) &amp;lt;= n&lt;br /&gt;
    where gs = agrupa n xs&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_AgrupaLongitud&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.4. Comprobar con QuickCheck que combinando todos los&lt;br /&gt;
-- grupos de (agrupa n xs) se obtiene la lista xs. &lt;br /&gt;
-- ---------------------------------------------------------------------------- &lt;br /&gt;
 &lt;br /&gt;
-- La segunda propiedad es&lt;br /&gt;
prop_AgrupaCombina :: Int -&amp;gt; [Int] -&amp;gt; Property&lt;br /&gt;
prop_AgrupaCombina n xs =&lt;br /&gt;
    n &amp;gt; 0 ==&amp;gt; concat (agrupa n xs) == xs &lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_AgrupaCombina&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Sea la siguiente operación, aplicable a cualquier&lt;br /&gt;
-- número entero positivo:  &lt;br /&gt;
--    * Si el número es par, se divide entre 2.&lt;br /&gt;
--    * Si el número es impar, se multiplica por 3 y se suma 1.&lt;br /&gt;
-- Dado un número cualquiera, podemos considerar su órbita, es decir,&lt;br /&gt;
-- las imágenes sucesivas al iterar la función. Por ejemplo, la órbita&lt;br /&gt;
-- de 13 es&lt;br /&gt;
--    13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1,...&lt;br /&gt;
-- Si observamos este ejemplo, la órbita de 13 es periódica, es decir,&lt;br /&gt;
-- se repite indefinidamente a partir de un momento dado). La conjetura&lt;br /&gt;
-- de Collatz dice que siempre alcanzaremos el 1 para cualquier número&lt;br /&gt;
-- con el que comencemos. Ejemplos:  &lt;br /&gt;
--    * Empezando en n = 6 se obtiene 6, 3, 10, 5, 16, 8, 4, 2, 1.&lt;br /&gt;
--    * Empezando en n = 11 se obtiene: 11, 34, 17, 52, 26, 13, 40, 20,&lt;br /&gt;
--      10, 5, 16, 8, 4, 2, 1. &lt;br /&gt;
--    * Empezando en n = 27, la sucesión tiene 112 pasos, llegando hasta&lt;br /&gt;
--      9232 antes de descender a 1:  27, 82, 41, 124, 62, 31, 94, 47,&lt;br /&gt;
--      142, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274,&lt;br /&gt;
--      137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263,&lt;br /&gt;
--      790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502,&lt;br /&gt;
--      251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958,&lt;br /&gt;
--      479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644,&lt;br /&gt;
--      1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308,&lt;br /&gt;
--      1154, 577, 1732, 866, 433, 1300, 650, 325, 976, 488, 244, 122,&lt;br /&gt;
--      61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5,&lt;br /&gt;
--      16, 8, 4, 2, 1. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    siguiente :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (siguiente n) es el siguiente de n en la sucesión de&lt;br /&gt;
-- Collatz. Por ejemplo,&lt;br /&gt;
--    siguiente 13  ==  40&lt;br /&gt;
--    siguiente 40  ==  20&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
siguiente :: Integer -&amp;gt; Integer&lt;br /&gt;
siguiente n | even n    = n `div` 2&lt;br /&gt;
            | otherwise = 3*n+1&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir, por recursión, la función &lt;br /&gt;
--    collatzR :: Integer -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (collatzR n) es la órbita de CollatzR de n hasta alcanzar el&lt;br /&gt;
-- 1. Por ejemplo,&lt;br /&gt;
--    collatzR 13  ==  [13,40,20,10,5,16,8,4,2,1]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
collatzR :: Integer -&amp;gt; [Integer]&lt;br /&gt;
collatzR 1 = [1]&lt;br /&gt;
collatzR n = n : collatzR (siguiente n)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Definir, sin recursión y con iterate, la función &lt;br /&gt;
--    collatz :: Integer -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (collatz n) es la órbita de Collatz d n hasta alcanzar el&lt;br /&gt;
-- 1. Por ejemplo,&lt;br /&gt;
--    collatz 13  ==  [13,40,20,10,5,16,8,4,2,1]&lt;br /&gt;
-- Indicación: Usar takeWhile e iterate.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
collatz :: Integer -&amp;gt; [Integer]&lt;br /&gt;
collatz n = takeWhile (/=1) (iterate siguiente n) ++ [1]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.4. Definir la función&lt;br /&gt;
--    menorCollatzMayor :: Int -&amp;gt; Integer&lt;br /&gt;
-- tal que (menorCollatzMayor x) es el menor número cuya órbita de&lt;br /&gt;
-- Collatz tiene más de x elementos. Por ejemplo,&lt;br /&gt;
--    menorCollatzMayor 100  ==  27&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
menorCollatzMayor :: Int -&amp;gt; Integer&lt;br /&gt;
menorCollatzMayor x = head [y | y &amp;lt;- [1..], length (collatz y) &amp;gt; x]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.5. Definir la función&lt;br /&gt;
--    menorCollatzSupera :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (menorCollatzSupera x) es el menor número cuya órbita de&lt;br /&gt;
-- Collatz tiene algún elemento mayor que x. Por ejemplo,&lt;br /&gt;
--    menorCollatzSupera 100  ==  15&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- 1ª definición&lt;br /&gt;
menorCollatzSupera :: Integer -&amp;gt; Integer&lt;br /&gt;
menorCollatzSupera x =&lt;br /&gt;
  head [n | n &amp;lt;- [1..], any (&amp;gt; x) (collatzR n)]&lt;br /&gt;
 &lt;br /&gt;
-- 2ª definición&lt;br /&gt;
menorCollatzSupera2 :: Integer -&amp;gt; Integer&lt;br /&gt;
menorCollatzSupera2 x = &lt;br /&gt;
  head [y | y &amp;lt;- [1..], maximum (collatz y) &amp;gt; x]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Definir, usando takeWhile y map, la función&lt;br /&gt;
--    potenciasMenores :: Int -&amp;gt; Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (potenciasMenores x y) es la lista de las potencias de x&lt;br /&gt;
-- menores que y. Por ejemplo,&lt;br /&gt;
--    potenciasMenores 2 1000  ==  [2,4,8,16,32,64,128,256,512]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
potenciasMenores :: Int -&amp;gt; Int -&amp;gt; [Int]&lt;br /&gt;
potenciasMenores x y = takeWhile (&amp;lt;y) (map (x^) [1..])&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, usando la criba de Eratóstenes, la constante&lt;br /&gt;
--    primos :: Integral a =&amp;gt; [a]&lt;br /&gt;
-- cuyo valor es la lista de los números primos. Por ejemplo,&lt;br /&gt;
--    take 10 primos  ==  [2,3,5,7,11,13,17,19,23,29]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
primos :: Integral a =&amp;gt; [a]&lt;br /&gt;
primos = criba [2..]&lt;br /&gt;
    where criba []     = []&lt;br /&gt;
          criba (n:ns) = n : criba (elimina n ns)&lt;br /&gt;
          elimina n xs = [x | x &amp;lt;- xs, x `mod` n /= 0]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir la función&lt;br /&gt;
--    primo :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
-- tal que (primo n) se verifica si n es primo. Por ejemplo,&lt;br /&gt;
--    primo 7  ==  True&lt;br /&gt;
--    primo 9  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
primo :: Int -&amp;gt; Bool&lt;br /&gt;
primo n = head (dropWhile (&amp;lt;n) primos) == n&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.3. Definir la función&lt;br /&gt;
--    sumaDeDosPrimos :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (sumaDeDosPrimos n) es la lista de las distintas&lt;br /&gt;
-- descomposiciones de n como suma de dos números primos. Por ejemplo, &lt;br /&gt;
--    sumaDeDosPrimos 30  ==  [(7,23),(11,19),(13,17)]&lt;br /&gt;
--    sumaDeDosPrimos 10  ==  [(3,7),(5,5)]&lt;br /&gt;
-- Calcular, usando la función sumaDeDosPrimos, el menor número que&lt;br /&gt;
-- puede escribirse de 10 formas distintas como suma de dos primos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
sumaDeDosPrimos :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
sumaDeDosPrimos n = &lt;br /&gt;
  [(x,n-x) | x &amp;lt;- primosN, primo (n-x)]&lt;br /&gt;
  where primosN = takeWhile (&amp;lt;= (n `div` 2)) primos&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    ghci&amp;gt; head [x | x &amp;lt;- [1..], length (sumaDeDosPrimos x) == 10]&lt;br /&gt;
--    114&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § La lista infinita de factoriales,                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, por comprensión, la función&lt;br /&gt;
--    factoriales1 :: [Integer]&lt;br /&gt;
-- tal que factoriales1 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales1  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [factorial n | n &amp;lt;- [0..]]&lt;br /&gt;
 &lt;br /&gt;
-- (factorial n) es el factorial de n. Por ejemplo,&lt;br /&gt;
--    factorial 4  ==  24&lt;br /&gt;
factorial :: Integer -&amp;gt; Integer&lt;br /&gt;
factorial n = product [1..n]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, usando zipWith, la función&lt;br /&gt;
--    factoriales2 :: [Integer]&lt;br /&gt;
-- tal que factoriales2 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales2  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = 1 : zipWith (*) [1..] factoriales2&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    take 4 factoriales2&lt;br /&gt;
--    = take 4 (1 : zipWith (*) [1..] factoriales2)&lt;br /&gt;
--    = 1 : take 3 (zipWith (*) [1..] factoriales2)&lt;br /&gt;
--    = 1 : take 3 (zipWith (*) [1..] [1|R1])           {R1 es tail factoriales2}&lt;br /&gt;
--    = 1 : take 3 (1 : zipWith (*) [2..] [R1])      &lt;br /&gt;
--    = 1 : 1 : take 2 (zipWith (*) [2..] [1|R2])       {R2 es drop 2 factoriales2}  &lt;br /&gt;
--    = 1 : 1 : take 2 (2 : zipWith (*) [3..] [R2])&lt;br /&gt;
--    = 1 : 1 : 2 : take 1 (zipWith (*) [3..] [2|R3])    {R3 es drop 3 factoriales2}  &lt;br /&gt;
--    = 1 : 1 : 2 : take 1 (6 : zipWith (*) [4..] [R3])  &lt;br /&gt;
--    = 1 : 1 : 2 : 6 : take 0 (zipWith (*) [4..] [R3])  &lt;br /&gt;
--    = 1 : 1 : 2 : 6 : []&lt;br /&gt;
--    = [1, 1, 2, 6]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.3. Comparar el tiempo y espacio necesarios para calcular&lt;br /&gt;
-- las siguientes expresiones&lt;br /&gt;
--    let xs = take 3000 factoriales1 in (sum xs - sum xs)&lt;br /&gt;
--    let xs = take 3000 factoriales2 in (sum xs - sum xs)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    ghci&amp;gt; let xs = take 3000 factoriales1 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (17.51 secs, 5631214332 bytes)&lt;br /&gt;
--    ghci&amp;gt; let xs = take 3000 factoriales2 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.04 secs, 17382284 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.4. Definir, por recursión, la función&lt;br /&gt;
--    factoriales3 :: [Integer]&lt;br /&gt;
-- tal que factoriales3 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales3  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1 : aux 1 [1..]&lt;br /&gt;
  where aux x (y:ys) = z : aux z ys&lt;br /&gt;
          where z = x*y&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    take 4 factoriales3&lt;br /&gt;
--    = take 4 (1 : aux 1 [1..])&lt;br /&gt;
--    = 1 : take 3 (aux 1 [1..])&lt;br /&gt;
--    = 1 : take 3 (1 : aux 1 [2..])&lt;br /&gt;
--    = 1 : 1 : take 2 (aux 1 [2..])&lt;br /&gt;
--    = 1 : 1 : take 2 (2 : aux 2 [3..])&lt;br /&gt;
--    = 1 : 1 : 2 : take 1 (aux 2 [3..])&lt;br /&gt;
--    = 1 : 1 : 2 : take 1 (6 : aux 6 [4..])&lt;br /&gt;
--    = 1 : 1 : 2 : 6 : take 0 (aux 6 [4..])&lt;br /&gt;
--    = 1 : 1 : 2 : 6 : []&lt;br /&gt;
--    = [1,1,2,6]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.5. Comparar el tiempo y espacio necesarios para calcular&lt;br /&gt;
-- las siguientes expresiones&lt;br /&gt;
--    let xs = take 3000 factoriales2 in (sum xs - sum xs)&lt;br /&gt;
--    let xs = take 3000 factoriales3 in (sum xs - sum xs)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    ghci&amp;gt; let xs = take 3000 factoriales2 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.04 secs, 17382284 bytes)&lt;br /&gt;
--    ghci&amp;gt; let xs = take 3000 factoriales3 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.04 secs, 18110224 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.6. Definir, usando scanl1, la función&lt;br /&gt;
--    factoriales4 :: [Integer]&lt;br /&gt;
-- tal que factoriales4 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales4  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = 1 : scanl1 (*) [1..]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.7. Comparar el tiempo y espacio necesarios para calcular&lt;br /&gt;
-- las siguientes expresiones&lt;br /&gt;
--    let xs = take 3000 factoriales3 in (sum xs - sum xs)&lt;br /&gt;
--    let xs = take 3000 factoriales4 in (sum xs - sum xs)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    ghci&amp;gt; let xs = take 3000 factoriales3 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.04 secs, 18110224 bytes)&lt;br /&gt;
--    ghci&amp;gt; let xs = take 3000 factoriales4 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.03 secs, 11965328 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.8. Definir, usando iterate, la función&lt;br /&gt;
--    factoriales5 :: [Integer]&lt;br /&gt;
-- tal que factoriales5 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales5  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = map snd (iterate f (1,1)) &lt;br /&gt;
  where f (x,y) = (x+1,x*y)&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    take 4 factoriales5&lt;br /&gt;
--    = take 4 (map snd aux)&lt;br /&gt;
--    = take 4 (map snd (iterate f (1,1)))&lt;br /&gt;
--    = take 4 (map snd [(1,1),(2,1),(3,2),(4,6),...])&lt;br /&gt;
--    = take 4 [1,1,2,6,...]&lt;br /&gt;
--    = [1,1,2,6]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.9. Comparar el tiempo y espacio necesarios para calcular&lt;br /&gt;
-- las siguientes expresiones&lt;br /&gt;
--    let xs = take 3000 factoriales4 in (sum xs - sum xs)&lt;br /&gt;
--    let xs = take 3000 factoriales5 in (sum xs - sum xs)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    ghci&amp;gt; let xs = take 3000 factoriales4 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.04 secs, 18110224 bytes)&lt;br /&gt;
--    ghci&amp;gt; let xs = take 3000 factoriales5 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.03 secs, 11965760 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § La sucesión de Fibonacci                                         --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.1. La sucesión de Fibonacci está definida por&lt;br /&gt;
--    f(0) = 0&lt;br /&gt;
--    f(1) = 1&lt;br /&gt;
--    f(n) = f(n-1)+f(n-2), si n &amp;gt; 1.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    fib :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (fib n) es el n-ésimo término de la sucesión de Fibonacci. &lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    fib 8  ==  21&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
fib :: Integer -&amp;gt; Integer&lt;br /&gt;
fib 0 = 0&lt;br /&gt;
fib 1 = 1&lt;br /&gt;
fib n = fib (n-1) + fib (n-2)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.2. Definir, por comprensión, la función&lt;br /&gt;
--    fibs1 :: [Integer]&lt;br /&gt;
-- tal que fibs1 es la sucesión de Fibonacci. Por ejemplo,&lt;br /&gt;
--    take 10 fibs1  ==  [0,1,1,2,3,5,8,13,21,34]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
fibs1 :: [Integer]&lt;br /&gt;
fibs1 = [fib n | n &amp;lt;- [0..]]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.3. Definir, por recursión, la función&lt;br /&gt;
--    fibs2 :: [Integer]&lt;br /&gt;
-- tal que fibs2 es la sucesión de Fibonacci. Por ejemplo,&lt;br /&gt;
--    take 10 fibs2  ==  [0,1,1,2,3,5,8,13,21,34]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
fibs2 :: [Integer]&lt;br /&gt;
fibs2 = aux 0 1&lt;br /&gt;
  where aux x y = x : aux y (x+y)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.4. Comparar el tiempo y espacio necesarios para calcular&lt;br /&gt;
-- las siguientes expresiones&lt;br /&gt;
--    let xs = take 30 fibs1 in (sum xs - sum xs)&lt;br /&gt;
--    let xs = take 30 fibs2 in (sum xs - sum xs)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    ghci&amp;gt; let xs = take 30 fibs1 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (6.02 secs, 421589672 bytes)&lt;br /&gt;
--    ghci&amp;gt; let xs = take 30 fibs2 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.01 secs, 515856 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.5. Definir, por recursión con zipWith, la función&lt;br /&gt;
--    fibs3 :: [Integer]&lt;br /&gt;
-- tal que fibs3 es la sucesión de Fibonacci. Por ejemplo,&lt;br /&gt;
--    take 10 fibs3  ==  [0,1,1,2,3,5,8,13,21,34]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
fibs3 :: [Integer]&lt;br /&gt;
fibs3 = 0 : 1: zipWith (+) fibs3 (tail fibs3)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.6. Comparar el tiempo y espacio necesarios para calcular&lt;br /&gt;
-- las siguientes expresiones&lt;br /&gt;
--    let xs = take 40000 fibs2 in (sum xs - sum xs)&lt;br /&gt;
--    let xs = take 40000 fibs3 in (sum xs - sum xs)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    ghci&amp;gt; let xs = take 40000 fibs2 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.90 secs, 221634544 bytes)&lt;br /&gt;
--    ghci&amp;gt; let xs = take 40000 fibs3 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (1.14 secs, 219448176 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.7. Definir, por recursión con acumuladores, la función &lt;br /&gt;
--    fibs4 :: [Integer]&lt;br /&gt;
-- tal que fibs4 es la sucesión de Fibonacci. Por ejemplo,&lt;br /&gt;
--    take 10 fibs4  ==  [0,1,1,2,3,5,8,13,21,34]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
fibs4 :: [Integer]&lt;br /&gt;
fibs4 = fs&lt;br /&gt;
  where (xs,ys,fs) = (zipWith (+) ys fs, 1:xs, 0:ys)&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
fibs4&amp;#039; :: [Integer]&lt;br /&gt;
fibs4&amp;#039; = fs&lt;br /&gt;
  where fs = 0:ys&lt;br /&gt;
        ys = 1:xs&lt;br /&gt;
		xs = zipWith (+) ys fs&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo de fibs4 es &lt;br /&gt;
--   +------------------------+-----------------+-------------------+&lt;br /&gt;
--   | xs = zipWith (+) ys fs | ys = 1:xs       | fs = 0:ys         |&lt;br /&gt;
--   +------------------------+-----------------+-------------------+&lt;br /&gt;
--   |                        | 1:...           | 0:...             |&lt;br /&gt;
--   |                        | ^               | ^                 |&lt;br /&gt;
--   | 1:...                  | 1:1:...         | 0:1:1:...         |&lt;br /&gt;
--   |                        |   ^             |   ^               |&lt;br /&gt;
--   | 1:2:...                | 1:1:2:...       | 0:1:1:2:...       |&lt;br /&gt;
--   |                        |     ^           |     ^             |&lt;br /&gt;
--   | 1:2:3:...              | 1:1:2:3:...     | 0:1:1:2:3:...     |&lt;br /&gt;
--   |                        |       ^         |       ^           |&lt;br /&gt;
--   | 1:2:3:5:...            | 1:1:2:3:5:...   | 0:1:1:2:3:5:...   |&lt;br /&gt;
--   |                        |         ^       |         ^         |&lt;br /&gt;
--   | 1:2:3:5:8:...          | 1:1:2:3:5:8:... | 0:1:1:2:3:5:8:... |&lt;br /&gt;
--   +------------------------+-----------------+-------------------+&lt;br /&gt;
-- En la tercera columna se va construyendo la sucesión.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.8. Comparar el tiempo y espacio necesarios para calcular&lt;br /&gt;
-- las siguientes expresiones&lt;br /&gt;
--    let xs = take 40000 fibs3 in (sum xs - sum xs)&lt;br /&gt;
--    let xs = take 40000 fibs4 in (sum xs - sum xs)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    ghci&amp;gt; let xs = take 40000 fibs2 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.90 secs, 221634544 bytes)&lt;br /&gt;
--    ghci&amp;gt; let xs = take 40000 fibs4 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.84 secs, 219587064 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § El triángulo de Pascal                                           --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.1. El triángulo de Pascal es un triángulo de números&lt;br /&gt;
--          1&lt;br /&gt;
--         1 1&lt;br /&gt;
--        1 2 1&lt;br /&gt;
--      1  3 3  1&lt;br /&gt;
--     1 4  6  4 1&lt;br /&gt;
--    1 5 10 10 5 1&lt;br /&gt;
--   ...............&lt;br /&gt;
-- construido de la siguiente forma&lt;br /&gt;
-- + la primera fila está formada por el número 1;&lt;br /&gt;
-- + las filas siguientes se construyen sumando los números adyacentes&lt;br /&gt;
--   de la fila superior y añadiendo un 1 al principio y al final de la&lt;br /&gt;
--   fila. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir, con iterate y zipWith, la función&lt;br /&gt;
--    pascal1 :: [[Integer]]&lt;br /&gt;
-- tal que pascal es la lista de las líneas del triángulo de Pascal. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ghci&amp;gt; take 6 pascal1&lt;br /&gt;
--    [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1],[1,5,10,10,5,1]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pascal1 :: [[Integer]]&lt;br /&gt;
pascal1 = iterate f [1]&lt;br /&gt;
  where f xs = zipWith (+) (0:xs) (xs++[0])&lt;br /&gt;
 &lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    xs      = [1,2,1]&lt;br /&gt;
--    0:xs    = [0,1,2,1]&lt;br /&gt;
--    xs++[0] = [1,2,1,0]&lt;br /&gt;
--    +       = [1,3,3,1]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.2. Definir la función, con map y zipWith, &lt;br /&gt;
--    pascal2 :: [[Integer]]&lt;br /&gt;
-- tal que pascal es la lista de las líneas del triángulo de Pascal. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ghci&amp;gt; take 6 pascal2&lt;br /&gt;
--    [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1],[1,5,10,10,5,1]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pascal2 :: [[Integer]]&lt;br /&gt;
pascal2 = [1] : map f pascal2&lt;br /&gt;
  where f xs = zipWith (+) (0:xs) (xs++[0])&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.3. Escribir la traza del cálculo de la expresión&lt;br /&gt;
--    take 4 pascal&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- Nota: El cálculo es&lt;br /&gt;
--    take 4 pascal&lt;br /&gt;
--    = take 4 ([1] : map f pascal)&lt;br /&gt;
--    = [1] : (take 3 (map f pascal))    &lt;br /&gt;
--    = [1] : (take 3 (map f ([1]:R1pascal)))&lt;br /&gt;
--    = [1] : (take 3 ((f [1]) : map R1pascal)))&lt;br /&gt;
--    = [1] : (take 3 ((zipWith (+) (0:[1]) ([1]++[0]) : map R1pascal)))&lt;br /&gt;
--    = [1] : (take 3 ((zipWith (+) [0,1] [1,0]) : map R1pascal)))&lt;br /&gt;
--    = [1] : (take 3 ([1,1] : map R1pascal)))&lt;br /&gt;
--    = [1] : [1,1] : (take 2 (map R1pascal)))&lt;br /&gt;
--    = [1] : [1,1] : (take 2 (map ([1,1]:R2pascal)))&lt;br /&gt;
--    = [1] : [1,1] : (take 2 ((f [1,1]) : map R2pascal)))&lt;br /&gt;
--    = [1] : [1,1] : (take 2 ((zipWith (+) (0:[1,1]) ([1,1]++[0]) : map R2pascal)))&lt;br /&gt;
--    = [1] : [1,1] : (take 2 ((zipWith (+) [0,1,1] [1,1,0]) : map R2pascal)))&lt;br /&gt;
--    = [1] : [1,1] : (take 2 ([1,2,1] : map R2pascal)))&lt;br /&gt;
--    = [1] : [1,1] : [1,2,1] : (take 1 (map R2pascal)))&lt;br /&gt;
--    = [1] : [1,1] : [1,2,1] : (take 1 (map ([1,2,1]:R3pascal)))&lt;br /&gt;
--    = [1] : [1,1] : [1,2,1] : (take 1 ((f [1,2,1]) : map R3pascal)))&lt;br /&gt;
--    = [1] : [1,1] : [1,2,1] : (take 1 ((zipWith (+) (0:[1,2,1]) ([1,2,1]++[0]) : map R3pascal)))&lt;br /&gt;
--    = [1] : [1,1] : [1,2,1] : (take 1 ((zipWith (+) [0,1,2,1] [1,2,1,0]) : map R3pascal)))&lt;br /&gt;
--    = [1] : [1,1] : [1,2,1] : (take 1 ([1,3,3,1] : map R3pascal)))&lt;br /&gt;
--    = [1] : [1,1] : [1,2,1] : [1,3,3,1] : (take 0 (map R3pascal)))&lt;br /&gt;
--    = [1] : [1,1] : [1,2,1] : [1,3,3,1] : []&lt;br /&gt;
--    = [[1],[1,1],[1,2,1],[1,3,3,1]]&lt;br /&gt;
-- en el cálculo con R1pascal, R2pascal y R3pascal es el triángulo de&lt;br /&gt;
-- Pascal sin el primero, los dos primeros o los tres primeros elementos,&lt;br /&gt;
-- respectivamente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_11_Sol&amp;diff=541</id>
		<title>Relación 11 Sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_11_Sol&amp;diff=541"/>
		<updated>2021-12-13T16:58:24Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Página creada con «&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;  -- I1M 2021-22: Relación 11 solución -- Evaluación perezosa y listas infinitas. -- Departamento de Ciencias de la Computación e I.A. -- Univers…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Relación 11 solución&lt;br /&gt;
-- Evaluación perezosa y listas infinitas.&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- En esta relación se presentan ejercicios con listas infinitas y&lt;br /&gt;
-- evaluación perezosa. Estos ejercicios corresponden al tema 10 que&lt;br /&gt;
-- se encuentra en  &lt;br /&gt;
--    https://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-10.html&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías auxiliares                                  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Definir, por recursión, la función &lt;br /&gt;
--    repite :: a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repite x) es la lista infinita cuyos elementos son x. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    repite 5           ==  [5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,...&lt;br /&gt;
--    take 3 (repite 5)  ==  [5,5,5]&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función repite es equivalente a la función repeat definida&lt;br /&gt;
-- en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- 1ª definición:&lt;br /&gt;
repite1 :: a -&amp;gt; [a]&lt;br /&gt;
repite1 x = x : repite1 x&lt;br /&gt;
 &lt;br /&gt;
-- 2ª definición:&lt;br /&gt;
repite2 :: a -&amp;gt; [a]&lt;br /&gt;
repite2 x = ys &lt;br /&gt;
    where ys = x:ys&lt;br /&gt;
 &lt;br /&gt;
-- La 2ª definición es más eficiente:&lt;br /&gt;
--    ghci&amp;gt; last (take 100000000 (repite1 5))&lt;br /&gt;
--    5&lt;br /&gt;
--    (46.56 secs, 16001567944 bytes)&lt;br /&gt;
--    ghci&amp;gt; last (take 100000000 (repite2 5))&lt;br /&gt;
--    5&lt;br /&gt;
--    (2.34 secs, 5601589608 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- Usaremos como repite la 2ª definición&lt;br /&gt;
repite :: a -&amp;gt; [a]&lt;br /&gt;
repite = repite2&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir, por comprensión, la función &lt;br /&gt;
--    repiteC :: a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repiteC x) es la lista infinita cuyos elementos son x. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    repiteC 5           ==  [5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,...&lt;br /&gt;
--    take 3 (repiteC 5)  ==  [5,5,5]&lt;br /&gt;
--&lt;br /&gt;
-- Nota: La función repiteC es equivalente a la función repeat definida&lt;br /&gt;
-- en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
repiteC :: a -&amp;gt; [a]&lt;br /&gt;
repiteC x = [x | _ &amp;lt;- [1..]]&lt;br /&gt;
 &lt;br /&gt;
-- La función repite2 es más eficiente que repiteC&lt;br /&gt;
--    ghci&amp;gt; last (take 10000000 (repiteC 5))&lt;br /&gt;
--    5&lt;br /&gt;
--    (6.05 secs, 1,997,740,536 bytes)&lt;br /&gt;
--    ghci&amp;gt; last (take 10000000 (repite2 5))&lt;br /&gt;
--    5&lt;br /&gt;
--    (0.31 secs, 541,471,280 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir, por recursión, la función &lt;br /&gt;
--    repiteFinitaR :: Int-&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repiteFinitaR n x) es la lista con n elementos iguales a&lt;br /&gt;
-- x. Por ejemplo, &lt;br /&gt;
--    repiteFinitaR 3 5  ==  [5,5,5]&lt;br /&gt;
--&lt;br /&gt;
-- Nota: La función repiteFinitaR es equivalente a la función replicate&lt;br /&gt;
-- definida en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
repiteFinitaR :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
repiteFinitaR n x | n &amp;lt;= 0    = []&lt;br /&gt;
                  | otherwise = x : repiteFinitaR (n-1) x&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir, por comprensión, la función &lt;br /&gt;
--    repiteFinitaC :: Int-&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repiteFinitaC n x) es la lista con n elementos iguales a&lt;br /&gt;
-- x. Por ejemplo, &lt;br /&gt;
--    repiteFinitaC 3 5  ==  [5,5,5]&lt;br /&gt;
--&lt;br /&gt;
-- Nota: La función repiteFinitaC es equivalente a la función replicate&lt;br /&gt;
-- definida en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
repiteFinitaC :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
repiteFinitaC n x = [x | _ &amp;lt;- [1..n]]&lt;br /&gt;
 &lt;br /&gt;
-- La función repiteFinitaC es más eficiente que repiteFinitaR&lt;br /&gt;
--    ghci&amp;gt; last (repiteFinitaR 10000000 5)&lt;br /&gt;
--    5&lt;br /&gt;
--    (17.04 secs, 2,475,222,448 bytes)&lt;br /&gt;
--    ghci&amp;gt; last (repiteFinitaC 10000000 5)&lt;br /&gt;
--    5&lt;br /&gt;
--    (5.43 secs, 1,511,227,176 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.3. Definir, usando repite, la función &lt;br /&gt;
--    repiteFinita :: Int-&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repiteFinita n x) es la lista con n elementos iguales a&lt;br /&gt;
-- x. Por ejemplo, &lt;br /&gt;
--    repiteFinita 3 5  ==  [5,5,5]&lt;br /&gt;
--&lt;br /&gt;
-- Nota: La función repiteFinita es equivalente a la función replicate&lt;br /&gt;
-- definida en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
repiteFinita :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
repiteFinita n x = take n (repite x)&lt;br /&gt;
 &lt;br /&gt;
-- La función repiteFinita es más eficiente que repiteFinitaC&lt;br /&gt;
--    ghci&amp;gt; last (repiteFinitaC 10000000 5)&lt;br /&gt;
--    5&lt;br /&gt;
--    (5.43 secs, 1,511,227,176 bytes)&lt;br /&gt;
--    ghci&amp;gt; last (repiteFinita 10000000 5)&lt;br /&gt;
--    5&lt;br /&gt;
--    (0.29 secs, 541,809,248 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- 2ª definición&lt;br /&gt;
repiteFinita2 :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
repiteFinita2 n = take n . repite &lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.4. Comprobar con QuickCheck que las funciones&lt;br /&gt;
-- repiteFinitaR, repiteFinitaC y repiteFinita son equivalentes a&lt;br /&gt;
-- replicate. &lt;br /&gt;
--&lt;br /&gt;
-- Nota. Al hacer la comprobación limitar el tamaño de las pruebas como&lt;br /&gt;
-- se indica a continuación&lt;br /&gt;
--    quickCheckWith (stdArgs {maxSize=7}) prop_repiteFinitaEquiv&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_repiteFinitaEquiv :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_repiteFinitaEquiv n x =&lt;br /&gt;
    repiteFinitaR n x == y &amp;amp;&amp;amp;&lt;br /&gt;
    repiteFinitaC n x == y &amp;amp;&amp;amp;&lt;br /&gt;
    repiteFinita  n x == y&lt;br /&gt;
    where y = replicate n x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheckWith (stdArgs {maxSize=20}) prop_repiteFinitaEquiv&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.5. Comprobar con QuickCheck que la longitud de&lt;br /&gt;
-- (repiteFinita n x) es n, si n es positivo y 0 si no lo es.&lt;br /&gt;
--&lt;br /&gt;
-- Nota. Al hacer la comprobación limitar el tamaño de las pruebas como&lt;br /&gt;
-- se indica a continuación&lt;br /&gt;
--    quickCheckWith (stdArgs {maxSize=30}) prop_repiteFinitaLongitud&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_repiteFinitaLongitud :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_repiteFinitaLongitud n x &lt;br /&gt;
    | n &amp;gt; 0     = length (repiteFinita n x) == n&lt;br /&gt;
    | otherwise = null (repiteFinita n x)&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheckWith (stdArgs {maxSize=30}) prop_repiteFinitaLongitud&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- La expresión de la propiedad se puede simplificar&lt;br /&gt;
prop_repiteFinitaLongitud2 :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_repiteFinitaLongitud2 n x =&lt;br /&gt;
    length (repiteFinita n x) == (if n &amp;gt; 0 then n else 0)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.6. Comprobar con QuickCheck que todos los elementos de &lt;br /&gt;
-- (repiteFinita n x) son iguales a x.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_repiteFinitaIguales :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_repiteFinitaIguales n x =&lt;br /&gt;
    all (==x) (repiteFinita n x)&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheckWith (stdArgs {maxSize=30}) prop_repiteFinitaIguales&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir, por comprensión, la función&lt;br /&gt;
--    ecoC :: String -&amp;gt; String&lt;br /&gt;
-- tal que (ecoC xs) es la cadena obtenida a partir de la cadena xs&lt;br /&gt;
-- repitiendo cada elemento tantas veces como indica su posición: el&lt;br /&gt;
-- primer elemento se repite 1 vez, el segundo 2 veces y así&lt;br /&gt;
-- sucesivamente. Por ejemplo, &lt;br /&gt;
--    ecoC &amp;quot;abcd&amp;quot;  ==  &amp;quot;abbcccdddd&amp;quot;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
ecoC :: String -&amp;gt; String&lt;br /&gt;
ecoC xs = concat [replicate i x | (i,x) &amp;lt;- zip [1..] xs]&lt;br /&gt;
 &lt;br /&gt;
-- 2ª definición&lt;br /&gt;
ecoC1 :: String -&amp;gt; String&lt;br /&gt;
ecoC1 = concat . zipWith replicate [1..]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Definir, por recursión, la función&lt;br /&gt;
--    ecoR :: String -&amp;gt; String&lt;br /&gt;
-- tal que (ecoR xs) es la cadena obtenida a partir de la cadena xs&lt;br /&gt;
-- repitiendo cada elemento tantas veces como indica su posición: el&lt;br /&gt;
-- primer elemento se repite 1 vez, el segundo 2 veces y así&lt;br /&gt;
-- sucesivamente. Por ejemplo, &lt;br /&gt;
--    ecoR &amp;quot;abcd&amp;quot;  ==  &amp;quot;abbcccdddd&amp;quot;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- 1ª definición &lt;br /&gt;
ecoR :: String -&amp;gt; String&lt;br /&gt;
ecoR = aux 1&lt;br /&gt;
  where aux _ []     = []&lt;br /&gt;
        aux n (x:xs) = replicate n x ++ aux (n+1) xs&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir, por recursión, la función&lt;br /&gt;
--    itera :: (a -&amp;gt; a) -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- tal que (itera f x) es la lista cuyo primer elemento es x y los&lt;br /&gt;
-- siguientes elementos se calculan aplicando la función f al elemento&lt;br /&gt;
-- anterior. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; itera (+1) 3&lt;br /&gt;
--    [3,4,5,6,7,8,9,10,11,12,{Interrupted!}&lt;br /&gt;
--    ghci&amp;gt; itera (*2) 1&lt;br /&gt;
--    [1,2,4,8,16,32,64,{Interrupted!}&lt;br /&gt;
--    ghci&amp;gt; itera (`div` 10) 1972&lt;br /&gt;
--    [1972,197,19,1,0,0,0,0,0,0,{Interrupted!}&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función itera es equivalente a la función iterate definida&lt;br /&gt;
-- en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
itera :: (a -&amp;gt; a) -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
itera f x = x : itera f (f x)&lt;br /&gt;
 &lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. Definir, por recursión, la función&lt;br /&gt;
--    agrupaR :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (agrupaR n xs) es la lista formada por listas de n elementos&lt;br /&gt;
-- consecutivos de la lista xs (salvo posiblemente la última que puede&lt;br /&gt;
-- tener menos de n elementos). Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; agrupaR 2 [3,1,5,8,2,7]&lt;br /&gt;
--    [[3,1],[5,8],[2,7]]&lt;br /&gt;
--    ghci&amp;gt; agrupaR 2 [3,1,5,8,2,7,9] &lt;br /&gt;
--    [[3,1],[5,8],[2,7],[9]]&lt;br /&gt;
--    ghci&amp;gt; agrupaR 5 &amp;quot;todo necio confunde valor y precio&amp;quot;&lt;br /&gt;
--    [&amp;quot;todo &amp;quot;,&amp;quot;necio&amp;quot;,&amp;quot; conf&amp;quot;,&amp;quot;unde &amp;quot;,&amp;quot;valor&amp;quot;,&amp;quot; y pr&amp;quot;,&amp;quot;ecio&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------------- &lt;br /&gt;
 &lt;br /&gt;
agrupaR :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
agrupaR _ [] = []&lt;br /&gt;
agrupaR n xs = take n xs : agrupaR n (drop n xs)&lt;br /&gt;
 &lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir, de manera no recursiva con iterate, la función&lt;br /&gt;
--    agrupa :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (agrupa n xs) es la lista formada por listas de n elementos&lt;br /&gt;
-- consecutivos de la lista xs (salvo posiblemente la última que puede&lt;br /&gt;
-- tener menos de n elementos). Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; agrupa 2 [3,1,5,8,2,7]&lt;br /&gt;
--    [[3,1],[5,8],[2,7]]&lt;br /&gt;
--    ghci&amp;gt; agrupa 2 [3,1,5,8,2,7,9] &lt;br /&gt;
--    [[3,1],[5,8],[2,7],[9]]&lt;br /&gt;
--    ghci&amp;gt; agrupa 5 &amp;quot;todo necio confunde valor y precio&amp;quot;&lt;br /&gt;
--    [&amp;quot;todo &amp;quot;,&amp;quot;necio&amp;quot;,&amp;quot; conf&amp;quot;,&amp;quot;unde &amp;quot;,&amp;quot;valor&amp;quot;,&amp;quot; y pr&amp;quot;,&amp;quot;ecio&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------------- &lt;br /&gt;
 &lt;br /&gt;
agrupa :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
agrupa n = takeWhile (not . null)&lt;br /&gt;
         . map (take n)&lt;br /&gt;
         . iterate (drop n)&lt;br /&gt;
 &lt;br /&gt;
-- Puede verse su funcionamiento en el siguiente ejemplo,&lt;br /&gt;
--    iterate (drop 2) [5..10]  &lt;br /&gt;
--    ==&amp;gt; [[5,6,7,8,9,10],[7,8,9,10],[9,10],[],[],...&lt;br /&gt;
--    map (take 2) (iterate (drop 2) [5..10])&lt;br /&gt;
--    ==&amp;gt; [[5,6],[7,8],[9,10],[],[],[],[],...&lt;br /&gt;
--    takeWhile (not . null) (map (take 2) (iterate (drop 2) [5..10]))&lt;br /&gt;
--    ==&amp;gt; [[5,6],[7,8],[9,10]]&lt;br /&gt;
 &lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Comprobar con QuickCheck que todos los grupos de&lt;br /&gt;
-- (agrupa n xs) tienen longitud n (salvo el último que puede tener una&lt;br /&gt;
-- longitud menor). &lt;br /&gt;
-- ---------------------------------------------------------------------------- &lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_AgrupaLongitud :: Int -&amp;gt; [Int] -&amp;gt; Property&lt;br /&gt;
prop_AgrupaLongitud n xs =&lt;br /&gt;
    n &amp;gt; 0 &amp;amp;&amp;amp; not (null gs) ==&amp;gt;&lt;br /&gt;
      and [length g == n | g &amp;lt;- init gs] &amp;amp;&amp;amp;&lt;br /&gt;
      0 &amp;lt; length (last gs) &amp;amp;&amp;amp; length (last gs) &amp;lt;= n&lt;br /&gt;
    where gs = agrupa n xs&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_AgrupaLongitud&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.4. Comprobar con QuickCheck que combinando todos los&lt;br /&gt;
-- grupos de (agrupa n xs) se obtiene la lista xs. &lt;br /&gt;
-- ---------------------------------------------------------------------------- &lt;br /&gt;
 &lt;br /&gt;
-- La segunda propiedad es&lt;br /&gt;
prop_AgrupaCombina :: Int -&amp;gt; [Int] -&amp;gt; Property&lt;br /&gt;
prop_AgrupaCombina n xs =&lt;br /&gt;
    n &amp;gt; 0 ==&amp;gt; concat (agrupa n xs) == xs &lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_AgrupaCombina&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Sea la siguiente operación, aplicable a cualquier&lt;br /&gt;
-- número entero positivo:  &lt;br /&gt;
--    * Si el número es par, se divide entre 2.&lt;br /&gt;
--    * Si el número es impar, se multiplica por 3 y se suma 1.&lt;br /&gt;
-- Dado un número cualquiera, podemos considerar su órbita, es decir,&lt;br /&gt;
-- las imágenes sucesivas al iterar la función. Por ejemplo, la órbita&lt;br /&gt;
-- de 13 es&lt;br /&gt;
--    13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1,...&lt;br /&gt;
-- Si observamos este ejemplo, la órbita de 13 es periódica, es decir,&lt;br /&gt;
-- se repite indefinidamente a partir de un momento dado). La conjetura&lt;br /&gt;
-- de Collatz dice que siempre alcanzaremos el 1 para cualquier número&lt;br /&gt;
-- con el que comencemos. Ejemplos:  &lt;br /&gt;
--    * Empezando en n = 6 se obtiene 6, 3, 10, 5, 16, 8, 4, 2, 1.&lt;br /&gt;
--    * Empezando en n = 11 se obtiene: 11, 34, 17, 52, 26, 13, 40, 20,&lt;br /&gt;
--      10, 5, 16, 8, 4, 2, 1. &lt;br /&gt;
--    * Empezando en n = 27, la sucesión tiene 112 pasos, llegando hasta&lt;br /&gt;
--      9232 antes de descender a 1:  27, 82, 41, 124, 62, 31, 94, 47,&lt;br /&gt;
--      142, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274,&lt;br /&gt;
--      137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263,&lt;br /&gt;
--      790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502,&lt;br /&gt;
--      251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958,&lt;br /&gt;
--      479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644,&lt;br /&gt;
--      1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308,&lt;br /&gt;
--      1154, 577, 1732, 866, 433, 1300, 650, 325, 976, 488, 244, 122,&lt;br /&gt;
--      61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5,&lt;br /&gt;
--      16, 8, 4, 2, 1. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    siguiente :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (siguiente n) es el siguiente de n en la sucesión de&lt;br /&gt;
-- Collatz. Por ejemplo,&lt;br /&gt;
--    siguiente 13  ==  40&lt;br /&gt;
--    siguiente 40  ==  20&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
siguiente :: Integer -&amp;gt; Integer&lt;br /&gt;
siguiente n | even n    = n `div` 2&lt;br /&gt;
            | otherwise = 3*n+1&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir, por recursión, la función &lt;br /&gt;
--    collatzR :: Integer -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (collatzR n) es la órbita de CollatzR de n hasta alcanzar el&lt;br /&gt;
-- 1. Por ejemplo,&lt;br /&gt;
--    collatzR 13  ==  [13,40,20,10,5,16,8,4,2,1]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
collatzR :: Integer -&amp;gt; [Integer]&lt;br /&gt;
collatzR 1 = [1]&lt;br /&gt;
collatzR n = n : collatzR (siguiente n)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Definir, sin recursión y con iterate, la función &lt;br /&gt;
--    collatz :: Integer -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (collatz n) es la órbita de Collatz d n hasta alcanzar el&lt;br /&gt;
-- 1. Por ejemplo,&lt;br /&gt;
--    collatz 13  ==  [13,40,20,10,5,16,8,4,2,1]&lt;br /&gt;
-- Indicación: Usar takeWhile e iterate.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
collatz :: Integer -&amp;gt; [Integer]&lt;br /&gt;
collatz n = takeWhile (/=1) (iterate siguiente n) ++ [1]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.4. Definir la función&lt;br /&gt;
--    menorCollatzMayor :: Int -&amp;gt; Integer&lt;br /&gt;
-- tal que (menorCollatzMayor x) es el menor número cuya órbita de&lt;br /&gt;
-- Collatz tiene más de x elementos. Por ejemplo,&lt;br /&gt;
--    menorCollatzMayor 100  ==  27&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
menorCollatzMayor :: Int -&amp;gt; Integer&lt;br /&gt;
menorCollatzMayor x = head [y | y &amp;lt;- [1..], length (collatz y) &amp;gt; x]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.5. Definir la función&lt;br /&gt;
--    menorCollatzSupera :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (menorCollatzSupera x) es el menor número cuya órbita de&lt;br /&gt;
-- Collatz tiene algún elemento mayor que x. Por ejemplo,&lt;br /&gt;
--    menorCollatzSupera 100  ==  15&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- 1ª definición&lt;br /&gt;
menorCollatzSupera :: Integer -&amp;gt; Integer&lt;br /&gt;
menorCollatzSupera x =&lt;br /&gt;
  head [n | n &amp;lt;- [1..], any (&amp;gt; x) (collatzR n)]&lt;br /&gt;
 &lt;br /&gt;
-- 2ª definición&lt;br /&gt;
menorCollatzSupera2 :: Integer -&amp;gt; Integer&lt;br /&gt;
menorCollatzSupera2 x = &lt;br /&gt;
  head [y | y &amp;lt;- [1..], maximum (collatz y) &amp;gt; x]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Definir, usando takeWhile y map, la función&lt;br /&gt;
--    potenciasMenores :: Int -&amp;gt; Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (potenciasMenores x y) es la lista de las potencias de x&lt;br /&gt;
-- menores que y. Por ejemplo,&lt;br /&gt;
--    potenciasMenores 2 1000  ==  [2,4,8,16,32,64,128,256,512]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
potenciasMenores :: Int -&amp;gt; Int -&amp;gt; [Int]&lt;br /&gt;
potenciasMenores x y = takeWhile (&amp;lt;y) (map (x^) [1..])&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, usando la criba de Eratóstenes, la constante&lt;br /&gt;
--    primos :: Integral a =&amp;gt; [a]&lt;br /&gt;
-- cuyo valor es la lista de los números primos. Por ejemplo,&lt;br /&gt;
--    take 10 primos  ==  [2,3,5,7,11,13,17,19,23,29]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
primos :: Integral a =&amp;gt; [a]&lt;br /&gt;
primos = criba [2..]&lt;br /&gt;
    where criba []     = []&lt;br /&gt;
          criba (n:ns) = n : criba (elimina n ns)&lt;br /&gt;
          elimina n xs = [x | x &amp;lt;- xs, x `mod` n /= 0]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir la función&lt;br /&gt;
--    primo :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
-- tal que (primo n) se verifica si n es primo. Por ejemplo,&lt;br /&gt;
--    primo 7  ==  True&lt;br /&gt;
--    primo 9  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
primo :: Int -&amp;gt; Bool&lt;br /&gt;
primo n = head (dropWhile (&amp;lt;n) primos) == n&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.3. Definir la función&lt;br /&gt;
--    sumaDeDosPrimos :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (sumaDeDosPrimos n) es la lista de las distintas&lt;br /&gt;
-- descomposiciones de n como suma de dos números primos. Por ejemplo, &lt;br /&gt;
--    sumaDeDosPrimos 30  ==  [(7,23),(11,19),(13,17)]&lt;br /&gt;
--    sumaDeDosPrimos 10  ==  [(3,7),(5,5)]&lt;br /&gt;
-- Calcular, usando la función sumaDeDosPrimos, el menor número que&lt;br /&gt;
-- puede escribirse de 10 formas distintas como suma de dos primos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
sumaDeDosPrimos :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
sumaDeDosPrimos n = &lt;br /&gt;
  [(x,n-x) | x &amp;lt;- primosN, primo (n-x)]&lt;br /&gt;
  where primosN = takeWhile (&amp;lt;= (n `div` 2)) primos&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    ghci&amp;gt; head [x | x &amp;lt;- [1..], length (sumaDeDosPrimos x) == 10]&lt;br /&gt;
--    114&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § La lista infinita de factoriales,                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, por comprensión, la función&lt;br /&gt;
--    factoriales1 :: [Integer]&lt;br /&gt;
-- tal que factoriales1 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales1  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [factorial n | n &amp;lt;- [0..]]&lt;br /&gt;
 &lt;br /&gt;
-- (factorial n) es el factorial de n. Por ejemplo,&lt;br /&gt;
--    factorial 4  ==  24&lt;br /&gt;
factorial :: Integer -&amp;gt; Integer&lt;br /&gt;
factorial n = product [1..n]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, usando zipWith, la función&lt;br /&gt;
--    factoriales2 :: [Integer]&lt;br /&gt;
-- tal que factoriales2 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales2  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = 1 : zipWith (*) [1..] factoriales2&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    take 4 factoriales2&lt;br /&gt;
--    = take 4 (1 : zipWith (*) [1..] factoriales2)&lt;br /&gt;
--    = 1 : take 3 (zipWith (*) [1..] factoriales2)&lt;br /&gt;
--    = 1 : take 3 (zipWith (*) [1..] [1|R1])           {R1 es tail factoriales2}&lt;br /&gt;
--    = 1 : take 3 (1 : zipWith (*) [2..] [R1])      &lt;br /&gt;
--    = 1 : 1 : take 2 (zipWith (*) [2..] [1|R2])       {R2 es drop 2 factoriales2}  &lt;br /&gt;
--    = 1 : 1 : take 2 (2 : zipWith (*) [3..] [R2])&lt;br /&gt;
--    = 1 : 1 : 2 : take 1 (zipWith (*) [3..] [2|R3])    {R3 es drop 3 factoriales2}  &lt;br /&gt;
--    = 1 : 1 : 2 : take 1 (6 : zipWith (*) [4..] [R3])  &lt;br /&gt;
--    = 1 : 1 : 2 : 6 : take 0 (zipWith (*) [4..] [R3])  &lt;br /&gt;
--    = 1 : 1 : 2 : 6 : []&lt;br /&gt;
--    = [1, 1, 2, 6]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.3. Comparar el tiempo y espacio necesarios para calcular&lt;br /&gt;
-- las siguientes expresiones&lt;br /&gt;
--    let xs = take 3000 factoriales1 in (sum xs - sum xs)&lt;br /&gt;
--    let xs = take 3000 factoriales2 in (sum xs - sum xs)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    ghci&amp;gt; let xs = take 3000 factoriales1 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (17.51 secs, 5631214332 bytes)&lt;br /&gt;
--    ghci&amp;gt; let xs = take 3000 factoriales2 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.04 secs, 17382284 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.4. Definir, por recursión, la función&lt;br /&gt;
--    factoriales3 :: [Integer]&lt;br /&gt;
-- tal que factoriales3 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales3  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1 : aux 1 [1..]&lt;br /&gt;
  where aux x (y:ys) = z : aux z ys&lt;br /&gt;
          where z = x*y&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    take 4 factoriales3&lt;br /&gt;
--    = take 4 (1 : aux 1 [1..])&lt;br /&gt;
--    = 1 : take 3 (aux 1 [1..])&lt;br /&gt;
--    = 1 : take 3 (1 : aux 1 [2..])&lt;br /&gt;
--    = 1 : 1 : take 2 (aux 1 [2..])&lt;br /&gt;
--    = 1 : 1 : take 2 (2 : aux 2 [3..])&lt;br /&gt;
--    = 1 : 1 : 2 : take 1 (aux 2 [3..])&lt;br /&gt;
--    = 1 : 1 : 2 : take 1 (6 : aux 6 [4..])&lt;br /&gt;
--    = 1 : 1 : 2 : 6 : take 0 (aux 6 [4..])&lt;br /&gt;
--    = 1 : 1 : 2 : 6 : []&lt;br /&gt;
--    = [1,1,2,6]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.5. Comparar el tiempo y espacio necesarios para calcular&lt;br /&gt;
-- las siguientes expresiones&lt;br /&gt;
--    let xs = take 3000 factoriales2 in (sum xs - sum xs)&lt;br /&gt;
--    let xs = take 3000 factoriales3 in (sum xs - sum xs)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    ghci&amp;gt; let xs = take 3000 factoriales2 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.04 secs, 17382284 bytes)&lt;br /&gt;
--    ghci&amp;gt; let xs = take 3000 factoriales3 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.04 secs, 18110224 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.6. Definir, usando scanl1, la función&lt;br /&gt;
--    factoriales4 :: [Integer]&lt;br /&gt;
-- tal que factoriales4 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales4  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = 1 : scanl1 (*) [1..]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.7. Comparar el tiempo y espacio necesarios para calcular&lt;br /&gt;
-- las siguientes expresiones&lt;br /&gt;
--    let xs = take 3000 factoriales3 in (sum xs - sum xs)&lt;br /&gt;
--    let xs = take 3000 factoriales4 in (sum xs - sum xs)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    ghci&amp;gt; let xs = take 3000 factoriales3 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.04 secs, 18110224 bytes)&lt;br /&gt;
--    ghci&amp;gt; let xs = take 3000 factoriales4 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.03 secs, 11965328 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.8. Definir, usando iterate, la función&lt;br /&gt;
--    factoriales5 :: [Integer]&lt;br /&gt;
-- tal que factoriales5 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales5  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = map snd (iterate f (1,1)) &lt;br /&gt;
  where f (x,y) = (x+1,x*y)&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    take 4 factoriales5&lt;br /&gt;
--    = take 4 (map snd aux)&lt;br /&gt;
--    = take 4 (map snd (iterate f (1,1)))&lt;br /&gt;
--    = take 4 (map snd [(1,1),(2,1),(3,2),(4,6),...])&lt;br /&gt;
--    = take 4 [1,1,2,6,...]&lt;br /&gt;
--    = [1,1,2,6]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.9. Comparar el tiempo y espacio necesarios para calcular&lt;br /&gt;
-- las siguientes expresiones&lt;br /&gt;
--    let xs = take 3000 factoriales4 in (sum xs - sum xs)&lt;br /&gt;
--    let xs = take 3000 factoriales5 in (sum xs - sum xs)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    ghci&amp;gt; let xs = take 3000 factoriales4 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.04 secs, 18110224 bytes)&lt;br /&gt;
--    ghci&amp;gt; let xs = take 3000 factoriales5 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.03 secs, 11965760 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § La sucesión de Fibonacci                                         --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.1. La sucesión de Fibonacci está definida por&lt;br /&gt;
--    f(0) = 0&lt;br /&gt;
--    f(1) = 1&lt;br /&gt;
--    f(n) = f(n-1)+f(n-2), si n &amp;gt; 1.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    fib :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (fib n) es el n-ésimo término de la sucesión de Fibonacci. &lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    fib 8  ==  21&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
fib :: Integer -&amp;gt; Integer&lt;br /&gt;
fib 0 = 0&lt;br /&gt;
fib 1 = 1&lt;br /&gt;
fib n = fib (n-1) + fib (n-2)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.2. Definir, por comprensión, la función&lt;br /&gt;
--    fibs1 :: [Integer]&lt;br /&gt;
-- tal que fibs1 es la sucesión de Fibonacci. Por ejemplo,&lt;br /&gt;
--    take 10 fibs1  ==  [0,1,1,2,3,5,8,13,21,34]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
fibs1 :: [Integer]&lt;br /&gt;
fibs1 = [fib n | n &amp;lt;- [0..]]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.3. Definir, por recursión, la función&lt;br /&gt;
--    fibs2 :: [Integer]&lt;br /&gt;
-- tal que fibs2 es la sucesión de Fibonacci. Por ejemplo,&lt;br /&gt;
--    take 10 fibs2  ==  [0,1,1,2,3,5,8,13,21,34]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
fibs2 :: [Integer]&lt;br /&gt;
fibs2 = aux 0 1&lt;br /&gt;
  where aux x y = x : aux y (x+y)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.4. Comparar el tiempo y espacio necesarios para calcular&lt;br /&gt;
-- las siguientes expresiones&lt;br /&gt;
--    let xs = take 30 fibs1 in (sum xs - sum xs)&lt;br /&gt;
--    let xs = take 30 fibs2 in (sum xs - sum xs)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    ghci&amp;gt; let xs = take 30 fibs1 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (6.02 secs, 421589672 bytes)&lt;br /&gt;
--    ghci&amp;gt; let xs = take 30 fibs2 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.01 secs, 515856 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.5. Definir, por recursión con zipWith, la función&lt;br /&gt;
--    fibs3 :: [Integer]&lt;br /&gt;
-- tal que fibs3 es la sucesión de Fibonacci. Por ejemplo,&lt;br /&gt;
--    take 10 fibs3  ==  [0,1,1,2,3,5,8,13,21,34]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
fibs3 :: [Integer]&lt;br /&gt;
fibs3 = 0 : 1: zipWith (+) fibs3 (tail fibs3)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.6. Comparar el tiempo y espacio necesarios para calcular&lt;br /&gt;
-- las siguientes expresiones&lt;br /&gt;
--    let xs = take 40000 fibs2 in (sum xs - sum xs)&lt;br /&gt;
--    let xs = take 40000 fibs3 in (sum xs - sum xs)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    ghci&amp;gt; let xs = take 40000 fibs2 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.90 secs, 221634544 bytes)&lt;br /&gt;
--    ghci&amp;gt; let xs = take 40000 fibs3 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (1.14 secs, 219448176 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.7. Definir, por recursión con acumuladores, la función &lt;br /&gt;
--    fibs4 :: [Integer]&lt;br /&gt;
-- tal que fibs4 es la sucesión de Fibonacci. Por ejemplo,&lt;br /&gt;
--    take 10 fibs4  ==  [0,1,1,2,3,5,8,13,21,34]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
fibs4 :: [Integer]&lt;br /&gt;
fibs4 = fs&lt;br /&gt;
  where (xs,ys,fs) = (zipWith (+) ys fs, 1:xs, 0:ys)&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
fibs4&amp;#039; :: [Integer]&lt;br /&gt;
fibs4&amp;#039; = fs&lt;br /&gt;
  where fs = 0:ys&lt;br /&gt;
        ys = 1:xs&lt;br /&gt;
		xs = zipWith (+) ys fs&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo de fibs4 es &lt;br /&gt;
--   +------------------------+-----------------+-------------------+&lt;br /&gt;
--   | xs = zipWith (+) ys fs | ys = 1:xs       | fs = 0:ys         |&lt;br /&gt;
--   +------------------------+-----------------+-------------------+&lt;br /&gt;
--   |                        | 1:...           | 0:...             |&lt;br /&gt;
--   |                        | ^               | ^                 |&lt;br /&gt;
--   | 1:...                  | 1:1:...         | 0:1:1:...         |&lt;br /&gt;
--   |                        |   ^             |   ^               |&lt;br /&gt;
--   | 1:2:...                | 1:1:2:...       | 0:1:1:2:...       |&lt;br /&gt;
--   |                        |     ^           |     ^             |&lt;br /&gt;
--   | 1:2:3:...              | 1:1:2:3:...     | 0:1:1:2:3:...     |&lt;br /&gt;
--   |                        |       ^         |       ^           |&lt;br /&gt;
--   | 1:2:3:5:...            | 1:1:2:3:5:...   | 0:1:1:2:3:5:...   |&lt;br /&gt;
--   |                        |         ^       |         ^         |&lt;br /&gt;
--   | 1:2:3:5:8:...          | 1:1:2:3:5:8:... | 0:1:1:2:3:5:8:... |&lt;br /&gt;
--   +------------------------+-----------------+-------------------+&lt;br /&gt;
-- En la tercera columna se va construyendo la sucesión.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.8. Comparar el tiempo y espacio necesarios para calcular&lt;br /&gt;
-- las siguientes expresiones&lt;br /&gt;
--    let xs = take 40000 fibs3 in (sum xs - sum xs)&lt;br /&gt;
--    let xs = take 40000 fibs4 in (sum xs - sum xs)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    ghci&amp;gt; let xs = take 40000 fibs2 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.90 secs, 221634544 bytes)&lt;br /&gt;
--    ghci&amp;gt; let xs = take 40000 fibs4 in (sum xs - sum xs)&lt;br /&gt;
--    0&lt;br /&gt;
--    (0.84 secs, 219587064 bytes)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § El triángulo de Pascal                                           --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.1. El triángulo de Pascal es un triángulo de números&lt;br /&gt;
--          1&lt;br /&gt;
--         1 1&lt;br /&gt;
--        1 2 1&lt;br /&gt;
--      1  3 3  1&lt;br /&gt;
--     1 4  6  4 1&lt;br /&gt;
--    1 5 10 10 5 1&lt;br /&gt;
--   ...............&lt;br /&gt;
-- construido de la siguiente forma&lt;br /&gt;
-- + la primera fila está formada por el número 1;&lt;br /&gt;
-- + las filas siguientes se construyen sumando los números adyacentes&lt;br /&gt;
--   de la fila superior y añadiendo un 1 al principio y al final de la&lt;br /&gt;
--   fila. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir, con iterate y zipWith, la función&lt;br /&gt;
--    pascal1 :: [[Integer]]&lt;br /&gt;
-- tal que pascal es la lista de las líneas del triángulo de Pascal. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ghci&amp;gt; take 6 pascal1&lt;br /&gt;
--    [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1],[1,5,10,10,5,1]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pascal1 :: [[Integer]]&lt;br /&gt;
pascal1 = iterate f [1]&lt;br /&gt;
  where f xs = zipWith (+) (0:xs) (xs++[0])&lt;br /&gt;
 &lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    xs      = [1,2,1]&lt;br /&gt;
--    0:xs    = [0,1,2,1]&lt;br /&gt;
--    xs++[0] = [1,2,1,0]&lt;br /&gt;
--    +       = [1,3,3,1]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.2. Definir la función, con map y zipWith, &lt;br /&gt;
--    pascal2 :: [[Integer]]&lt;br /&gt;
-- tal que pascal es la lista de las líneas del triángulo de Pascal. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ghci&amp;gt; take 6 pascal2&lt;br /&gt;
--    [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1],[1,5,10,10,5,1]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
pascal2 :: [[Integer]]&lt;br /&gt;
pascal2 = [1] : map f pascal2&lt;br /&gt;
  where f xs = zipWith (+) (0:xs) (xs++[0])&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.3. Escribir la traza del cálculo de la expresión&lt;br /&gt;
--    take 4 pascal&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- Nota: El cálculo es&lt;br /&gt;
--    take 4 pascal&lt;br /&gt;
--    = take 4 ([1] : map f pascal)&lt;br /&gt;
--    = [1] : (take 3 (map f pascal))    &lt;br /&gt;
--    = [1] : (take 3 (map f ([1]:R1pascal)))&lt;br /&gt;
--    = [1] : (take 3 ((f [1]) : map R1pascal)))&lt;br /&gt;
--    = [1] : (take 3 ((zipWith (+) (0:[1]) ([1]++[0]) : map R1pascal)))&lt;br /&gt;
--    = [1] : (take 3 ((zipWith (+) [0,1] [1,0]) : map R1pascal)))&lt;br /&gt;
--    = [1] : (take 3 ([1,1] : map R1pascal)))&lt;br /&gt;
--    = [1] : [1,1] : (take 2 (map R1pascal)))&lt;br /&gt;
--    = [1] : [1,1] : (take 2 (map ([1,1]:R2pascal)))&lt;br /&gt;
--    = [1] : [1,1] : (take 2 ((f [1,1]) : map R2pascal)))&lt;br /&gt;
--    = [1] : [1,1] : (take 2 ((zipWith (+) (0:[1,1]) ([1,1]++[0]) : map R2pascal)))&lt;br /&gt;
--    = [1] : [1,1] : (take 2 ((zipWith (+) [0,1,1] [1,1,0]) : map R2pascal)))&lt;br /&gt;
--    = [1] : [1,1] : (take 2 ([1,2,1] : map R2pascal)))&lt;br /&gt;
--    = [1] : [1,1] : [1,2,1] : (take 1 (map R2pascal)))&lt;br /&gt;
--    = [1] : [1,1] : [1,2,1] : (take 1 (map ([1,2,1]:R3pascal)))&lt;br /&gt;
--    = [1] : [1,1] : [1,2,1] : (take 1 ((f [1,2,1]) : map R3pascal)))&lt;br /&gt;
--    = [1] : [1,1] : [1,2,1] : (take 1 ((zipWith (+) (0:[1,2,1]) ([1,2,1]++[0]) : map R3pascal)))&lt;br /&gt;
--    = [1] : [1,1] : [1,2,1] : (take 1 ((zipWith (+) [0,1,2,1] [1,2,1,0]) : map R3pascal)))&lt;br /&gt;
--    = [1] : [1,1] : [1,2,1] : (take 1 ([1,3,3,1] : map R3pascal)))&lt;br /&gt;
--    = [1] : [1,1] : [1,2,1] : [1,3,3,1] : (take 0 (map R3pascal)))&lt;br /&gt;
--    = [1] : [1,1] : [1,2,1] : [1,3,3,1] : []&lt;br /&gt;
--    = [[1],[1,1],[1,2,1],[1,3,3,1]]&lt;br /&gt;
-- en el cálculo con R1pascal, R2pascal y R3pascal es el triángulo de&lt;br /&gt;
-- Pascal sin el primero, los dos primeros o los tres primeros elementos,&lt;br /&gt;
-- respectivamente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_11&amp;diff=540</id>
		<title>Relación 11</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_11&amp;diff=540"/>
		<updated>2021-12-13T16:57:58Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Página creada con «&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;  -- I1M 2021-22: Rel_11.hs (17 de diciembre de 2021) -- Evaluación perezosa y listas infinitas. -- Departamento de Ciencias de la Computación e I.…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Rel_11.hs (17 de diciembre de 2021)&lt;br /&gt;
-- Evaluación perezosa y listas infinitas.&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- En esta relación se presentan ejercicios con listas infinitas y&lt;br /&gt;
-- evaluación perezosa. Estos ejercicios corresponden al tema 10 cuyas&lt;br /&gt;
-- transparencias se encuentran en  &lt;br /&gt;
--   https://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-10.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías auxiliares                                  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Definir, por recursión, la función &lt;br /&gt;
--    repite :: a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repite x) es la lista infinita cuyos elementos son x. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    repite 5           ==  [5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,...&lt;br /&gt;
--    take 3 (repite 5)  ==  [5,5,5]&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función repite es equivalente a la función repeat definida&lt;br /&gt;
-- en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
repite :: a -&amp;gt; [a]&lt;br /&gt;
repite x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir, por comprensión, la función &lt;br /&gt;
--    repiteC :: a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repiteC x) es la lista infinita cuyos elementos son x. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    repiteC 5           ==  [5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,...&lt;br /&gt;
--    take 3 (repiteC 5)  ==  [5,5,5]&lt;br /&gt;
--&lt;br /&gt;
-- Nota: La función repiteC es equivalente a la función repeat definida&lt;br /&gt;
-- en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
repiteC :: a -&amp;gt; [a]&lt;br /&gt;
repiteC x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir, por recursión, la función &lt;br /&gt;
--    repiteFinitaR :: Int-&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repiteFinitaR n x) es la lista con n elementos iguales a&lt;br /&gt;
-- x. Por ejemplo, &lt;br /&gt;
--    repiteFinitaR 3 5  ==  [5,5,5]&lt;br /&gt;
--&lt;br /&gt;
-- Nota: La función repiteFinitaR es equivalente a la función replicate&lt;br /&gt;
-- definida en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
repiteFinitaR :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
repiteFinitaR n x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir, por comprensión, la función &lt;br /&gt;
--    repiteFinitaC :: Int-&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repiteFinitaC n x) es la lista con n elementos iguales a&lt;br /&gt;
-- x. Por ejemplo, &lt;br /&gt;
--    repiteFinitaC 3 5  ==  [5,5,5]&lt;br /&gt;
--&lt;br /&gt;
-- Nota: La función repiteFinitaC es equivalente a la función replicate&lt;br /&gt;
-- definida en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
repiteFinitaC :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
repiteFinitaC n x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.3. Definir, usando repite, la función &lt;br /&gt;
--    repiteFinita :: Int-&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repiteFinita n x) es la lista con n elementos iguales a&lt;br /&gt;
-- x. Por ejemplo, &lt;br /&gt;
--    repiteFinita 3 5  ==  [5,5,5]&lt;br /&gt;
--&lt;br /&gt;
-- Nota: La función repiteFinita es equivalente a la función replicate&lt;br /&gt;
-- definida en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
repiteFinita :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
repiteFinita n x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.4. Comprobar con QuickCheck que las funciones&lt;br /&gt;
-- repiteFinitaR, repiteFinitaC y repiteFinita son equivalentes a&lt;br /&gt;
-- replicate. &lt;br /&gt;
--&lt;br /&gt;
-- Nota. Al hacer la comprobación limitar el tamańo de las pruebas como&lt;br /&gt;
-- se indica a continuación&lt;br /&gt;
--    quickCheckWith (stdArgs {maxSize=7}) prop_repiteFinitaEquiv&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_repiteFinitaEquiv :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_repiteFinitaEquiv n x = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.5. Comprobar con QuickCheck que la longitud de&lt;br /&gt;
-- (repiteFinita n x) es n, si n es positivo y 0 si no lo es.&lt;br /&gt;
--&lt;br /&gt;
-- Nota. Al hacer la comprobación limitar el tamańo de las pruebas como&lt;br /&gt;
-- se indica a continuación&lt;br /&gt;
--    quickCheckWith (stdArgs {maxSize=30}) prop_repiteFinitaLongitud&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_repiteFinitaLongitud :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_repiteFinitaLongitud n x = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.6. Comprobar con QuickCheck que todos los elementos de &lt;br /&gt;
-- (repiteFinita n x) son iguales a x.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_repiteFinitaIguales :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_repiteFinitaIguales n x = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir, por comprensión, la función&lt;br /&gt;
--    ecoC :: String -&amp;gt; String&lt;br /&gt;
-- tal que (ecoC xs) es la cadena obtenida a partir de la cadena xs&lt;br /&gt;
-- repitiendo cada elemento tantas veces como indica su posición: el&lt;br /&gt;
-- primer elemento se repite 1 vez, el segundo 2 veces y así&lt;br /&gt;
-- sucesivamente. Por ejemplo, &lt;br /&gt;
--    ecoC &amp;quot;abcd&amp;quot;  ==  &amp;quot;abbcccdddd&amp;quot;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ecoC :: String -&amp;gt; String&lt;br /&gt;
ecoC xs = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Definir, por recursión, la función&lt;br /&gt;
--    ecoR :: String -&amp;gt; String&lt;br /&gt;
-- tal que (ecoR xs) es la cadena obtenida a partir de la cadena xs&lt;br /&gt;
-- repitiendo cada elemento tantas veces como indica su posición: el&lt;br /&gt;
-- primer elemento se repite 1 vez, el segundo 2 veces y así&lt;br /&gt;
-- sucesivamente. Por ejemplo, &lt;br /&gt;
--    ecoR &amp;quot;abcd&amp;quot;  ==  &amp;quot;abbcccdddd&amp;quot;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ecoR :: String -&amp;gt; String&lt;br /&gt;
ecoR xs = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir, por recursión, la función&lt;br /&gt;
--    itera :: (a -&amp;gt; a) -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- tal que (itera f x) es la lista cuyo primer elemento es x y los&lt;br /&gt;
-- siguientes elementos se calculan aplicando la función f al elemento&lt;br /&gt;
-- anterior. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; itera (+1) 3&lt;br /&gt;
--    [3,4,5,6,7,8,9,10,11,12,{Interrupted!}&lt;br /&gt;
--    ghci&amp;gt; itera (*2) 1&lt;br /&gt;
--    [1,2,4,8,16,32,64,{Interrupted!}&lt;br /&gt;
--    ghci&amp;gt; itera (`div` 10) 1972&lt;br /&gt;
--    [1972,197,19,1,0,0,0,0,0,0,{Interrupted!}&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función repite es equivalente a la función iterate definida&lt;br /&gt;
-- en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
itera :: (a -&amp;gt; a) -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
itera f x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. Definir, por recursión, la función&lt;br /&gt;
--    agrupaR :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (agrupaR n xs) es la lista formada por listas de n elementos&lt;br /&gt;
-- consecutivos de la lista xs (salvo posiblemente la última que puede&lt;br /&gt;
-- tener menos de n elementos). Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; agrupaR 2 [3,1,5,8,2,7]&lt;br /&gt;
--    [[3,1],[5,8],[2,7]]&lt;br /&gt;
--    ghci&amp;gt; agrupaR 2 [3,1,5,8,2,7,9] &lt;br /&gt;
--    [[3,1],[5,8],[2,7],[9]]&lt;br /&gt;
--    ghci&amp;gt; agrupaR 5 &amp;quot;todo necio confunde valor y precio&amp;quot;&lt;br /&gt;
--    [&amp;quot;todo &amp;quot;,&amp;quot;necio&amp;quot;,&amp;quot; conf&amp;quot;,&amp;quot;unde &amp;quot;,&amp;quot;valor&amp;quot;,&amp;quot; y pr&amp;quot;,&amp;quot;ecio&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------------- &lt;br /&gt;
&lt;br /&gt;
agrupaR :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
agrupaR = undefined&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir, de manera no recursiva con iterate, la función&lt;br /&gt;
--    agrupa :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (agrupa n xs) es la lista formada por listas de n elementos&lt;br /&gt;
-- consecutivos de la lista xs (salvo posiblemente la última que puede&lt;br /&gt;
-- tener menos de n elementos). Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; agrupa 2 [3,1,5,8,2,7]&lt;br /&gt;
--    [[3,1],[5,8],[2,7]]&lt;br /&gt;
--    ghci&amp;gt; agrupa 2 [3,1,5,8,2,7,9] &lt;br /&gt;
--    [[3,1],[5,8],[2,7],[9]]&lt;br /&gt;
--    ghci&amp;gt; agrupa 5 &amp;quot;todo necio confunde valor y precio&amp;quot;&lt;br /&gt;
--    [&amp;quot;todo &amp;quot;,&amp;quot;necio&amp;quot;,&amp;quot; conf&amp;quot;,&amp;quot;unde &amp;quot;,&amp;quot;valor&amp;quot;,&amp;quot; y pr&amp;quot;,&amp;quot;ecio&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------------- &lt;br /&gt;
&lt;br /&gt;
agrupa :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
agrupa n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Comprobar con QuickCheck que todos los grupos de&lt;br /&gt;
-- (agrupa n xs) tienen longitud n (salvo el último que puede tener una&lt;br /&gt;
-- longitud menor). &lt;br /&gt;
-- ---------------------------------------------------------------------------- &lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_AgrupaLongitud :: Int -&amp;gt; [Int] -&amp;gt; Property&lt;br /&gt;
prop_AgrupaLongitud n xs = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.4. Comprobar con QuickCheck que combinando todos los&lt;br /&gt;
-- grupos de ((agrupa n xs)) se obtiene la lista xs. &lt;br /&gt;
-- ---------------------------------------------------------------------------- &lt;br /&gt;
&lt;br /&gt;
-- La segunda propiedad es&lt;br /&gt;
prop_AgrupaCombina :: Int -&amp;gt; [Int] -&amp;gt; Property&lt;br /&gt;
prop_AgrupaCombina n xs = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Sea la siguiente operación, aplicable a cualquier&lt;br /&gt;
-- número entero positivo:  &lt;br /&gt;
--    * Si el número es par, se divide entre 2.&lt;br /&gt;
--    * Si el número es impar, se multiplica por 3 y se suma 1.&lt;br /&gt;
-- Dado un número cualquiera, podemos considerar su órbita, es decir,&lt;br /&gt;
-- las imágenes sucesivas al iterar la función. Por ejemplo, la órbita&lt;br /&gt;
-- de 13 es&lt;br /&gt;
--    13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1,...&lt;br /&gt;
-- Si observamos este ejemplo, la órbita de 13 es periódica, es decir,&lt;br /&gt;
-- se repite indefinidamente a partir de un momento dado). La conjetura&lt;br /&gt;
-- de Collatz dice que siempre alcanzaremos el 1 para cualquier número&lt;br /&gt;
-- con el que comencemos. Ejemplos:  &lt;br /&gt;
--    * Empezando en n = 6 se obtiene 6, 3, 10, 5, 16, 8, 4, 2, 1.&lt;br /&gt;
--    * Empezando en n = 11 se obtiene: 11, 34, 17, 52, 26, 13, 40, 20,&lt;br /&gt;
--      10, 5, 16, 8, 4, 2, 1. &lt;br /&gt;
--    * Empezando en n = 27, la sucesión tiene 112 pasos, llegando hasta&lt;br /&gt;
--      9232 antes de descender a 1:  27, 82, 41, 124, 62, 31, 94, 47,&lt;br /&gt;
--      142, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274,&lt;br /&gt;
--      137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263,&lt;br /&gt;
--      790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502,&lt;br /&gt;
--      251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958,&lt;br /&gt;
--      479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644,&lt;br /&gt;
--      1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308,&lt;br /&gt;
--      1154, 577, 1732, 866, 433, 1300, 650, 325, 976, 488, 244, 122,&lt;br /&gt;
--      61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5,&lt;br /&gt;
--      16, 8, 4, 2, 1. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    siguiente :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (siguiente n) es el siguiente de n en la sucesión de&lt;br /&gt;
-- Collatz. Por ejemplo,&lt;br /&gt;
--    siguiente 13  ==  40&lt;br /&gt;
--    siguiente 40  ==  20&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
siguiente :: Integer -&amp;gt; Integer&lt;br /&gt;
siguiente n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir, por recursión, la función &lt;br /&gt;
--    collatzR :: Integer -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (collatzR n) es la órbita de CollatzR de n hasta alcanzar el&lt;br /&gt;
-- 1. Por ejemplo,&lt;br /&gt;
--    collatzR 13  ==  [13,40,20,10,5,16,8,4,2,1]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
collatzR :: Integer -&amp;gt; [Integer]&lt;br /&gt;
collatzR = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Definir, sin recursión y con iterate, la función &lt;br /&gt;
--    collatz :: Integer -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (collatz n) es la órbita de Collatz d n hasta alcanzar el&lt;br /&gt;
-- 1. Por ejemplo,&lt;br /&gt;
--    collatz 13  ==  [13,40,20,10,5,16,8,4,2,1]&lt;br /&gt;
-- Indicación: Usar takeWhile e iterate.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
collatz :: Integer -&amp;gt; [Integer]&lt;br /&gt;
collatz n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.4. Definir la función&lt;br /&gt;
--    menorCollatzMayor :: Int -&amp;gt; Integer&lt;br /&gt;
-- tal que (menorCollatzMayor x) es el menor número cuya órbita de&lt;br /&gt;
-- Collatz tiene más de x elementos. Por ejemplo,&lt;br /&gt;
--    menorCollatzMayor 100  ==  27&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
menorCollatzMayor :: Int -&amp;gt; Integer&lt;br /&gt;
menorCollatzMayor x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.5. Definir la función&lt;br /&gt;
--    menorCollatzSupera :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (menorCollatzSupera x) es el menor número cuya órbita de&lt;br /&gt;
-- Collatz tiene algún elemento mayor que x. Por ejemplo,&lt;br /&gt;
--    menorCollatzSupera 100  ==  15&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
menorCollatzSupera :: Integer -&amp;gt; Integer&lt;br /&gt;
menorCollatzSupera x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Definir, usando takeWhile y map, la función&lt;br /&gt;
--    potenciasMenores :: Int -&amp;gt; Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (potenciasMenores x y) es la lista de las potencias de x&lt;br /&gt;
-- menores que y. Por ejemplo,&lt;br /&gt;
--    potenciasMenores 2 1000  ==  [2,4,8,16,32,64,128,256,512]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
potenciasMenores :: Int -&amp;gt; Int -&amp;gt; [Int]&lt;br /&gt;
potenciasMenores x y = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, usando la criba de Eratóstenes, la constante&lt;br /&gt;
--    primos :: Integral a =&amp;gt; [a]&lt;br /&gt;
-- cuyo valor es la lista de los números primos. Por ejemplo,&lt;br /&gt;
--    take 10 primos  ==  [2,3,5,7,11,13,17,19,23,29]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
primos :: Integral a =&amp;gt; [a]&lt;br /&gt;
primos = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, usando primos, la función&lt;br /&gt;
--    primo :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
-- tal que (primo n) se verifica si n es primo. Por ejemplo,&lt;br /&gt;
--    primo 7  ==  True&lt;br /&gt;
--    primo 9  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
primo :: Int -&amp;gt; Bool&lt;br /&gt;
primo n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.3. Definir la función&lt;br /&gt;
--    sumaDeDosPrimos :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (sumaDeDosPrimos n) es la lista de las distintas&lt;br /&gt;
-- descomposiciones de n como suma de dos números primos. Por ejemplo, &lt;br /&gt;
--    sumaDeDosPrimos 30  ==  [(7,23),(11,19),(13,17)]&lt;br /&gt;
--    sumaDeDosPrimos 10  ==  [(3,7),(5,5)]&lt;br /&gt;
-- Calcular, usando la función sumaDeDosPrimos, el menor número que&lt;br /&gt;
-- puede escribirse de 10 formas distintas como suma de dos primos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDeDosPrimos :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
sumaDeDosPrimos n = undefined&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § La lista infinita de factoriales,                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, por comprensión, la función&lt;br /&gt;
--    factoriales1 :: [Integer]&lt;br /&gt;
-- tal que factoriales1 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales1  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, usando zipWith, la función&lt;br /&gt;
--    factoriales2 :: [Integer]&lt;br /&gt;
-- tal que factoriales2 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales2  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.3. Definir, por recursión, la función&lt;br /&gt;
--    factoriales3 :: [Integer]&lt;br /&gt;
-- tal que factoriales3 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales3  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.4. Definir, usando scanl1, la función&lt;br /&gt;
--    factoriales4 :: [Integer]&lt;br /&gt;
-- tal que factoriales4 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales4  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.5. Definir, usando iterate, la función&lt;br /&gt;
--    factoriales5 :: [Integer]&lt;br /&gt;
-- tal que factoriales5 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales5  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § La sucesión de Fibonacci                                         --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.1. La sucesión de Fibonacci está definida por&lt;br /&gt;
--    f(0) = 0&lt;br /&gt;
--    f(1) = 1&lt;br /&gt;
--    f(n) = f(n-1)+f(n-2), si n &amp;gt; 1.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    fib :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (fib n) es el n-ésimo término de la sucesión de Fibonacci. &lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    fib 8  ==  21&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
fib :: Integer -&amp;gt; Integer&lt;br /&gt;
fib = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.2. Definir, por comprensión, la función&lt;br /&gt;
--    fibs1 :: [Integer]&lt;br /&gt;
-- tal que fibs1 es la sucesión de Fibonacci. Por ejemplo,&lt;br /&gt;
--    take 10 fibs1  ==  [0,1,1,2,3,5,8,13,21,34]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
fibs1 :: [Integer]&lt;br /&gt;
fibs1 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.3. Definir, por recursión, la función&lt;br /&gt;
--    fibs2 :: [Integer]&lt;br /&gt;
-- tal que fibs2 es la sucesión de Fibonacci. Por ejemplo,&lt;br /&gt;
--    take 10 fibs2  ==  [0,1,1,2,3,5,8,13,21,34]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
fibs2 :: [Integer]&lt;br /&gt;
fibs2 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.4. Definir, por recursión con zipWith, la función&lt;br /&gt;
--    fibs3 :: [Integer]&lt;br /&gt;
-- tal que fibs3 es la sucesión de Fibonacci. Por ejemplo,&lt;br /&gt;
--    take 10 fibs3  ==  [0,1,1,2,3,5,8,13,21,34]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
fibs3 :: [Integer]&lt;br /&gt;
fibs3 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.5. Definir, por recursión con acumuladores, la función &lt;br /&gt;
--    fibs4 :: [Integer]&lt;br /&gt;
-- tal que fibs4 es la sucesión de Fibonacci. Por ejemplo,&lt;br /&gt;
--    take 10 fibs4  ==  [0,1,1,2,3,5,8,13,21,34]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
fibs4 :: [Integer]&lt;br /&gt;
fibs4 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § El triángulo de Pascal                                           --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.1. El triángulo de Pascal es un triángulo de números&lt;br /&gt;
--          1&lt;br /&gt;
--         1 1&lt;br /&gt;
--        1 2 1&lt;br /&gt;
--      1  3 3  1&lt;br /&gt;
--     1 4  6  4 1&lt;br /&gt;
--    1 5 10 10 5 1&lt;br /&gt;
--   ...............&lt;br /&gt;
-- construido de la siguiente forma&lt;br /&gt;
-- * la primera fila está formada por el número 1;&lt;br /&gt;
-- * las filas siguientes se construyen sumando los números adyacentes&lt;br /&gt;
--   de la fila superior y ańadiendo un 1 al principio y al final de la&lt;br /&gt;
--   fila. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir, con iterate y zipWith, la función&lt;br /&gt;
--    pascal1 :: [[Integer]]&lt;br /&gt;
-- tal que pascal es la lista de las líneas del triángulo de Pascal. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ghci&amp;gt; take 6 pascal1&lt;br /&gt;
--    [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1],[1,5,10,10,5,1]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
pascal1 :: [[Integer]]&lt;br /&gt;
pascal1 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.2. Definir, con map y zipWith, la función&lt;br /&gt;
--    pascal2 :: [[Integer]]&lt;br /&gt;
-- tal que pascal es la lista de las líneas del triángulo de Pascal. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ghci&amp;gt; take 6 pascal2&lt;br /&gt;
--    [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1],[1,5,10,10,5,1]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 2ª definición (con map):&lt;br /&gt;
pascal2 :: [[Integer]]&lt;br /&gt;
pascal2 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.3. Escribir la traza del cálculo de la expresión&lt;br /&gt;
--    take 4 pascal2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Archivo:Rel_11.hs&amp;diff=539</id>
		<title>Archivo:Rel 11.hs</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Archivo:Rel_11.hs&amp;diff=539"/>
		<updated>2021-12-13T16:57:33Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=538</id>
		<title>Informática (1º Matemáticas)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=538"/>
		<updated>2021-12-13T16:57:21Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==Relación de Ejercicios==&lt;br /&gt;
&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Definiciones por composición sobre números, listas y booleanos. [ [[Media:Rel_1.hs |Enunciado]], [[Relación 1 |Solución colaborativa]], [[Relación 1 Sol |Solución]]  ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Definiciones con condicionales, guardas o patrones. [ [[Media:Rel_2.hs |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Relación 2 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión. [ [[Media:Rel_3.hs |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Relación 3 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión (extra). [ [[Media:Rel_4.hs |Enunciado]], [[Relación 4 |Solución colaborativa editada]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión con cadenas: El cifrado césar. [ [[Media:Rel_5.hs |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Relación 5 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión. [ [[Media:Rel_6.hs |Enunciado]], [[Relación 6 |Solución colaborativa]], [[Relación 6 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión y comprensión (extra). [ [[Media:Rel_7.hs |Enunciado]], [[Relación 7 |Solución colaborativa]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados (extra). [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Propiedades del número 2021. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10 |Solución colaborativa]]&amp;lt;!--, [[Relación 10 Sol |Solución ]]--&amp;gt; ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Listas infinitas y evaluación perezosa. [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11 |Solución colaborativa]], [[Relación 11 Sol |Solución ]] ]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: El algoritmo de Luhn. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones sobre cadenas. [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos, Árboles binarios. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10|Solución colaborativa]], [[Relación 10 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (II). [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11|Solución colaborativa]], [[Relación 11 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la programación funcional con listas infinitas. [ [[Media:Rel_14.hs |Enunciado]], [[Relación 14 colab|Solución colaborativa]], [[Relación 14|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: Ecuación con factoriales. [ [[Media:Rel_15.hs |Enunciado]], [[Relación 15 colab |Solución colaborativa]], [[Relación 15 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 16&amp;#039;&amp;#039;&amp;#039;: El juego del nim y las funciones de entrada/salida. [ [[Media:Rel_16.hs |Enunciado]], [[Relación 16 colab|Solución colaborativa]], [[Relación 16 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 17&amp;#039;&amp;#039;&amp;#039;: Cálculo del número pi mediante el método de Montecarlo. [ [[Media:Rel_17.hs |Enunciado]], [[Relación 17 |Solución colaborativa]], [[Rel 17 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 18&amp;#039;&amp;#039;&amp;#039;: Aproximaciones de pi. [ [[Media:Rel_18.hs |Enunciado]], [http://www.cs.us.es/~mjoseh/Digitos_de_pi.txt Fichero con los dígitos de pi], [[Relación 18 |Solución colaborativa]], [[Rel 18 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 19&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices. [ [[Media:Rel_19.hs |Enunciado]], [[Relación 19 |Solución colaborativa]], [[Relación 19 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Método de Gauss para triangularizar matrices. [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 |Solución colaborativa]], [[Relación 20 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 21&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices con librerías Data.Matrix y Data.Vector. [ [[Media:Rel_21.hs |Enunciado]], [[Relación 21 |Solución colaborativa]], [[Relación 21 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 22&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices: ejercicios de exámenes (para repasar). [ [[Media:Rel_22.hs |Enunciado]], [[Relación 22 |Solución colaborativa]], [[Relación 22 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 23&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_23.hs |Enunciado]], [[Relación 23 |Solución colaborativa]], [[Relación 23 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico (2): límites, bisección, integrales y bajada. [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva. [ [[Media:Rel_25.hs |Enunciado]], [[Relación 25 |Solución colaborativa]], [[Relación 25 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 26&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva con librerías (solucionada). [ [[Relación 26 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 27&amp;#039;&amp;#039;&amp;#039;: Combinatoria. [ [[Media:Rel_27.hs |Enunciado]], [[Relación 27 |Solución colaborativa]], [[Relación 27 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: El TAD de las pilas.  [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 |Solución colaborativa]], [[Relación 28 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de las colas.  [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 |Solución colaborativa]], [[Relación 29 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de conjuntos.  [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 colab |Solución colaborativa]], [[Relación 31 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 32&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. Regla de Ruffini. [ [[Media:Rel_32.hs |Enunciado]], [[Relación 32 colab |Solución colaborativa]], [[Relación 32 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g1.hs |Enunciado]], [[Exam 3g1 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g2.hs |Enunciado]], [[Exam 3g2 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de los montículos. Librería en https://cutt.ly/tbDyRlr [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Media:Relación_33_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Media:Relación_34_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería Data.Set. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 |Solución colaborativa]], [[Media:Relación_35_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 36&amp;#039;&amp;#039;&amp;#039;: Problemas básicos con el TAD de los grafos. [ [[Media:Rel_36.hs |Enunciado]], [[Relación 36 Colab |Solución colaborativa]], [[Media:Relación_36_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante listas. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica I&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_1.hs |Enunciado]], [[Programación dinámica I |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica II&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_2.hs |Enunciado]], [[Programación Dinámica II |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Grafos&amp;#039;&amp;#039;&amp;#039;: Ejercicios de examen sobre grafos. ([[Media:masgrafos.hs |Enunciado]], [[Grafos (Ej. examen) |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Técnica Divide y vencerás&amp;#039;&amp;#039;&amp;#039;: Puzzle. ([[Media:triomino.hs |Enunciado]], [[Triominos |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica III&amp;#039;&amp;#039;&amp;#039;: Ejercicios de programación dinámica. ([[Media:dinamica3_3.hs |Enunciado]], [[Programación Dinámica III |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso I&amp;#039;&amp;#039;&amp;#039;. ([[Media:Lychrel.hs |Enunciado]], [[Repaso I. Números de Lychrel |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso II: ejercicios de examen&amp;#039;&amp;#039;&amp;#039;. ([[Media:ejExamenes.hs |Enunciado]], [[Repaso II.  |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios Complementarios.&amp;#039;&amp;#039;&amp;#039;([[Media:ejcomplementarios.hs |Enunciado]], [[Ejercicios Complementarios|Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Más ejercicios de examen.&amp;#039;&amp;#039;&amp;#039;([[Media:ejExam.hs |Enunciado]], [[Ejercicios de examen|Solución colaborativa]]).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;!-- EJERCICIOS DEL CURSO PASADO&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Ejercicios de exámenes sobre grafos. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 Colab |Solución colaborativa]], [[Relación 37 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~mjoseh/cursos/i1m-20/doc/manual-Data.Set.html Data.Set]. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Relación 34 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico en Maxima: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_25.mac |Enunciado]], [[Relación 25 |Solución colaborativa]] [[Relación 25 Sol |Solución]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/manual-Data.Set.html Data.Set] (erratas solucionadas). [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 colab |Solución colaborativa]], [[Relación 28 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: División y factorización de polinomios mediante la regla de Ruffini. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Caminos en una retícula. [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Apilamiento de barriles. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 |Solución colaborativa]], [[Relación 31 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante diccionarios. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 Colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de los multiconjuntos mediante diccionarios. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: El problema del granjero mediante búsqueda en espacio de estado. [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Relación 33 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Resolución de problemas mediante búsqueda en espacios de estados. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 colab |Solución colaborativa]], [[Relación 35 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados de repaso.  [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 colab |Solución colaborativa]] ]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Curso Actual==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 1&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(12/11/2021)&amp;#039;&amp;#039;: [ [[Media:Exam1_G2.hs |Enunciado]], [[Parcial 1 |Solución colaborativa]], [[Parcial 1 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 2&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(20/01/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 3&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(08/04/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 4&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(10/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 5&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(24/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Cursos Anteriores==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://github.com/jaalonso/Examenes_de_PF_con_Haskell/blob/master/README.org Repositorio de Exámenes]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Curso 2020/21 Grupo 2&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 11/12/20 |Examen 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(11/12/2020)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 16/02/21 |Examen 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(16/02/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 23/04/21 |Examen 3 Turno 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(23/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 28/04/21 |Examen 3 Turno 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(28/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 21/06/21 |Examen 4]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(21/06/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 05/07/2021 |Examen Julio]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(05/07/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 07/09/2021 |Examen Septiembre]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(07/09/2021)&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=533</id>
		<title>Relación 9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=533"/>
		<updated>2021-12-10T15:31:40Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Rel_9.hs (01 de diciembre de 2021)&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados (II)&lt;br /&gt;
-- Departamento de Ciencias de la Computación e Inteligencia Artificial&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Librerías auxiliares&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
import Data.Char&lt;br /&gt;
import Data.List&lt;br /&gt;
-- El siguiente módulo hay que instalarlo:&lt;br /&gt;
--cabal install primes&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Se considera la función&lt;br /&gt;
--      resultadoPos :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (resultadoPos f xs) es la lista de los elementos de la lista&lt;br /&gt;
-- xs tales que el valor de la función f sobre ellos es positivo. Por ejemplo,&lt;br /&gt;
--   resultadoPos head [[-1,2],[-9,4],[2,3]]       ==  [[2,3]]&lt;br /&gt;
--   resultadoPos sum [[1,2],[9],[-8,3],[],[3,5]]  ==  [[1,2],[9],[3,5]]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
resultadoPosC :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosC f xs = [x | x &amp;lt;- xs, f x &amp;gt; 0]&lt;br /&gt;
&lt;br /&gt;
resultadoPosS :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosS f xs = filter g xs&lt;br /&gt;
                   where g x = f x &amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
resultadoPosR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosR f [] = []&lt;br /&gt;
resultadoPosR f (x:xs) | f x &amp;gt; 0    = x : resultadoPosR f xs&lt;br /&gt;
                       | otherwise  = resultadoPosR f xs&lt;br /&gt;
&lt;br /&gt;
resultadoPosPR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosPR f xs = foldr g [] xs&lt;br /&gt;
                    where g prim recu | f prim &amp;gt; 0 = prim : recu&lt;br /&gt;
                                      | otherwise = recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Se considera la función&lt;br /&gt;
--     intercala :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (intercala y xs) es la lista que resulta de intercalar el elemento&lt;br /&gt;
-- y delante de todos los elementos de la lista xs que sean menores que y.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--   intercala 5 [1,2,6,3,7,9]  ==  [5,1,5,2,6,5,3,7,9]&lt;br /&gt;
--   intercala 5 [6,7,9,8]      ==  [6,7,9,8]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
intercalaC :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaC y xs = concat [if x&amp;lt;y then [y,x] else [x] | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
intercalaS :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaS y xs = concat (map f xs)&lt;br /&gt;
                where f x = if x&amp;lt;y then [y,x] else [x]&lt;br /&gt;
&lt;br /&gt;
intercalaR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaR y [] = []&lt;br /&gt;
intercalaR y (x:xs) | x&amp;lt;y  = [y,x] ++ intercalaR y xs&lt;br /&gt;
                    | x&amp;gt;y  = [x] ++ intercalaR y xs&lt;br /&gt;
&lt;br /&gt;
intercalaPR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaPR y xs = foldr g [] xs&lt;br /&gt;
                 where g x recu | x&amp;lt;y  = [y,x] ++ recu&lt;br /&gt;
                                | x&amp;gt;y  = [x] ++ recu&lt;br /&gt;
&lt;br /&gt;
intercalaA :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaA y xs = aux [] xs&lt;br /&gt;
                where aux v [] = v&lt;br /&gt;
                      aux v (x:xs) | x&amp;lt;y        = aux (v++[y,x]) xs&lt;br /&gt;
                                   | otherwise  = aux (v++[x]) xs&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
intercala1 :: (Ord a, Num a) =&amp;gt; a -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
intercala1 n xs = concat [if a &amp;lt; n then [n,a] else [a] | a&amp;lt;-xs]&lt;br /&gt;
&lt;br /&gt;
intercala2 :: (Ord a, Num a) =&amp;gt; a -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
intercala22 n xs = concat (map f xs)&lt;br /&gt;
                  where f x = if x &amp;lt; n then [n,x] else [x]&lt;br /&gt;
&lt;br /&gt;
intercala3 :: (Ord a, Num a) =&amp;gt; a -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
intercala3 n [] = []&lt;br /&gt;
intercala3 n (x:xs) = (if x &amp;lt; n then [n,x] else [x]) ++ (intercala3 n (xs))&lt;br /&gt;
&lt;br /&gt;
intercala4 n (x:xs) = (foldr (p) [] (x:xs) )&lt;br /&gt;
                      where p prim recu | prim &amp;lt; n = (n : prim:recu)&lt;br /&gt;
                                        | otherwise = (prim:recu)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Se considera la función&lt;br /&gt;
--    dec2ent :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (dec2ent xs) es el número entero cuyas cifras ordenadas son los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo,&lt;br /&gt;
--   dec2ent [2,3,4,5]  ==  2345&lt;br /&gt;
--   dec2ent [1..9]     ==  123456789&lt;br /&gt;
--&lt;br /&gt;
-- Defie esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
dec2ent1 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent1 xs = read (concat [show x| x &amp;lt;- (sort xs)]) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent2 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent2 xs = read (concat (map show (sort xs))) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent3 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent3Aux :: Show a =&amp;gt; [a] -&amp;gt; [Char]&lt;br /&gt;
dec2ent3Aux [] = []&lt;br /&gt;
dec2ent3Aux (x:xs) = (show x) ++ (dec2ent3Aux xs)&lt;br /&gt;
dec2ent3 xs = read (dec2ent3Aux (sort xs)) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent4 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent4 xs = read (concat (foldr f [] (sort xs))) :: Integer&lt;br /&gt;
            where f prim recu = show prim :recu&lt;br /&gt;
&lt;br /&gt;
-- Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
dec2entC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entC xs = sum [x*10^i | (x,i) &amp;lt;- zip xs (reverse [0..length xs-1])]&lt;br /&gt;
&lt;br /&gt;
dec2entS :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS xs = sum (map f (zip xs (reverse [0..length xs-1])))&lt;br /&gt;
            where f (x,i) = x*10^i&lt;br /&gt;
&lt;br /&gt;
dec2entR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entR [] = 0&lt;br /&gt;
dec2entR (x:xs) = x*10^(length xs) + dec2entR xs&lt;br /&gt;
&lt;br /&gt;
dec2entPR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entPR xs = foldr f 0 (zip xs (reverse [0..length xs-1]))&lt;br /&gt;
             where f (x,i) recu = x*10^i + recu&lt;br /&gt;
&lt;br /&gt;
-- Juan José Calero Vela:&lt;br /&gt;
&lt;br /&gt;
pos :: Integer -&amp;gt; [Integer] -&amp;gt; Integer&lt;br /&gt;
pos x [] = 0&lt;br /&gt;
pos x (y:xs) = if x==y then 1 else 1 + pos x xs&lt;br /&gt;
&lt;br /&gt;
dec2entC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entC xs = sum [ x*(10^(pos x (reverse xs)-1)) | x&amp;lt;-xs]&lt;br /&gt;
&lt;br /&gt;
-- profesor: solución vista en clase&lt;br /&gt;
dec2entS xs = sum (map f (zip xs [n-1,n-2..0]))&lt;br /&gt;
            where f (x,i) = x * 10^i&lt;br /&gt;
                  n = length xs &lt;br /&gt;
&lt;br /&gt;
--Manuel Alcaide&lt;br /&gt;
&lt;br /&gt;
dec2ent1&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent1&amp;#039; xs = sum[x*(10^y)|(x,y)&amp;lt;-(zip xs [((length (xs))-1),((length (xs))-2)..0])]&lt;br /&gt;
&lt;br /&gt;
dec2ent2&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent2&amp;#039; xs = sum (map f (zip xs [((length (xs))-1),((length (xs))-2)..0]))&lt;br /&gt;
  where f (x,y) = x*(10^y)&lt;br /&gt;
&lt;br /&gt;
dec2ent3&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent3&amp;#039; [] = 0&lt;br /&gt;
dec2ent3&amp;#039; (x:xs) = x*(10^((length (x:xs))-1)) + dec2ent3 xs&lt;br /&gt;
&lt;br /&gt;
dec2ent4&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent4&amp;#039; xs = foldr f 0 $ zip xs [((length xs)-1),((length xs)-2)..0]&lt;br /&gt;
  where f (x,p) recu = x*(10^p) + recu&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
dec2ent xs = sum [ x*10^y  | (x,y) &amp;lt;- agrupa xs]&lt;br /&gt;
agrupa xs = zip xs (reverse[0..length xs-1])&lt;br /&gt;
dec2entOS xs = sum (map f (agrupa xs)) where f (x,y) = x*10^y&lt;br /&gt;
dec2entR [] = 0&lt;br /&gt;
dec2entR (x:xs) = x*10^(length xs) + dec2entR xs&lt;br /&gt;
&lt;br /&gt;
dec2entP xs = foldr f 0 ys where f (x,y) recu = x*10^y + recu&lt;br /&gt;
                                 ys =  zip xs (reverse[0..length xs-1])&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se considera la función&lt;br /&gt;
--     diferencia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (diferencia xs ys) es la diferencia entre los conjuntos xs e&lt;br /&gt;
-- ys; es decir, el conjunto de los elementos de la lista xs que no se&lt;br /&gt;
-- encuentran en la lista ys. Por ejemplo,&lt;br /&gt;
--   diferencia [2,3,5,6] [5,2,7]  ==  [3,6]&lt;br /&gt;
--   diferencia [1,3,5,7] [2,4,6]  ==  [1,3,5,7]&lt;br /&gt;
--   diferencia [1,3] [1..9]       ==  []&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
diferenciaC :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaC xs ys = [x | x &amp;lt;- xs, notElem x ys]&lt;br /&gt;
  &lt;br /&gt;
diferenciaS :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaS xs ys = concat (map f xs)&lt;br /&gt;
                  where f x | notElem x ys  = [x]&lt;br /&gt;
                            | otherwise     = []&lt;br /&gt;
  &lt;br /&gt;
diferenciaR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaR [] _ = []&lt;br /&gt;
diferenciaR (x:xs) ys | notElem x ys  = [x] ++ diferenciaR xs ys&lt;br /&gt;
                      | otherwise     = diferenciaR xs ys&lt;br /&gt;
  &lt;br /&gt;
diferenciaPR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaPR xs ys = foldr g [] xs&lt;br /&gt;
                   where g x recu | notElem x ys  = [x] ++ recu&lt;br /&gt;
                                  | otherwise     = recu&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
diferencia1 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia1 xs ys = [x | x &amp;lt;- xs, not (elem x ys) ] -- ++ [y | y &amp;lt;- ys, not (elem y xs) ]&lt;br /&gt;
&lt;br /&gt;
diferencia2 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia2 (x:xs) ys = filter f (x:xs)&lt;br /&gt;
                   where f a = not (elem a ys)&lt;br /&gt;
&lt;br /&gt;
diferencia3 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia3 [] _ = []&lt;br /&gt;
diferencia3 (x:xs) ys | not (elem x ys) = x : (diferencia3 xs ys)&lt;br /&gt;
                      | otherwise = (diferencia3 xs ys)&lt;br /&gt;
&lt;br /&gt;
diferencia4 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia4 (x:xs) ys = foldr f [] (x:xs)&lt;br /&gt;
                     where f prim recu | not (elem prim ys) = prim : recu&lt;br /&gt;
                                       | otherwise = recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Se considera la función&lt;br /&gt;
--   primerosYultimos :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
-- tal que (primerosYultimos xss) es el par formado por la lista de los&lt;br /&gt;
-- primeros elementos de las listas no vacías de xss y la lista de los&lt;br /&gt;
-- últimos elementos de las listas no vacías de xss. Por ejemplo,&lt;br /&gt;
--   primerosYultimos [[1,2],[5,3,4],[],[9]]  ==  ([1,5,9],[2,4,9])&lt;br /&gt;
--   primerosYultimos [[1,2],[1,2,3],[1..4]]  ==  ([1,1,1],[2,3,4])&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García, Adolfo Sagrera Vivancos&lt;br /&gt;
primerosYultimos1 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos1 xss = ([head x | x &amp;lt;- xss, not (null x)], [last x | x &amp;lt;- xss, not (null x)]) &lt;br /&gt;
&lt;br /&gt;
noVacios :: Foldable t =&amp;gt; [t a] -&amp;gt; [t a]&lt;br /&gt;
noVacios xss = filter (not.null) xss&lt;br /&gt;
primerosYultimos2 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos2 xss = (map head (noVacios xss), map last (noVacios xss))&lt;br /&gt;
&lt;br /&gt;
primeros3 :: [[a]] -&amp;gt; [a]&lt;br /&gt;
primeros3 [] = []&lt;br /&gt;
primeros3 (xs:xss) | not (null xs) = (head xs) : (primeros3 xss)&lt;br /&gt;
                   | otherwise = (primeros3 xss)&lt;br /&gt;
ultimos3 :: [[a]] -&amp;gt; [a]&lt;br /&gt;
ultimos3 [] = []&lt;br /&gt;
ultimos3 (xs:xss) | not (null xs) = (last xs) : (ultimos3 xss)&lt;br /&gt;
                  | otherwise = (ultimos3 xss)&lt;br /&gt;
primerosYultimos3 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos3 xss = (primeros3 xss, ultimos3 xss )&lt;br /&gt;
&lt;br /&gt;
primeros4 :: Foldable t =&amp;gt; t [a] -&amp;gt; [a]&lt;br /&gt;
primeros4 xss = foldr p4 [] xss&lt;br /&gt;
             where p4 prim recu | not (null prim) = head prim : recu&lt;br /&gt;
                                | otherwise = recu&lt;br /&gt;
ultimos4 :: Foldable t =&amp;gt; t [a] -&amp;gt; [a]                                &lt;br /&gt;
ultimos4 xss = foldr u4 [] xss&lt;br /&gt;
             where u4 prim recu | not (null prim) = last prim : recu&lt;br /&gt;
                                | otherwise = recu&lt;br /&gt;
primerosYultimos4 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos4 xss = (primeros4 xss, ultimos4 xss)&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
primerosYultimosC :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosC xss = (concat [(take 1  xs) | xs &amp;lt;- xss], concat [take 1 (reverse xs) | xs &amp;lt;- xss])&lt;br /&gt;
                     &lt;br /&gt;
primerosYultimosS :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosS xss = (concat (map (take 1) xss), concat (map (take 1) (map reverse xss)))&lt;br /&gt;
&lt;br /&gt;
primerosYultimosR :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosR xss = (primerosR xss, ultimosR xss)&lt;br /&gt;
&lt;br /&gt;
primerosR [] = []&lt;br /&gt;
primerosR (xs:xss) | null xs    = primerosR xss&lt;br /&gt;
                   | otherwise  = [head xs] ++ primerosR xss&lt;br /&gt;
ultimosR [] = []&lt;br /&gt;
ultimosR (xs:xss) | null xs    = ultimosR xss&lt;br /&gt;
                  | otherwise  = [last xs] ++ ultimosR xss&lt;br /&gt;
                  &lt;br /&gt;
primerosYultimosPR :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosPR xss = (primerosPR xss, ultimosPR xss) &lt;br /&gt;
&lt;br /&gt;
primerosPR xss = foldr f [] xss&lt;br /&gt;
              where f x recu | null x     = recu&lt;br /&gt;
                             | otherwise  = [head x] ++ recu&lt;br /&gt;
ultimosPR xss = foldr f [] xss&lt;br /&gt;
              where f x recu | null x     = recu&lt;br /&gt;
                             | otherwise  = [last x] ++ recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una lista hermanada es una lista de números estrictamente&lt;br /&gt;
-- positivos en la que cada elemento tiene algún factor primo en común con el&lt;br /&gt;
-- siguiente, en caso de que exista, o alguno de los dos es un 1. Por ejemplo,&lt;br /&gt;
-- [2,6,3,9,1,5] es una lista hermanada.&lt;br /&gt;
&lt;br /&gt;
-- Se considera la función&lt;br /&gt;
--    hermanada :: [Int] -&amp;gt; Bool&lt;br /&gt;
-- tal que (hermanada xs) comprueba que la lista xs es hermanada según la&lt;br /&gt;
-- definición anterior. Por ejemplo,&lt;br /&gt;
--    hermanada [2,6,3,9,1,5]  ==  True&lt;br /&gt;
--    hermanada [2,3,5]        ==  False&lt;br /&gt;
--&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;gcd&amp;#039;&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
primo1 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo1 x = [1,x]==[a| a&amp;lt;- [1..x], rem x a == 0] -- Me dice si un número es primo&lt;br /&gt;
hermanada1 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada1 xs = sum [1 | (a,b) &amp;lt;- (zip xs (tail xs)), (if ((a/=1) &amp;amp;&amp;amp; (b/=1))&lt;br /&gt;
                                                  then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo1 (gcd a b)))&lt;br /&gt;
                                                  else True),&lt;br /&gt;
                                                                                a&amp;gt;0, b&amp;gt;0 ] == (length xs) -1&lt;br /&gt;
          -- a,b &amp;gt; 0 porque tienen que ser extrictamente positivos&lt;br /&gt;
          -- ((length xs) - 1) == length (zip xs (tail xs))&lt;br /&gt;
&lt;br /&gt;
primo2 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo2 x = filter p2 [1..x] == [1,x]&lt;br /&gt;
         where p2 b = (rem x b == 0)&lt;br /&gt;
hermanada2 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada2 xs = and (map prop2 (zip xs (tail xs)))&lt;br /&gt;
           where prop2 (a,b) = if a&amp;gt;0 &amp;amp;&amp;amp; b&amp;gt;0&lt;br /&gt;
                               then (if ((a/=1) &amp;amp;&amp;amp; (b/=1)) then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo2 (gcd a b))) else True)&lt;br /&gt;
                               else False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primo3 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo3 n = noHayNumerosDivisoresDe n 2 (n - 1)&lt;br /&gt;
noHayNumerosDivisoresDe :: Integral t =&amp;gt; t -&amp;gt; t -&amp;gt; t -&amp;gt; Bool&lt;br /&gt;
noHayNumerosDivisoresDe n minimo maximo   | minimo &amp;gt;= maximo  = True&lt;br /&gt;
                                          | rem n minimo == 0 = False&lt;br /&gt;
                                          | otherwise         = noHayNumerosDivisoresDe n (minimo + 1) maximo&lt;br /&gt;
hermanada3 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada3 [b] = True&lt;br /&gt;
hermanada3 (a:b:xs) = (if ((a/=1) &amp;amp;&amp;amp; (b/=1)) then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo2 (gcd a b))) else True)&lt;br /&gt;
                      &amp;amp;&amp;amp; hermanada3 (b:xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
hermanada4 xs = undefined&lt;br /&gt;
---------------------------------------------------------------------------------------&lt;br /&gt;
--Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
hermanadaC :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaC xs | elem 0 xs  = False&lt;br /&gt;
              | otherwise  = and [(gcd x y == x) || (gcd x y == y) || not (null (primeFactors (gcd x y))) | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
        &lt;br /&gt;
hermanadaS :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaS xs | elem 0 xs  = False&lt;br /&gt;
              | otherwise  = and (map f (zip xs (tail xs)))&lt;br /&gt;
              where f (x,y) = (gcd x y == x) || (gcd x y == y) || not (null (primeFactors (gcd x y)))&lt;br /&gt;
                                    &lt;br /&gt;
hermanadaR :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaR [x] = True&lt;br /&gt;
hermanadaR (x:y:xs) | elem 0 (x:y:xs)  = False&lt;br /&gt;
                    | otherwise        = ((gcd x y == x) || (gcd x y == y) || not (null (primeFactors (gcd x y)))) &amp;amp;&amp;amp; hermanadaR (y:xs)&lt;br /&gt;
&lt;br /&gt;
hermanadaPR :: [Int] -&amp;gt; Bool   &lt;br /&gt;
hermanadaPR xs | elem 0 xs = False&lt;br /&gt;
               | otherwise = foldr f True (zip xs (tail xs))&lt;br /&gt;
               where f (x,y) recu = ((gcd x y == x) || (gcd x y == y) || not (null (primeFactors (gcd x y)))) &amp;amp;&amp;amp; recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un elemento de una lista es permanente si ninguno de los que&lt;br /&gt;
-- vienen a continuación en la lista es mayor que él. Consideramos la función&lt;br /&gt;
--   permanentes :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (permanentes xs) es la lista de los elementos permanentes de la&lt;br /&gt;
-- lista xs. Por ejemplo,&lt;br /&gt;
--   permanentes [80,1,7,8,4]  ==  [80,8,4]&lt;br /&gt;
&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;tails&amp;#039; de Data.List.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
permanentes1 :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes1 xs = [a | (a,b) &amp;lt;- (zip xs (init (tails xs))), a == maximum b ]&lt;br /&gt;
&lt;br /&gt;
permanentes2 :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes2 xs = map head (filter p2 (init (tails xs)))&lt;br /&gt;
              where p2 (x:xs) = x == maximum (x:xs)&lt;br /&gt;
&lt;br /&gt;
comparacion3 :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
comparacion3 a [] = True&lt;br /&gt;
comparacion3 a b = a &amp;gt;= b &lt;br /&gt;
permanentes3 :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes3 [] = []&lt;br /&gt;
permanentes3 (x:xs) | [x] `comparacion3` [maximum3 xs] = x : permanentes3 xs&lt;br /&gt;
                    | otherwise = permanentes3 xs&lt;br /&gt;
                 where maximum3 [] = if x &amp;lt; 0 then x else -x&lt;br /&gt;
                       maximum3 xs = maximum xs&lt;br /&gt;
&lt;br /&gt;
permanentes4:: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes4 (x:xs) = foldr f4 [] (x:xs)&lt;br /&gt;
                    where f4 prim recu | [prim] `comparacion3` [maximum3 recu] = prim : recu&lt;br /&gt;
                                       | otherwise = recu&lt;br /&gt;
                          maximum3 [] = if x &amp;lt; 0 then x else -x&lt;br /&gt;
                          maximum3 xs = maximum xs&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
permanentesC :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesC xs = [x | (x, xs&amp;#039;) &amp;lt;- zip xs (tails (drop 1 xs)), xs&amp;#039; == [] || x &amp;gt;= maximum xs&amp;#039;] &lt;br /&gt;
&lt;br /&gt;
permanentesS :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesS xs = map fst (filter p (zip xs (tails xs)))&lt;br /&gt;
                where p (x,i) = x == maximum i&lt;br /&gt;
       &lt;br /&gt;
permanentesR :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesR [] = []&lt;br /&gt;
permanentesR [x] = [x] &lt;br /&gt;
permanentesR (x:xs) | x &amp;gt;= maximum xs  = [x] ++ permanentesR xs&lt;br /&gt;
                    | otherwise        = permanentesR xs&lt;br /&gt;
                    &lt;br /&gt;
permanentesPR :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesPR xs = foldr f [] (zip xs (tails xs))&lt;br /&gt;
                 where f (x,i) recu | x == maximum i  = [x] ++ recu&lt;br /&gt;
                                    | otherwise       = recu&lt;br /&gt;
-- Adolfo Sagrera&lt;br /&gt;
permanentes xs = [ head xs | xs &amp;lt;-  (init (tails xs)), head xs == maximum xs]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Un número entero positivo n es muy primo si es n primo&lt;br /&gt;
-- y todos los números que resultan de ir suprimimiendo la última cifra&lt;br /&gt;
-- también son primos. Por ejemplo, 7193 es muy primo pues los números&lt;br /&gt;
-- 7193, 719, 71 y 7 son todos primos. &lt;br /&gt;
-- &lt;br /&gt;
-- Define la función &lt;br /&gt;
--    muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- que (muyPrimo n) se verifica si n es muy primo. Por ejemplo,&lt;br /&gt;
--    muyPrimo 7193  == True&lt;br /&gt;
--    muyPrimo 71932 == False&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
esPrimo :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
esPrimo x = filter p2 [1..x] == [1,x]&lt;br /&gt;
         where p2 b = (rem x b == 0)&lt;br /&gt;
muyPrimo :: Integer -&amp;gt; Bool         &lt;br /&gt;
muyPrimo n | esPrimo n = length (show n) == sum [1 | a &amp;lt;- (descomposicion n), esPrimo (read a :: Integer) ]&lt;br /&gt;
           | otherwise = False&lt;br /&gt;
           where descomposicion n =  [reverse x | x &amp;lt;- (init(tails (reverse (show n))))] &lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
muyPrimo&amp;#039; :: Integer -&amp;gt; Bool&lt;br /&gt;
muyPrimo&amp;#039; n = and (map isPrime (lista n))&lt;br /&gt;
lista n = [read a :: Integer | a &amp;lt;- tail (inits (show n))] &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- ¿Cuántos números de cinco cifras son muy primos?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
calculoMuyPrimo = sum [1 | x &amp;lt;- [10000..99999], muyPrimo x] -- Tras unos minutos, sale 15.&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
muyPrimos5cifras = sum [1 | x &amp;lt;- [10000..99999], muyPrimo&amp;#039; x] -- Sale 15 &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9_Sol&amp;diff=532</id>
		<title>Relación 9 Sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9_Sol&amp;diff=532"/>
		<updated>2021-12-10T15:31:23Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados (extra)&lt;br /&gt;
-- Departamento de Ciencias de la Computación e Inteligencia Artificial&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Librerías auxiliares&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
import Data.Char&lt;br /&gt;
import Data.List&lt;br /&gt;
-- cabal install primes&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Se considera la función&lt;br /&gt;
--      resultadoPos :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (resultadoPos f xs) es la lista de los elementos de la lista&lt;br /&gt;
-- xs tales que el valor de la función f sobre ellos es positivo. Por ejemplo,&lt;br /&gt;
--   resultadoPos head [[-1,2],[-9,4],[2,3]]       ==  [[2,3]]&lt;br /&gt;
--   resultadoPos sum [[1,2],[9],[-8,3],[],[3,5]]  ==  [[1,2],[9],[3,5]]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
resultadoPosC :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosC f xs = [x | x &amp;lt;- xs, f x &amp;gt; 0]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
resultadoPosS :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosS f xs = filter (\x -&amp;gt; f x &amp;gt; 0) xs&lt;br /&gt;
&lt;br /&gt;
resultadoPosS&amp;#039; f xs = filter lp (zip (map f xs) xs)&lt;br /&gt;
    where lp (a, b) = a &amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
resultadoPosS&amp;#039;&amp;#039; :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]          &lt;br /&gt;
resultadoPosS&amp;#039;&amp;#039; f = filter ((&amp;gt;0).f)&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
resultadoPosR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosR _ [] = []&lt;br /&gt;
resultadoPosR f (x:xs) &lt;br /&gt;
    | f x &amp;gt; 0   = x: resultadoPosR f xs&lt;br /&gt;
    | otherwise = resultadoPosR f xs&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
resultadoPosP :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosP f = foldr (\x acc -&amp;gt; if f x &amp;gt; 0 then x:acc else acc) []&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Se considera la función&lt;br /&gt;
--     intercala :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (intercala y xs) es la lista que resulta de intercalar el elemento&lt;br /&gt;
-- y delante de todos los elementos de la lista xs que sean menores que y.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--   intercala 5 [1,2,6,3,7,9]  ==  [5,1,5,2,6,5,3,7,9]&lt;br /&gt;
--   intercala 5 [6,7,9,8]      ==  [6,7,9,8]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
intercalaC :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaC y xs =  [x | xs &amp;lt;- xss, x &amp;lt;- xs]&lt;br /&gt;
    where xss = [if x &amp;lt; y then [y, x] else [x] | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
intercalaS :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaS y xs = concat (map (\x -&amp;gt; if x &amp;lt; y then [y, x] else [x]) xs)&lt;br /&gt;
&lt;br /&gt;
intercalaS&amp;#039; y xs = concatMap (\ x -&amp;gt; if y &amp;gt; x then [y, x] else [x]) xs&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
intercalaR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaR _ [] = []&lt;br /&gt;
intercalaR y (x:xs)&lt;br /&gt;
    | x &amp;lt; y         = y:x:intercalaR y xs&lt;br /&gt;
    | otherwise     = x:intercalaR y xs&lt;br /&gt;
    &lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
intercalaP :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaP y = foldr (\x acc -&amp;gt; if x &amp;lt; y then y:x:acc else x:acc) []&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Se considera la función&lt;br /&gt;
--    dec2ent :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (dec2ent xs) es el número entero cuyas cifras ordenadas son los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo,&lt;br /&gt;
--   dec2ent [2,3,4,5]  ==  2345&lt;br /&gt;
--   dec2ent [1..9]     ==  123456789&lt;br /&gt;
--&lt;br /&gt;
-- Defie esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,              &lt;br /&gt;
dec2entC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entC xs = sum [x * (10^y) | (x, y) &amp;lt;- zip (reverse xs) [0,1..] ]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
dec2entS :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS xs = read (map intToDigit (map fromIntegral xs))&lt;br /&gt;
&lt;br /&gt;
dec2entS&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS&amp;#039; xs = read (filter isDigit (show xs))&lt;br /&gt;
&lt;br /&gt;
dec2entS&amp;#039;&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS&amp;#039;&amp;#039; xs = sum (map (\(x,n) -&amp;gt; x*10^n) (zip xs [n,(n-1)..]) )&lt;br /&gt;
  where n = length xs - 1&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
dec2entR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entR xs = dec2entRaux (reverse xs)&lt;br /&gt;
dec2entRaux [] = 0&lt;br /&gt;
dec2entRaux (x:xs) = x + 10*dec2entRaux xs&lt;br /&gt;
&lt;br /&gt;
dec2entR&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entR&amp;#039; [x] = x&lt;br /&gt;
dec2entR&amp;#039; (x:xs) = x*10^(length xs) + dec2entR xs&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
dec2entP :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entP xs = foldr (\ x y -&amp;gt; 10*y + x) 0 (reverse xs)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se considera la función&lt;br /&gt;
--     diferencia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (diferencia xs ys) es la diferencia entre los conjuntos xs e&lt;br /&gt;
-- ys; es decir, el conjunto de los elementos de la lista xs que no se&lt;br /&gt;
-- encuentran en la lista ys. Por ejemplo,&lt;br /&gt;
--   diferencia [2,3,5,6] [5,2,7]  ==  [3,6]&lt;br /&gt;
--   diferencia [1,3,5,7] [2,4,6]  ==  [1,3,5,7]&lt;br /&gt;
--   diferencia [1,3] [1..9]       ==  []&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
diferenciaC :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaC xs ys = [x | x &amp;lt;- xs, not (elem x ys)]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
diferenciaOS :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaOS xs ys = filter (\ x -&amp;gt; not (elem x ys)) xs&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
diferenciaR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaR [] _ = []&lt;br /&gt;
diferenciaR xs [] = xs&lt;br /&gt;
diferenciaR (x:xs) ys&lt;br /&gt;
    | elem x ys         = diferenciaR xs ys&lt;br /&gt;
    | otherwise         = x:diferenciaR xs ys&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
diferenciaP :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaP xs ys = foldr (\x acc -&amp;gt; if elem x ys then acc else x:acc) [] xs&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Se considera la función&lt;br /&gt;
--   primerosYultimos :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
-- tal que (primerosYultimos xss) es el par formado por la lista de los&lt;br /&gt;
-- primeros elementos de las listas no vacías de xss y la lista de los&lt;br /&gt;
-- últimos elementos de las listas no vacías de xss. Por ejemplo,&lt;br /&gt;
--   primerosYultimos [[1,2],[5,3,4],[],[9]]  ==  ([1,5,9],[2,4,9])&lt;br /&gt;
--   primerosYultimos [[1,2],[1,2,3],[1..4]]  ==  ([1,1,1],[2,3,4])&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
primerosYultimosC :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosC xss = unzip [(head xs, last xs) | xs &amp;lt;- xss, not (null xs)]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
primerosYultimosS :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosS xss = unzip (map (\ x -&amp;gt; (head x, last x)) (filter (not.null) xss))&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
primerosYultimosR :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosR xss = unzip (primerosYultimosR&amp;#039; xss)&lt;br /&gt;
primerosYultimosR&amp;#039; [] = []&lt;br /&gt;
primerosYultimosR&amp;#039; (xs:xss)&lt;br /&gt;
  | null xs = primerosYultimosR&amp;#039; xss&lt;br /&gt;
  | otherwise = (head xs, last xs) : primerosYultimosR&amp;#039; xss&lt;br /&gt;
&lt;br /&gt;
primerosYultimosR2 :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosR2 xss = (primerosR xss, ultimosR xss)&lt;br /&gt;
&lt;br /&gt;
primerosR [] = []&lt;br /&gt;
primerosR (xs:xss) | null xs    = primerosR xss&lt;br /&gt;
                   | otherwise  = [head xs] ++ primerosR xss&lt;br /&gt;
ultimosR [] = []&lt;br /&gt;
ultimosR (xs:xss) | null xs    = ultimosR xss&lt;br /&gt;
                  | otherwise  = [last xs] ++ ultimosR xss&lt;br /&gt;
                  &lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
primerosYultimosP xss = unzip (foldr (\ x y -&amp;gt; (head x, last x) : y) [] (filter (/= []) xss))&lt;br /&gt;
&lt;br /&gt;
primerosYultimosP2 :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosP2 xss = (primerosPR xss, ultimosPR xss) &lt;br /&gt;
&lt;br /&gt;
primerosPR xss = foldr f [] xss&lt;br /&gt;
              where f x recu | null x     = recu&lt;br /&gt;
                             | otherwise  = [head x] ++ recu&lt;br /&gt;
ultimosPR xss = foldr f [] xss&lt;br /&gt;
              where f x recu | null x     = recu&lt;br /&gt;
                             | otherwise  = [last x] ++ recu&lt;br /&gt;
                             &lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una lista hermanada es una lista de números estrictamente&lt;br /&gt;
-- positivos en la que cada elemento tiene algún factor primo en común con el&lt;br /&gt;
-- siguiente, en caso de que exista, o alguno de los dos es un 1. Por ejemplo,&lt;br /&gt;
-- [2,6,3,9,1,5] es una lista hermanada.&lt;br /&gt;
&lt;br /&gt;
-- Se considera la función&lt;br /&gt;
--    hermanada :: [Int] -&amp;gt; Bool&lt;br /&gt;
-- tal que (hermanada xs) comprueba que la lista xs es hermanada según la&lt;br /&gt;
-- definición anterior. Por ejemplo,&lt;br /&gt;
--    hermanada [2,6,3,9,1,5]  ==  True&lt;br /&gt;
--    hermanada [2,3,5]        ==  False&lt;br /&gt;
--&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;gcd&amp;#039;&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- hermanos es lo contrario que ser co-primos. Con la siguiente comparación&lt;br /&gt;
-- basta&lt;br /&gt;
hermanos :: Integral a =&amp;gt; a -&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
hermanos x y = x == 1 || y == 1 || (gcd x y /= 1)&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
hermanadaC :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaC xs = and [hermanos x y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
hermanadaOS :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaOS xs = all (\ (x,y) -&amp;gt; hermanos x y) (zip xs (tail xs))&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
hermanadaR :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaR [] = True&lt;br /&gt;
hermanadaR (x:[]) = True&lt;br /&gt;
hermanadaR (x:y:xs) = (hermanos x y) &amp;amp;&amp;amp; (hermanadaR (y:xs))&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
hermanadaP :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaP xs = foldr (\ (x,y) z -&amp;gt; (hermanos x y) &amp;amp;&amp;amp; z) True (zip xs (tail xs))&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un elemento de una lista es permanente si ninguno de los que&lt;br /&gt;
-- vienen a continuación en la lista es mayor que él. Consideramos la función&lt;br /&gt;
--   permanentes :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (permanentes xs) es la lista de los elementos permanentes de la&lt;br /&gt;
-- lista xs. Por ejemplo,&lt;br /&gt;
--   permanentes [80,1,7,8,4]  ==  [80,8,4]&lt;br /&gt;
&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;tails&amp;#039; de Data.List.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
head_permanente :: Ord a =&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
head_permanente (y:[]) = True&lt;br /&gt;
head_permanente (y:ys) = (maximum ys &amp;lt;= y)&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
permanentesC :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesC xs = [y | (y:ys) &amp;lt;- tails xs, head_permanente (y:ys)]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)               &lt;br /&gt;
permanentesS :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesS xs = map head (filter head_permanente (init (tails xs)))&lt;br /&gt;
&lt;br /&gt;
-- Por composición de funciones&lt;br /&gt;
permanentesS&amp;#039; :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesS&amp;#039; = (map head) .  (filter head_permanente) .  init . tails&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
permanentesR :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesR [] = []&lt;br /&gt;
permanentesR (x:xs)&lt;br /&gt;
  | head_permanente (x:xs) = x:permanentesR xs&lt;br /&gt;
  | otherwise   = permanentesR xs&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
permanentesP :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesP xs = foldr (\ys acc -&amp;gt; if head_permanente ys then (head ys):acc else acc) [] (init (tails xs))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Un número entero positivo n es muy primo si es n primo&lt;br /&gt;
-- y todos los números que resultan de ir suprimimiendo la última cifra&lt;br /&gt;
-- también son primos. Por ejemplo, 7193 es muy primo pues los números&lt;br /&gt;
-- 7193, 719, 71 y 7 son todos primos. &lt;br /&gt;
-- &lt;br /&gt;
-- Define la función &lt;br /&gt;
--    muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- que (muyPrimo n) se verifica si n es muy primo. Por ejemplo,&lt;br /&gt;
--    muyPrimo 7193  == True&lt;br /&gt;
--    muyPrimo 71932 == False&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
muyPrimo 0 = True&lt;br /&gt;
muyPrimo n = isPrime n &amp;amp;&amp;amp; (muyPrimo (div n 10))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- ¿Cuántos números de cinco cifras son muy primos?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
-- length $ filter muyPrimo [10^4..(10^5-1)]&lt;br /&gt;
-- &amp;gt; 15&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9_Sol&amp;diff=531</id>
		<title>Relación 9 Sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9_Sol&amp;diff=531"/>
		<updated>2021-12-10T15:31:12Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Protegió «Relación 9 Sol» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
-- PD Practica 5.2 Solución&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados (II)&lt;br /&gt;
-- Departamento de Ciencias de la Computación e Inteligencia Artificial&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Librerías auxiliares&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
import Data.Char&lt;br /&gt;
import Data.List&lt;br /&gt;
-- cabal install primes&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Se considera la función&lt;br /&gt;
--      resultadoPos :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (resultadoPos f xs) es la lista de los elementos de la lista&lt;br /&gt;
-- xs tales que el valor de la función f sobre ellos es positivo. Por ejemplo,&lt;br /&gt;
--   resultadoPos head [[-1,2],[-9,4],[2,3]]       ==  [[2,3]]&lt;br /&gt;
--   resultadoPos sum [[1,2],[9],[-8,3],[],[3,5]]  ==  [[1,2],[9],[3,5]]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
resultadoPosC :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosC f xs = [x | x &amp;lt;- xs, f x &amp;gt; 0]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
resultadoPosS :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosS f xs = filter (\x -&amp;gt; f x &amp;gt; 0) xs&lt;br /&gt;
&lt;br /&gt;
resultadoPosS&amp;#039; f xs = filter lp (zip (map f xs) xs)&lt;br /&gt;
    where lp (a, b) = a &amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
resultadoPosS&amp;#039;&amp;#039; :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]          &lt;br /&gt;
resultadoPosS&amp;#039;&amp;#039; f = filter ((&amp;gt;0).f)&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
resultadoPosR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosR _ [] = []&lt;br /&gt;
resultadoPosR f (x:xs) &lt;br /&gt;
    | f x &amp;gt; 0   = x: resultadoPosR f xs&lt;br /&gt;
    | otherwise = resultadoPosR f xs&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
resultadoPosP :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosP f = foldr (\x acc -&amp;gt; if f x &amp;gt; 0 then x:acc else acc) []&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Se considera la función&lt;br /&gt;
--     intercala :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (intercala y xs) es la lista que resulta de intercalar el elemento&lt;br /&gt;
-- y delante de todos los elementos de la lista xs que sean menores que y.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--   intercala 5 [1,2,6,3,7,9]  ==  [5,1,5,2,6,5,3,7,9]&lt;br /&gt;
--   intercala 5 [6,7,9,8]      ==  [6,7,9,8]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
intercalaC :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaC y xs =  [x | xs &amp;lt;- xss, x &amp;lt;- xs]&lt;br /&gt;
    where xss = [if x &amp;lt; y then [y, x] else [x] | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
intercalaS :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaS y xs = concat (map (\x -&amp;gt; if x &amp;lt; y then [y, x] else [x]) xs)&lt;br /&gt;
&lt;br /&gt;
intercalaS&amp;#039; y xs = concatMap (\ x -&amp;gt; if y &amp;gt; x then [y, x] else [x]) xs&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
intercalaR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaR _ [] = []&lt;br /&gt;
intercalaR y (x:xs)&lt;br /&gt;
    | x &amp;lt; y         = y:x:intercalaR y xs&lt;br /&gt;
    | otherwise     = x:intercalaR y xs&lt;br /&gt;
    &lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
intercalaP :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaP y = foldr (\x acc -&amp;gt; if x &amp;lt; y then y:x:acc else x:acc) []&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Se considera la función&lt;br /&gt;
--    dec2ent :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (dec2ent xs) es el número entero cuyas cifras ordenadas son los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo,&lt;br /&gt;
--   dec2ent [2,3,4,5]  ==  2345&lt;br /&gt;
--   dec2ent [1..9]     ==  123456789&lt;br /&gt;
--&lt;br /&gt;
-- Defie esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,              &lt;br /&gt;
dec2entC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entC xs = sum [x * (10^y) | (x, y) &amp;lt;- zip (reverse xs) [0,1..] ]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
dec2entS :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS xs = read (map intToDigit (map fromIntegral xs))&lt;br /&gt;
&lt;br /&gt;
dec2entS&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS&amp;#039; xs = read (filter isDigit (show xs))&lt;br /&gt;
&lt;br /&gt;
dec2entS&amp;#039;&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS&amp;#039;&amp;#039; xs = sum (map (\(x,n) -&amp;gt; x*10^n) (zip xs [n,(n-1)..]) )&lt;br /&gt;
  where n = length xs - 1&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
dec2entR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entR xs = dec2entRaux (reverse xs)&lt;br /&gt;
dec2entRaux [] = 0&lt;br /&gt;
dec2entRaux (x:xs) = x + 10*dec2entRaux xs&lt;br /&gt;
&lt;br /&gt;
dec2entR&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entR&amp;#039; [x] = x&lt;br /&gt;
dec2entR&amp;#039; (x:xs) = x*10^(length xs) + dec2entR xs&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
dec2entP :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entP xs = foldr (\ x y -&amp;gt; 10*y + x) 0 (reverse xs)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se considera la función&lt;br /&gt;
--     diferencia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (diferencia xs ys) es la diferencia entre los conjuntos xs e&lt;br /&gt;
-- ys; es decir, el conjunto de los elementos de la lista xs que no se&lt;br /&gt;
-- encuentran en la lista ys. Por ejemplo,&lt;br /&gt;
--   diferencia [2,3,5,6] [5,2,7]  ==  [3,6]&lt;br /&gt;
--   diferencia [1,3,5,7] [2,4,6]  ==  [1,3,5,7]&lt;br /&gt;
--   diferencia [1,3] [1..9]       ==  []&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
diferenciaC :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaC xs ys = [x | x &amp;lt;- xs, not (elem x ys)]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
diferenciaOS :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaOS xs ys = filter (\ x -&amp;gt; not (elem x ys)) xs&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
diferenciaR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaR [] _ = []&lt;br /&gt;
diferenciaR xs [] = xs&lt;br /&gt;
diferenciaR (x:xs) ys&lt;br /&gt;
    | elem x ys         = diferenciaR xs ys&lt;br /&gt;
    | otherwise         = x:diferenciaR xs ys&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
diferenciaP :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaP xs ys = foldr (\x acc -&amp;gt; if elem x ys then acc else x:acc) [] xs&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Se considera la función&lt;br /&gt;
--   primerosYultimos :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
-- tal que (primerosYultimos xss) es el par formado por la lista de los&lt;br /&gt;
-- primeros elementos de las listas no vacías de xss y la lista de los&lt;br /&gt;
-- últimos elementos de las listas no vacías de xss. Por ejemplo,&lt;br /&gt;
--   primerosYultimos [[1,2],[5,3,4],[],[9]]  ==  ([1,5,9],[2,4,9])&lt;br /&gt;
--   primerosYultimos [[1,2],[1,2,3],[1..4]]  ==  ([1,1,1],[2,3,4])&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
primerosYultimosC :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosC xss = unzip [(head xs, last xs) | xs &amp;lt;- xss, not (null xs)]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
primerosYultimosS :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosS xss = unzip (map (\ x -&amp;gt; (head x, last x)) (filter (not.null) xss))&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
primerosYultimosR :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosR xss = unzip (primerosYultimosR&amp;#039; xss)&lt;br /&gt;
primerosYultimosR&amp;#039; [] = []&lt;br /&gt;
primerosYultimosR&amp;#039; (xs:xss)&lt;br /&gt;
  | null xs = primerosYultimosR&amp;#039; xss&lt;br /&gt;
  | otherwise = (head xs, last xs) : primerosYultimosR&amp;#039; xss&lt;br /&gt;
&lt;br /&gt;
primerosYultimosR2 :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosR2 xss = (primerosR xss, ultimosR xss)&lt;br /&gt;
&lt;br /&gt;
primerosR [] = []&lt;br /&gt;
primerosR (xs:xss) | null xs    = primerosR xss&lt;br /&gt;
                   | otherwise  = [head xs] ++ primerosR xss&lt;br /&gt;
ultimosR [] = []&lt;br /&gt;
ultimosR (xs:xss) | null xs    = ultimosR xss&lt;br /&gt;
                  | otherwise  = [last xs] ++ ultimosR xss&lt;br /&gt;
                  &lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
primerosYultimosP xss = unzip (foldr (\ x y -&amp;gt; (head x, last x) : y) [] (filter (/= []) xss))&lt;br /&gt;
&lt;br /&gt;
primerosYultimosP2 :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosP2 xss = (primerosPR xss, ultimosPR xss) &lt;br /&gt;
&lt;br /&gt;
primerosPR xss = foldr f [] xss&lt;br /&gt;
              where f x recu | null x     = recu&lt;br /&gt;
                             | otherwise  = [head x] ++ recu&lt;br /&gt;
ultimosPR xss = foldr f [] xss&lt;br /&gt;
              where f x recu | null x     = recu&lt;br /&gt;
                             | otherwise  = [last x] ++ recu&lt;br /&gt;
                             &lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una lista hermanada es una lista de números estrictamente&lt;br /&gt;
-- positivos en la que cada elemento tiene algún factor primo en común con el&lt;br /&gt;
-- siguiente, en caso de que exista, o alguno de los dos es un 1. Por ejemplo,&lt;br /&gt;
-- [2,6,3,9,1,5] es una lista hermanada.&lt;br /&gt;
&lt;br /&gt;
-- Se considera la función&lt;br /&gt;
--    hermanada :: [Int] -&amp;gt; Bool&lt;br /&gt;
-- tal que (hermanada xs) comprueba que la lista xs es hermanada según la&lt;br /&gt;
-- definición anterior. Por ejemplo,&lt;br /&gt;
--    hermanada [2,6,3,9,1,5]  ==  True&lt;br /&gt;
--    hermanada [2,3,5]        ==  False&lt;br /&gt;
--&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;gcd&amp;#039;&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- hermanos es lo contrario que ser co-primos. Con la siguiente comparación&lt;br /&gt;
-- basta&lt;br /&gt;
hermanos :: Integral a =&amp;gt; a -&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
hermanos x y = x == 1 || y == 1 || (gcd x y /= 1)&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
hermanadaC :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaC xs = and [hermanos x y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
hermanadaOS :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaOS xs = all (\ (x,y) -&amp;gt; hermanos x y) (zip xs (tail xs))&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
hermanadaR :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaR [] = True&lt;br /&gt;
hermanadaR (x:[]) = True&lt;br /&gt;
hermanadaR (x:y:xs) = (hermanos x y) &amp;amp;&amp;amp; (hermanadaR (y:xs))&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
hermanadaP :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaP xs = foldr (\ (x,y) z -&amp;gt; (hermanos x y) &amp;amp;&amp;amp; z) True (zip xs (tail xs))&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un elemento de una lista es permanente si ninguno de los que&lt;br /&gt;
-- vienen a continuación en la lista es mayor que él. Consideramos la función&lt;br /&gt;
--   permanentes :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (permanentes xs) es la lista de los elementos permanentes de la&lt;br /&gt;
-- lista xs. Por ejemplo,&lt;br /&gt;
--   permanentes [80,1,7,8,4]  ==  [80,8,4]&lt;br /&gt;
&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;tails&amp;#039; de Data.List.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
head_permanente :: Ord a =&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
head_permanente (y:[]) = True&lt;br /&gt;
head_permanente (y:ys) = (maximum ys &amp;lt;= y)&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
permanentesC :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesC xs = [y | (y:ys) &amp;lt;- tails xs, head_permanente (y:ys)]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)               &lt;br /&gt;
permanentesS :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesS xs = map head (filter head_permanente (init (tails xs)))&lt;br /&gt;
&lt;br /&gt;
-- Por composición de funciones&lt;br /&gt;
permanentesS&amp;#039; :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesS&amp;#039; = (map head) .  (filter head_permanente) .  init . tails&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
permanentesR :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesR [] = []&lt;br /&gt;
permanentesR (x:xs)&lt;br /&gt;
  | head_permanente (x:xs) = x:permanentesR xs&lt;br /&gt;
  | otherwise   = permanentesR xs&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
permanentesP :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesP xs = foldr (\ys acc -&amp;gt; if head_permanente ys then (head ys):acc else acc) [] (init (tails xs))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Un número entero positivo n es muy primo si es n primo&lt;br /&gt;
-- y todos los números que resultan de ir suprimimiendo la última cifra&lt;br /&gt;
-- también son primos. Por ejemplo, 7193 es muy primo pues los números&lt;br /&gt;
-- 7193, 719, 71 y 7 son todos primos. &lt;br /&gt;
-- &lt;br /&gt;
-- Define la función &lt;br /&gt;
--    muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- que (muyPrimo n) se verifica si n es muy primo. Por ejemplo,&lt;br /&gt;
--    muyPrimo 7193  == True&lt;br /&gt;
--    muyPrimo 71932 == False&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
muyPrimo 0 = True&lt;br /&gt;
muyPrimo n = isPrime n &amp;amp;&amp;amp; (muyPrimo (div n 10))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- ¿Cuántos números de cinco cifras son muy primos?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
-- length $ filter muyPrimo [10^4..(10^5-1)]&lt;br /&gt;
-- &amp;gt; 15&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9_Sol&amp;diff=530</id>
		<title>Relación 9 Sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9_Sol&amp;diff=530"/>
		<updated>2021-12-10T15:30:59Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
-- PD Practica 5.2 Solución&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados (II)&lt;br /&gt;
-- Departamento de Ciencias de la Computación e Inteligencia Artificial&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Librerías auxiliares&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
import Data.Char&lt;br /&gt;
import Data.List&lt;br /&gt;
-- cabal install primes&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Se considera la función&lt;br /&gt;
--      resultadoPos :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (resultadoPos f xs) es la lista de los elementos de la lista&lt;br /&gt;
-- xs tales que el valor de la función f sobre ellos es positivo. Por ejemplo,&lt;br /&gt;
--   resultadoPos head [[-1,2],[-9,4],[2,3]]       ==  [[2,3]]&lt;br /&gt;
--   resultadoPos sum [[1,2],[9],[-8,3],[],[3,5]]  ==  [[1,2],[9],[3,5]]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
resultadoPosC :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosC f xs = [x | x &amp;lt;- xs, f x &amp;gt; 0]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
resultadoPosS :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosS f xs = filter (\x -&amp;gt; f x &amp;gt; 0) xs&lt;br /&gt;
&lt;br /&gt;
resultadoPosS&amp;#039; f xs = filter lp (zip (map f xs) xs)&lt;br /&gt;
    where lp (a, b) = a &amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
resultadoPosS&amp;#039;&amp;#039; :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]          &lt;br /&gt;
resultadoPosS&amp;#039;&amp;#039; f = filter ((&amp;gt;0).f)&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
resultadoPosR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosR _ [] = []&lt;br /&gt;
resultadoPosR f (x:xs) &lt;br /&gt;
    | f x &amp;gt; 0   = x: resultadoPosR f xs&lt;br /&gt;
    | otherwise = resultadoPosR f xs&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
resultadoPosP :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosP f = foldr (\x acc -&amp;gt; if f x &amp;gt; 0 then x:acc else acc) []&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Se considera la función&lt;br /&gt;
--     intercala :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (intercala y xs) es la lista que resulta de intercalar el elemento&lt;br /&gt;
-- y delante de todos los elementos de la lista xs que sean menores que y.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--   intercala 5 [1,2,6,3,7,9]  ==  [5,1,5,2,6,5,3,7,9]&lt;br /&gt;
--   intercala 5 [6,7,9,8]      ==  [6,7,9,8]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
intercalaC :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaC y xs =  [x | xs &amp;lt;- xss, x &amp;lt;- xs]&lt;br /&gt;
    where xss = [if x &amp;lt; y then [y, x] else [x] | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
intercalaS :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaS y xs = concat (map (\x -&amp;gt; if x &amp;lt; y then [y, x] else [x]) xs)&lt;br /&gt;
&lt;br /&gt;
intercalaS&amp;#039; y xs = concatMap (\ x -&amp;gt; if y &amp;gt; x then [y, x] else [x]) xs&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
intercalaR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaR _ [] = []&lt;br /&gt;
intercalaR y (x:xs)&lt;br /&gt;
    | x &amp;lt; y         = y:x:intercalaR y xs&lt;br /&gt;
    | otherwise     = x:intercalaR y xs&lt;br /&gt;
    &lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
intercalaP :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaP y = foldr (\x acc -&amp;gt; if x &amp;lt; y then y:x:acc else x:acc) []&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Se considera la función&lt;br /&gt;
--    dec2ent :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (dec2ent xs) es el número entero cuyas cifras ordenadas son los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo,&lt;br /&gt;
--   dec2ent [2,3,4,5]  ==  2345&lt;br /&gt;
--   dec2ent [1..9]     ==  123456789&lt;br /&gt;
--&lt;br /&gt;
-- Defie esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,              &lt;br /&gt;
dec2entC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entC xs = sum [x * (10^y) | (x, y) &amp;lt;- zip (reverse xs) [0,1..] ]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
dec2entS :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS xs = read (map intToDigit (map fromIntegral xs))&lt;br /&gt;
&lt;br /&gt;
dec2entS&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS&amp;#039; xs = read (filter isDigit (show xs))&lt;br /&gt;
&lt;br /&gt;
dec2entS&amp;#039;&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS&amp;#039;&amp;#039; xs = sum (map (\(x,n) -&amp;gt; x*10^n) (zip xs [n,(n-1)..]) )&lt;br /&gt;
  where n = length xs - 1&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
dec2entR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entR xs = dec2entRaux (reverse xs)&lt;br /&gt;
dec2entRaux [] = 0&lt;br /&gt;
dec2entRaux (x:xs) = x + 10*dec2entRaux xs&lt;br /&gt;
&lt;br /&gt;
dec2entR&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entR&amp;#039; [x] = x&lt;br /&gt;
dec2entR&amp;#039; (x:xs) = x*10^(length xs) + dec2entR xs&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
dec2entP :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entP xs = foldr (\ x y -&amp;gt; 10*y + x) 0 (reverse xs)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se considera la función&lt;br /&gt;
--     diferencia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (diferencia xs ys) es la diferencia entre los conjuntos xs e&lt;br /&gt;
-- ys; es decir, el conjunto de los elementos de la lista xs que no se&lt;br /&gt;
-- encuentran en la lista ys. Por ejemplo,&lt;br /&gt;
--   diferencia [2,3,5,6] [5,2,7]  ==  [3,6]&lt;br /&gt;
--   diferencia [1,3,5,7] [2,4,6]  ==  [1,3,5,7]&lt;br /&gt;
--   diferencia [1,3] [1..9]       ==  []&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
diferenciaC :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaC xs ys = [x | x &amp;lt;- xs, not (elem x ys)]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
diferenciaOS :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaOS xs ys = filter (\ x -&amp;gt; not (elem x ys)) xs&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
diferenciaR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaR [] _ = []&lt;br /&gt;
diferenciaR xs [] = xs&lt;br /&gt;
diferenciaR (x:xs) ys&lt;br /&gt;
    | elem x ys         = diferenciaR xs ys&lt;br /&gt;
    | otherwise         = x:diferenciaR xs ys&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
diferenciaP :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaP xs ys = foldr (\x acc -&amp;gt; if elem x ys then acc else x:acc) [] xs&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Se considera la función&lt;br /&gt;
--   primerosYultimos :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
-- tal que (primerosYultimos xss) es el par formado por la lista de los&lt;br /&gt;
-- primeros elementos de las listas no vacías de xss y la lista de los&lt;br /&gt;
-- últimos elementos de las listas no vacías de xss. Por ejemplo,&lt;br /&gt;
--   primerosYultimos [[1,2],[5,3,4],[],[9]]  ==  ([1,5,9],[2,4,9])&lt;br /&gt;
--   primerosYultimos [[1,2],[1,2,3],[1..4]]  ==  ([1,1,1],[2,3,4])&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
primerosYultimosC :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosC xss = unzip [(head xs, last xs) | xs &amp;lt;- xss, not (null xs)]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
primerosYultimosS :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosS xss = unzip (map (\ x -&amp;gt; (head x, last x)) (filter (not.null) xss))&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
primerosYultimosR :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosR xss = unzip (primerosYultimosR&amp;#039; xss)&lt;br /&gt;
primerosYultimosR&amp;#039; [] = []&lt;br /&gt;
primerosYultimosR&amp;#039; (xs:xss)&lt;br /&gt;
  | null xs = primerosYultimosR&amp;#039; xss&lt;br /&gt;
  | otherwise = (head xs, last xs) : primerosYultimosR&amp;#039; xss&lt;br /&gt;
&lt;br /&gt;
primerosYultimosR2 :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosR2 xss = (primerosR xss, ultimosR xss)&lt;br /&gt;
&lt;br /&gt;
primerosR [] = []&lt;br /&gt;
primerosR (xs:xss) | null xs    = primerosR xss&lt;br /&gt;
                   | otherwise  = [head xs] ++ primerosR xss&lt;br /&gt;
ultimosR [] = []&lt;br /&gt;
ultimosR (xs:xss) | null xs    = ultimosR xss&lt;br /&gt;
                  | otherwise  = [last xs] ++ ultimosR xss&lt;br /&gt;
                  &lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
primerosYultimosP xss = unzip (foldr (\ x y -&amp;gt; (head x, last x) : y) [] (filter (/= []) xss))&lt;br /&gt;
&lt;br /&gt;
primerosYultimosP2 :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosP2 xss = (primerosPR xss, ultimosPR xss) &lt;br /&gt;
&lt;br /&gt;
primerosPR xss = foldr f [] xss&lt;br /&gt;
              where f x recu | null x     = recu&lt;br /&gt;
                             | otherwise  = [head x] ++ recu&lt;br /&gt;
ultimosPR xss = foldr f [] xss&lt;br /&gt;
              where f x recu | null x     = recu&lt;br /&gt;
                             | otherwise  = [last x] ++ recu&lt;br /&gt;
                             &lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una lista hermanada es una lista de números estrictamente&lt;br /&gt;
-- positivos en la que cada elemento tiene algún factor primo en común con el&lt;br /&gt;
-- siguiente, en caso de que exista, o alguno de los dos es un 1. Por ejemplo,&lt;br /&gt;
-- [2,6,3,9,1,5] es una lista hermanada.&lt;br /&gt;
&lt;br /&gt;
-- Se considera la función&lt;br /&gt;
--    hermanada :: [Int] -&amp;gt; Bool&lt;br /&gt;
-- tal que (hermanada xs) comprueba que la lista xs es hermanada según la&lt;br /&gt;
-- definición anterior. Por ejemplo,&lt;br /&gt;
--    hermanada [2,6,3,9,1,5]  ==  True&lt;br /&gt;
--    hermanada [2,3,5]        ==  False&lt;br /&gt;
--&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;gcd&amp;#039;&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- hermanos es lo contrario que ser co-primos. Con la siguiente comparación&lt;br /&gt;
-- basta&lt;br /&gt;
hermanos :: Integral a =&amp;gt; a -&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
hermanos x y = x == 1 || y == 1 || (gcd x y /= 1)&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
hermanadaC :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaC xs = and [hermanos x y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
hermanadaOS :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaOS xs = all (\ (x,y) -&amp;gt; hermanos x y) (zip xs (tail xs))&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
hermanadaR :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaR [] = True&lt;br /&gt;
hermanadaR (x:[]) = True&lt;br /&gt;
hermanadaR (x:y:xs) = (hermanos x y) &amp;amp;&amp;amp; (hermanadaR (y:xs))&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
hermanadaP :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaP xs = foldr (\ (x,y) z -&amp;gt; (hermanos x y) &amp;amp;&amp;amp; z) True (zip xs (tail xs))&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un elemento de una lista es permanente si ninguno de los que&lt;br /&gt;
-- vienen a continuación en la lista es mayor que él. Consideramos la función&lt;br /&gt;
--   permanentes :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (permanentes xs) es la lista de los elementos permanentes de la&lt;br /&gt;
-- lista xs. Por ejemplo,&lt;br /&gt;
--   permanentes [80,1,7,8,4]  ==  [80,8,4]&lt;br /&gt;
&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;tails&amp;#039; de Data.List.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
head_permanente :: Ord a =&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
head_permanente (y:[]) = True&lt;br /&gt;
head_permanente (y:ys) = (maximum ys &amp;lt;= y)&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
permanentesC :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesC xs = [y | (y:ys) &amp;lt;- tails xs, head_permanente (y:ys)]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)               &lt;br /&gt;
permanentesS :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesS xs = map head (filter head_permanente (init (tails xs)))&lt;br /&gt;
&lt;br /&gt;
-- Por composición de funciones&lt;br /&gt;
permanentesS&amp;#039; :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesS&amp;#039; = (map head) .  (filter head_permanente) .  init . tails&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
permanentesR :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesR [] = []&lt;br /&gt;
permanentesR (x:xs)&lt;br /&gt;
  | head_permanente (x:xs) = x:permanentesR xs&lt;br /&gt;
  | otherwise   = permanentesR xs&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
permanentesP :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesP xs = foldr (\ys acc -&amp;gt; if head_permanente ys then (head ys):acc else acc) [] (init (tails xs))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Un número entero positivo n es muy primo si es n primo&lt;br /&gt;
-- y todos los números que resultan de ir suprimimiendo la última cifra&lt;br /&gt;
-- también son primos. Por ejemplo, 7193 es muy primo pues los números&lt;br /&gt;
-- 7193, 719, 71 y 7 son todos primos. &lt;br /&gt;
-- &lt;br /&gt;
-- Define la función &lt;br /&gt;
--    muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- que (muyPrimo n) se verifica si n es muy primo. Por ejemplo,&lt;br /&gt;
--    muyPrimo 7193  == True&lt;br /&gt;
--    muyPrimo 71932 == False&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
muyPrimo 0 = True&lt;br /&gt;
muyPrimo n = isPrime n &amp;amp;&amp;amp; (muyPrimo (div n 10))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- ¿Cuántos números de cinco cifras son muy primos?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
-- length $ filter muyPrimo [10^4..(10^5-1)]&lt;br /&gt;
-- &amp;gt; 15&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9_Sol&amp;diff=529</id>
		<title>Relación 9 Sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9_Sol&amp;diff=529"/>
		<updated>2021-12-10T15:29:50Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Página creada con «&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt; -- PD Practica 5.2 Solución -- Funciones de orden superior y definiciones por plegados (II) -- Departamento de Ciencias de la Computación e Inteli…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
-- PD Practica 5.2 Solución&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados (II)&lt;br /&gt;
-- Departamento de Ciencias de la Computación e Inteligencia Artificial&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Librerías auxiliares&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
import Data.Char&lt;br /&gt;
import Data.List&lt;br /&gt;
-- cabal install primes&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Se considera la función&lt;br /&gt;
--      resultadoPos :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (resultadoPos f xs) es la lista de los elementos de la lista&lt;br /&gt;
-- xs tales que el valor de la función f sobre ellos es positivo. Por ejemplo,&lt;br /&gt;
--   resultadoPos head [[-1,2],[-9,4],[2,3]]       ==  [[2,3]]&lt;br /&gt;
--   resultadoPos sum [[1,2],[9],[-8,3],[],[3,5]]  ==  [[1,2],[9],[3,5]]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
resultadoPosC :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosC f xs = [x | x &amp;lt;- xs, f x &amp;gt; 0]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
resultadoPosS :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosS f xs = filter (\x -&amp;gt; f x &amp;gt; 0) xs&lt;br /&gt;
&lt;br /&gt;
resultadoPosS&amp;#039; f xs = filter lp (zip (map f xs) xs)&lt;br /&gt;
    where lp (a, b) = a &amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
resultadoPosS&amp;#039;&amp;#039; :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]          &lt;br /&gt;
resultadoPosS&amp;#039;&amp;#039; f = filter ((&amp;gt;0).f)&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
resultadoPosR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosR _ [] = []&lt;br /&gt;
resultadoPosR f (x:xs) &lt;br /&gt;
    | f x &amp;gt; 0   = x: resultadoPosR f xs&lt;br /&gt;
    | otherwise = resultadoPosR f xs&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
resultadoPosP :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosP f = foldr (\x acc -&amp;gt; if f x &amp;gt; 0 then x:acc else acc) []&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Se considera la función&lt;br /&gt;
--     intercala :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (intercala y xs) es la lista que resulta de intercalar el elemento&lt;br /&gt;
-- y delante de todos los elementos de la lista xs que sean menores que y.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--   intercala 5 [1,2,6,3,7,9]  ==  [5,1,5,2,6,5,3,7,9]&lt;br /&gt;
--   intercala 5 [6,7,9,8]      ==  [6,7,9,8]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
intercalaC :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaC y xs =  [x | xs &amp;lt;- xss, x &amp;lt;- xs]&lt;br /&gt;
    where xss = [if x &amp;lt; y then [y, x] else [x] | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
intercalaS :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaS y xs = concat (map (\x -&amp;gt; if x &amp;lt; y then [y, x] else [x]) xs)&lt;br /&gt;
&lt;br /&gt;
intercalaS&amp;#039; y xs = concatMap (\ x -&amp;gt; if y &amp;gt; x then [y, x] else [x]) xs&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
intercalaR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaR _ [] = []&lt;br /&gt;
intercalaR y (x:xs)&lt;br /&gt;
    | x &amp;lt; y         = y:x:intercalaR y xs&lt;br /&gt;
    | otherwise     = x:intercalaR y xs&lt;br /&gt;
    &lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
intercalaP :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaP y = foldr (\x acc -&amp;gt; if x &amp;lt; y then y:x:acc else x:acc) []&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Se considera la función&lt;br /&gt;
--    dec2ent :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (dec2ent xs) es el número entero cuyas cifras ordenadas son los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo,&lt;br /&gt;
--   dec2ent [2,3,4,5]  ==  2345&lt;br /&gt;
--   dec2ent [1..9]     ==  123456789&lt;br /&gt;
--&lt;br /&gt;
-- Defie esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,              &lt;br /&gt;
dec2entC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entC xs = sum [x * (10^y) | (x, y) &amp;lt;- zip (reverse xs) [0,1..] ]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
dec2entS :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS xs = read (map intToDigit (map fromIntegral xs))&lt;br /&gt;
&lt;br /&gt;
dec2entS&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS&amp;#039; xs = read (filter isDigit (show xs))&lt;br /&gt;
&lt;br /&gt;
dec2entS&amp;#039;&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS&amp;#039;&amp;#039; xs = sum (map (\(x,n) -&amp;gt; x*10^n) (zip xs [n,(n-1)..]) )&lt;br /&gt;
  where n = length xs - 1&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
dec2entR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entR xs = dec2entRaux (reverse xs)&lt;br /&gt;
dec2entRaux [] = 0&lt;br /&gt;
dec2entRaux (x:xs) = x + 10*dec2entRaux xs&lt;br /&gt;
&lt;br /&gt;
dec2entR&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entR&amp;#039; [x] = x&lt;br /&gt;
dec2entR&amp;#039; (x:xs) = x*10^(length xs) + dec2entR xs&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
dec2entP :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entP xs = foldr (\ x y -&amp;gt; 10*y + x) 0 (reverse xs)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se considera la función&lt;br /&gt;
--     diferencia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (diferencia xs ys) es la diferencia entre los conjuntos xs e&lt;br /&gt;
-- ys; es decir, el conjunto de los elementos de la lista xs que no se&lt;br /&gt;
-- encuentran en la lista ys. Por ejemplo,&lt;br /&gt;
--   diferencia [2,3,5,6] [5,2,7]  ==  [3,6]&lt;br /&gt;
--   diferencia [1,3,5,7] [2,4,6]  ==  [1,3,5,7]&lt;br /&gt;
--   diferencia [1,3] [1..9]       ==  []&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
diferenciaC :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaC xs ys = [x | x &amp;lt;- xs, not (elem x ys)]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
diferenciaOS :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaOS xs ys = filter (\ x -&amp;gt; not (elem x ys)) xs&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
diferenciaR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaR [] _ = []&lt;br /&gt;
diferenciaR xs [] = xs&lt;br /&gt;
diferenciaR (x:xs) ys&lt;br /&gt;
    | elem x ys         = diferenciaR xs ys&lt;br /&gt;
    | otherwise         = x:diferenciaR xs ys&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
diferenciaP :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaP xs ys = foldr (\x acc -&amp;gt; if elem x ys then acc else x:acc) [] xs&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Se considera la función&lt;br /&gt;
--   primerosYultimos :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
-- tal que (primerosYultimos xss) es el par formado por la lista de los&lt;br /&gt;
-- primeros elementos de las listas no vacías de xss y la lista de los&lt;br /&gt;
-- últimos elementos de las listas no vacías de xss. Por ejemplo,&lt;br /&gt;
--   primerosYultimos [[1,2],[5,3,4],[],[9]]  ==  ([1,5,9],[2,4,9])&lt;br /&gt;
--   primerosYultimos [[1,2],[1,2,3],[1..4]]  ==  ([1,1,1],[2,3,4])&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
primerosYultimosC :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosC xss = unzip [(head xs, last xs) | xs &amp;lt;- xss, not (null xs)]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
primerosYultimosS :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosS xss = unzip (map (\ x -&amp;gt; (head x, last x)) (filter (not.null) xss))&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
primerosYultimosR :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosR xss = unzip (primerosYultimosR&amp;#039; xss)&lt;br /&gt;
primerosYultimosR&amp;#039; [] = []&lt;br /&gt;
primerosYultimosR&amp;#039; (xs:xss)&lt;br /&gt;
  | null xs = primerosYultimosR&amp;#039; xss&lt;br /&gt;
  | otherwise = (head xs, last xs) : primerosYultimosR&amp;#039; xss&lt;br /&gt;
&lt;br /&gt;
primerosYultimosR2 :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosR2 xss = (primerosR xss, ultimosR xss)&lt;br /&gt;
&lt;br /&gt;
primerosR [] = []&lt;br /&gt;
primerosR (xs:xss) | null xs    = primerosR xss&lt;br /&gt;
                   | otherwise  = [head xs] ++ primerosR xss&lt;br /&gt;
ultimosR [] = []&lt;br /&gt;
ultimosR (xs:xss) | null xs    = ultimosR xss&lt;br /&gt;
                  | otherwise  = [last xs] ++ ultimosR xss&lt;br /&gt;
                  &lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
primerosYultimosP xss = unzip (foldr (\ x y -&amp;gt; (head x, last x) : y) [] (filter (/= []) xss))&lt;br /&gt;
&lt;br /&gt;
primerosYultimosP2 :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosP2 xss = (primerosPR xss, ultimosPR xss) &lt;br /&gt;
&lt;br /&gt;
primerosPR xss = foldr f [] xss&lt;br /&gt;
              where f x recu | null x     = recu&lt;br /&gt;
                             | otherwise  = [head x] ++ recu&lt;br /&gt;
ultimosPR xss = foldr f [] xss&lt;br /&gt;
              where f x recu | null x     = recu&lt;br /&gt;
                             | otherwise  = [last x] ++ recu&lt;br /&gt;
                             &lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una lista hermanada es una lista de números estrictamente&lt;br /&gt;
-- positivos en la que cada elemento tiene algún factor primo en común con el&lt;br /&gt;
-- siguiente, en caso de que exista, o alguno de los dos es un 1. Por ejemplo,&lt;br /&gt;
-- [2,6,3,9,1,5] es una lista hermanada.&lt;br /&gt;
&lt;br /&gt;
-- Se considera la función&lt;br /&gt;
--    hermanada :: [Int] -&amp;gt; Bool&lt;br /&gt;
-- tal que (hermanada xs) comprueba que la lista xs es hermanada según la&lt;br /&gt;
-- definición anterior. Por ejemplo,&lt;br /&gt;
--    hermanada [2,6,3,9,1,5]  ==  True&lt;br /&gt;
--    hermanada [2,3,5]        ==  False&lt;br /&gt;
--&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;gcd&amp;#039;&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- hermanos es lo contrario que ser co-primos. Con la siguiente comparación&lt;br /&gt;
-- basta&lt;br /&gt;
hermanos :: Integral a =&amp;gt; a -&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
hermanos x y = x == 1 || y == 1 || (gcd x y /= 1)&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
hermanadaC :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaC xs = and [hermanos x y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
hermanadaOS :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaOS xs = all (\ (x,y) -&amp;gt; hermanos x y) (zip xs (tail xs))&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
hermanadaR :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaR [] = True&lt;br /&gt;
hermanadaR (x:[]) = True&lt;br /&gt;
hermanadaR (x:y:xs) = (hermanos x y) &amp;amp;&amp;amp; (hermanadaR (y:xs))&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
hermanadaP :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaP xs = foldr (\ (x,y) z -&amp;gt; (hermanos x y) &amp;amp;&amp;amp; z) True (zip xs (tail xs))&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un elemento de una lista es permanente si ninguno de los que&lt;br /&gt;
-- vienen a continuación en la lista es mayor que él. Consideramos la función&lt;br /&gt;
--   permanentes :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (permanentes xs) es la lista de los elementos permanentes de la&lt;br /&gt;
-- lista xs. Por ejemplo,&lt;br /&gt;
--   permanentes [80,1,7,8,4]  ==  [80,8,4]&lt;br /&gt;
&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;tails&amp;#039; de Data.List.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
head_permanente :: Ord a =&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
head_permanente (y:[]) = True&lt;br /&gt;
head_permanente (y:ys) = (maximum ys &amp;lt; y)&lt;br /&gt;
&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
permanentesC :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesC xs = [y | (y:ys) &amp;lt;- tails xs, head_permanente (y:ys)]&lt;br /&gt;
&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)               &lt;br /&gt;
permanentesS :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesS xs = map head (filter head_permanente (init (tails xs)))&lt;br /&gt;
&lt;br /&gt;
-- Por composición de funciones&lt;br /&gt;
permanentesS&amp;#039; :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesS&amp;#039; = (map head) .  (filter head_permanente) .  init . tails&lt;br /&gt;
&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
permanentesR :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesR [] = []&lt;br /&gt;
permanentesR (x:xs)&lt;br /&gt;
  | head_permanente (x:xs) = x:permanentesR xs&lt;br /&gt;
  | otherwise   = permanentesR xs&lt;br /&gt;
&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
permanentesP :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesP xs = foldr (\ys acc -&amp;gt; if head_permanente ys then (head ys):acc else acc) [] (init (tails xs))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Un número entero positivo n es muy primo si es n primo&lt;br /&gt;
-- y todos los números que resultan de ir suprimimiendo la última cifra&lt;br /&gt;
-- también son primos. Por ejemplo, 7193 es muy primo pues los números&lt;br /&gt;
-- 7193, 719, 71 y 7 son todos primos. &lt;br /&gt;
-- &lt;br /&gt;
-- Define la función &lt;br /&gt;
--    muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- que (muyPrimo n) se verifica si n es muy primo. Por ejemplo,&lt;br /&gt;
--    muyPrimo 7193  == True&lt;br /&gt;
--    muyPrimo 71932 == False&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
muyPrimo 0 = True&lt;br /&gt;
muyPrimo n = isPrime n &amp;amp;&amp;amp; (muyPrimo (div n 10))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- ¿Cuántos números de cinco cifras son muy primos?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
-- length $ filter muyPrimo [10^4..(10^5-1)]&lt;br /&gt;
-- &amp;gt; 15&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=528</id>
		<title>Informática (1º Matemáticas)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=528"/>
		<updated>2021-12-10T15:27:16Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: /* Relación de Ejercicios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==Relación de Ejercicios==&lt;br /&gt;
&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Definiciones por composición sobre números, listas y booleanos. [ [[Media:Rel_1.hs |Enunciado]], [[Relación 1 |Solución colaborativa]], [[Relación 1 Sol |Solución]]  ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Definiciones con condicionales, guardas o patrones. [ [[Media:Rel_2.hs |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Relación 2 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión. [ [[Media:Rel_3.hs |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Relación 3 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión (extra). [ [[Media:Rel_4.hs |Enunciado]], [[Relación 4 |Solución colaborativa editada]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión con cadenas: El cifrado césar. [ [[Media:Rel_5.hs |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Relación 5 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión. [ [[Media:Rel_6.hs |Enunciado]], [[Relación 6 |Solución colaborativa]], [[Relación 6 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión y comprensión (extra). [ [[Media:Rel_7.hs |Enunciado]], [[Relación 7 |Solución colaborativa]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados (extra). [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Propiedades del número 2021. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10 |Solución colaborativa]]&amp;lt;!--, [[Relación 10 Sol |Solución ]]--&amp;gt; ]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: El algoritmo de Luhn. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones sobre cadenas. [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos, Árboles binarios. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10|Solución colaborativa]], [[Relación 10 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (II). [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11|Solución colaborativa]], [[Relación 11 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: Listas infinitas y evaluación perezosa. [ [[Media:Rel_13.hs |Enunciado]], [[Relación 13 |Solución colaborativa]], [[Relación 13 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la programación funcional con listas infinitas. [ [[Media:Rel_14.hs |Enunciado]], [[Relación 14 colab|Solución colaborativa]], [[Relación 14|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: Ecuación con factoriales. [ [[Media:Rel_15.hs |Enunciado]], [[Relación 15 colab |Solución colaborativa]], [[Relación 15 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 16&amp;#039;&amp;#039;&amp;#039;: El juego del nim y las funciones de entrada/salida. [ [[Media:Rel_16.hs |Enunciado]], [[Relación 16 colab|Solución colaborativa]], [[Relación 16 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 17&amp;#039;&amp;#039;&amp;#039;: Cálculo del número pi mediante el método de Montecarlo. [ [[Media:Rel_17.hs |Enunciado]], [[Relación 17 |Solución colaborativa]], [[Rel 17 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 18&amp;#039;&amp;#039;&amp;#039;: Aproximaciones de pi. [ [[Media:Rel_18.hs |Enunciado]], [http://www.cs.us.es/~mjoseh/Digitos_de_pi.txt Fichero con los dígitos de pi], [[Relación 18 |Solución colaborativa]], [[Rel 18 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 19&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices. [ [[Media:Rel_19.hs |Enunciado]], [[Relación 19 |Solución colaborativa]], [[Relación 19 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Método de Gauss para triangularizar matrices. [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 |Solución colaborativa]], [[Relación 20 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 21&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices con librerías Data.Matrix y Data.Vector. [ [[Media:Rel_21.hs |Enunciado]], [[Relación 21 |Solución colaborativa]], [[Relación 21 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 22&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices: ejercicios de exámenes (para repasar). [ [[Media:Rel_22.hs |Enunciado]], [[Relación 22 |Solución colaborativa]], [[Relación 22 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 23&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_23.hs |Enunciado]], [[Relación 23 |Solución colaborativa]], [[Relación 23 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico (2): límites, bisección, integrales y bajada. [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva. [ [[Media:Rel_25.hs |Enunciado]], [[Relación 25 |Solución colaborativa]], [[Relación 25 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 26&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva con librerías (solucionada). [ [[Relación 26 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 27&amp;#039;&amp;#039;&amp;#039;: Combinatoria. [ [[Media:Rel_27.hs |Enunciado]], [[Relación 27 |Solución colaborativa]], [[Relación 27 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: El TAD de las pilas.  [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 |Solución colaborativa]], [[Relación 28 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de las colas.  [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 |Solución colaborativa]], [[Relación 29 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de conjuntos.  [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 colab |Solución colaborativa]], [[Relación 31 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 32&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. Regla de Ruffini. [ [[Media:Rel_32.hs |Enunciado]], [[Relación 32 colab |Solución colaborativa]], [[Relación 32 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g1.hs |Enunciado]], [[Exam 3g1 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g2.hs |Enunciado]], [[Exam 3g2 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de los montículos. Librería en https://cutt.ly/tbDyRlr [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Media:Relación_33_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Media:Relación_34_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería Data.Set. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 |Solución colaborativa]], [[Media:Relación_35_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 36&amp;#039;&amp;#039;&amp;#039;: Problemas básicos con el TAD de los grafos. [ [[Media:Rel_36.hs |Enunciado]], [[Relación 36 Colab |Solución colaborativa]], [[Media:Relación_36_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante listas. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica I&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_1.hs |Enunciado]], [[Programación dinámica I |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica II&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_2.hs |Enunciado]], [[Programación Dinámica II |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Grafos&amp;#039;&amp;#039;&amp;#039;: Ejercicios de examen sobre grafos. ([[Media:masgrafos.hs |Enunciado]], [[Grafos (Ej. examen) |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Técnica Divide y vencerás&amp;#039;&amp;#039;&amp;#039;: Puzzle. ([[Media:triomino.hs |Enunciado]], [[Triominos |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica III&amp;#039;&amp;#039;&amp;#039;: Ejercicios de programación dinámica. ([[Media:dinamica3_3.hs |Enunciado]], [[Programación Dinámica III |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso I&amp;#039;&amp;#039;&amp;#039;. ([[Media:Lychrel.hs |Enunciado]], [[Repaso I. Números de Lychrel |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso II: ejercicios de examen&amp;#039;&amp;#039;&amp;#039;. ([[Media:ejExamenes.hs |Enunciado]], [[Repaso II.  |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios Complementarios.&amp;#039;&amp;#039;&amp;#039;([[Media:ejcomplementarios.hs |Enunciado]], [[Ejercicios Complementarios|Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Más ejercicios de examen.&amp;#039;&amp;#039;&amp;#039;([[Media:ejExam.hs |Enunciado]], [[Ejercicios de examen|Solución colaborativa]]).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;!-- EJERCICIOS DEL CURSO PASADO&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Ejercicios de exámenes sobre grafos. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 Colab |Solución colaborativa]], [[Relación 37 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~mjoseh/cursos/i1m-20/doc/manual-Data.Set.html Data.Set]. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Relación 34 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico en Maxima: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_25.mac |Enunciado]], [[Relación 25 |Solución colaborativa]] [[Relación 25 Sol |Solución]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/manual-Data.Set.html Data.Set] (erratas solucionadas). [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 colab |Solución colaborativa]], [[Relación 28 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: División y factorización de polinomios mediante la regla de Ruffini. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Caminos en una retícula. [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Apilamiento de barriles. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 |Solución colaborativa]], [[Relación 31 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante diccionarios. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 Colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de los multiconjuntos mediante diccionarios. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: El problema del granjero mediante búsqueda en espacio de estado. [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Relación 33 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Resolución de problemas mediante búsqueda en espacios de estados. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 colab |Solución colaborativa]], [[Relación 35 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados de repaso.  [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 colab |Solución colaborativa]] ]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Curso Actual==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 1&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(12/11/2021)&amp;#039;&amp;#039;: [ [[Media:Exam1_G2.hs |Enunciado]], [[Parcial 1 |Solución colaborativa]], [[Parcial 1 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 2&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(20/01/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 3&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(08/04/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 4&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(10/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 5&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(24/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Cursos Anteriores==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://github.com/jaalonso/Examenes_de_PF_con_Haskell/blob/master/README.org Repositorio de Exámenes]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Curso 2020/21 Grupo 2&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 11/12/20 |Examen 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(11/12/2020)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 16/02/21 |Examen 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(16/02/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 23/04/21 |Examen 3 Turno 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(23/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 28/04/21 |Examen 3 Turno 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(28/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 21/06/21 |Examen 4]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(21/06/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 05/07/2021 |Examen Julio]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(05/07/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 07/09/2021 |Examen Septiembre]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(07/09/2021)&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8_Sol&amp;diff=516</id>
		<title>Relación 8 Sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8_Sol&amp;diff=516"/>
		<updated>2021-12-08T08:58:00Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Rel_8_sol.hs&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados.&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Esta relación tiene contiene ejercicios con funciones de orden&lt;br /&gt;
-- superior y definiciones por plegado correspondientes al tema 7 &lt;br /&gt;
-- http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-7.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías auxiliares                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función&lt;br /&gt;
--    segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (segmentos p xs) es la lista de los segmentos de xs cuyos&lt;br /&gt;
-- elementos verifican la propiedad p. Por ejemplo,&lt;br /&gt;
--    segmentos even [1,2,0,4,9,6,4,5,7,2]  ==  [[2,0,4],[6,4],[2]]&lt;br /&gt;
--    segmentos odd  [1,2,0,4,9,6,4,5,7,2]  ==  [[1],[9],[5,7]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentos _ [] = []&lt;br /&gt;
segmentos p (x:xs) &lt;br /&gt;
    | p x       = takeWhile p (x:xs) : segmentos p (dropWhile p xs)&lt;br /&gt;
    | otherwise = segmentos p xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir, por comprensión, la función&lt;br /&gt;
--    relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosC r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC r xs = and [r x y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir, por recursión, la función&lt;br /&gt;
--    relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosR r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosR (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosR (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR r (x:y:zs) = r x y &amp;amp;&amp;amp; relacionadosR r (y:zs)&lt;br /&gt;
relacionadosR _ _        = True&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir la función&lt;br /&gt;
--    agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (agrupa xss) es la lista de las listas obtenidas agrupando&lt;br /&gt;
-- los primeros elementos, los segundos, ... Por ejemplo, &lt;br /&gt;
--    agrupa [[1..6],[7..9],[10..20]]  ==  [[1,7,10],[2,8,11],[3,9,12]]&lt;br /&gt;
--    agrupa []                        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
agrupa []  = []&lt;br /&gt;
agrupa xss&lt;br /&gt;
    | [] `elem` xss = []&lt;br /&gt;
    | otherwise     = primeros xss : agrupa (restos xss)&lt;br /&gt;
    where primeros = map head&lt;br /&gt;
          restos   = map tail&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Comprobar con QuickChek que la longitud de todos los&lt;br /&gt;
-- elementos de (agrupa xs) es igual a la longitud de xs.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_agrupa :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_agrupa xss =&lt;br /&gt;
    and [length xs == n | xs &amp;lt;- agrupa xss]&lt;br /&gt;
    where n = length xss&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_agrupa&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
comprueba_agrupa :: IO ()&lt;br /&gt;
comprueba_agrupa =&lt;br /&gt;
  quickCheck prop_agrupa&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. Definir, por recursión, la función &lt;br /&gt;
--    concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatR xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatR [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatR []       = []&lt;br /&gt;
concatR (xs:xss) = xs ++ concatR xss&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. Definir, por comprensión, la función&lt;br /&gt;
--    filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaC f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaC (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaC f p xs = [f x | x &amp;lt;- xs, p x]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir, usando map y filter, la función&lt;br /&gt;
--    filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaMF f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaMF (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaMF f p xs = map f (filter p xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir, por recursión, la función&lt;br /&gt;
--    filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaR f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaR (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaR _ _ [] = []&lt;br /&gt;
filtraAplicaR f p (x:xs) | p x       = f x : filtraAplicaR f p xs&lt;br /&gt;
                         | otherwise = filtraAplicaR f p xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Definir, mediante recursión, la función&lt;br /&gt;
--    maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumR [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumR [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumR [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumR es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumR [x]      = x&lt;br /&gt;
maximumR (x:y:ys) = max x (maximumR (y:ys))&lt;br /&gt;
maximumR _        = error &amp;quot;Imposible&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. La función de plegado foldr1 está definida por &lt;br /&gt;
--    foldr1 :: (a -&amp;gt; a -&amp;gt; a) -&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
--    foldr1 _ [x]    =  x&lt;br /&gt;
--    foldr1 f (x:xs) =  f x (foldr1 f xs)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir, mediante plegado con foldr1, la función&lt;br /&gt;
--    maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumP [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumP [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumP [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumP es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumP = foldr1 max&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir, usando foldr, la función &lt;br /&gt;
--    concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatP xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatP [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatP = foldr (++) []&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que la funciones concatR,&lt;br /&gt;
-- concatP y concat son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_concat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_concat xss =&lt;br /&gt;
  concatR xss == ys &amp;amp;&amp;amp; concatP xss == ys&lt;br /&gt;
  where ys = concat xss&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_concat&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que la longitud de &lt;br /&gt;
-- (concatP xss) es la suma de las longitudes de los elementos de xss.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_longConcat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_longConcat xss =&lt;br /&gt;
    length (concatP xss) == sum [length xs | xs &amp;lt;- xss]&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_longConcat&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir, por plegado, la función&lt;br /&gt;
--    filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaP f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaP (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaP f p = foldr g []&lt;br /&gt;
    where g x y | p x       = f x : y&lt;br /&gt;
                | otherwise = y&lt;br /&gt;
&lt;br /&gt;
-- La definición por plegado usando lambda es&lt;br /&gt;
filtraAplicaP2 :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaP2 f p = &lt;br /&gt;
    foldr (\x y -&amp;gt; if p x then f x : y else y) []&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, con la función all, la función&lt;br /&gt;
--    relacionadosA :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosA r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosA (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosA (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1ª solución&lt;br /&gt;
-- Redefinir la relación &amp;#039;r&amp;#039; con &amp;#039;rpar&amp;#039; para que se aplique a pares&lt;br /&gt;
relacionadosA :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosA r xs = all rpar (zip xs (tail xs))&lt;br /&gt;
  where rpar (x,y) = r x y&lt;br /&gt;
&lt;br /&gt;
-- 2ª solución. La función uncurry hace esa conversión, de función&lt;br /&gt;
-- con dos argumentos a función que recibe un par&lt;br /&gt;
relacionadosA&amp;#039; :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosA&amp;#039; r xs = all (uncurry r) (zip xs (tail xs))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, con la función foldr, la función&lt;br /&gt;
--    relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosP r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosP (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosP (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1ª solución&lt;br /&gt;
relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosP r xs = foldr rfpar True (zip xs (tail xs))&lt;br /&gt;
  where rfpar (x,y) b = (r x y) &amp;amp;&amp;amp; b&lt;br /&gt;
&lt;br /&gt;
-- 2ª solución, sin usar el zip, y $ es igual que poner paréntesis hasta&lt;br /&gt;
-- el final de la línea&lt;br /&gt;
relacionadosP&amp;#039; :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosP&amp;#039; r xs = snd $ foldr rfpar (last xs,True) (init xs)&lt;br /&gt;
  where rfpar x (y,b) = (x,(r x y) &amp;amp;&amp;amp; b)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.3. (Basado en el ejercicio 4 del primer parcial)&lt;br /&gt;
-- Una lista se dirá muy creciente si cada elemento es mayor estricto&lt;br /&gt;
-- que el triple del anterior. &lt;br /&gt;
-- Empleando tan solo (relacionadosA p xs), define el predicado &lt;br /&gt;
--          muyCreciente :: [Integer] -&amp;gt; Bool&lt;br /&gt;
-- tal que (muyCreciente xs) se verifica si xs es muy creciente. Por&lt;br /&gt;
-- ejemplo:&lt;br /&gt;
-- muyCreciente [1,5,23,115]  == True&lt;br /&gt;
-- muyCreciente [1,2,7,14]    == False&lt;br /&gt;
-- muyCreciente [7]           == True&lt;br /&gt;
-- muyCreciente []            == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
muyCreciente :: [Integer] -&amp;gt; Bool&lt;br /&gt;
muyCreciente xs = relacionadosA relMuyCreciente xs&lt;br /&gt;
  where relMuyCreciente a b = b &amp;gt; a*3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=515</id>
		<title>Informática (1º Matemáticas)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=515"/>
		<updated>2021-12-08T08:42:06Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: /* Relación de Ejercicios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==Relación de Ejercicios==&lt;br /&gt;
&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Definiciones por composición sobre números, listas y booleanos. [ [[Media:Rel_1.hs |Enunciado]], [[Relación 1 |Solución colaborativa]], [[Relación 1 Sol |Solución]]  ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Definiciones con condicionales, guardas o patrones. [ [[Media:Rel_2.hs |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Relación 2 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión. [ [[Media:Rel_3.hs |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Relación 3 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión (extra). [ [[Media:Rel_4.hs |Enunciado]], [[Relación 4 |Solución colaborativa editada]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión con cadenas: El cifrado césar. [ [[Media:Rel_5.hs |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Relación 5 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión. [ [[Media:Rel_6.hs |Enunciado]], [[Relación 6 |Solución colaborativa]], [[Relación 6 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión y comprensión (extra). [ [[Media:Rel_7.hs |Enunciado]], [[Relación 7 |Solución colaborativa]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados (extra). [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Propiedades del número 2021. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10 |Solución colaborativa]]&amp;lt;!--, [[Relación 10 Sol |Solución ]]--&amp;gt; ]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: El algoritmo de Luhn. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones sobre cadenas. [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos, Árboles binarios. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10|Solución colaborativa]], [[Relación 10 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (II). [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11|Solución colaborativa]], [[Relación 11 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: Listas infinitas y evaluación perezosa. [ [[Media:Rel_13.hs |Enunciado]], [[Relación 13 |Solución colaborativa]], [[Relación 13 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la programación funcional con listas infinitas. [ [[Media:Rel_14.hs |Enunciado]], [[Relación 14 colab|Solución colaborativa]], [[Relación 14|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: Ecuación con factoriales. [ [[Media:Rel_15.hs |Enunciado]], [[Relación 15 colab |Solución colaborativa]], [[Relación 15 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 16&amp;#039;&amp;#039;&amp;#039;: El juego del nim y las funciones de entrada/salida. [ [[Media:Rel_16.hs |Enunciado]], [[Relación 16 colab|Solución colaborativa]], [[Relación 16 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 17&amp;#039;&amp;#039;&amp;#039;: Cálculo del número pi mediante el método de Montecarlo. [ [[Media:Rel_17.hs |Enunciado]], [[Relación 17 |Solución colaborativa]], [[Rel 17 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 18&amp;#039;&amp;#039;&amp;#039;: Aproximaciones de pi. [ [[Media:Rel_18.hs |Enunciado]], [http://www.cs.us.es/~mjoseh/Digitos_de_pi.txt Fichero con los dígitos de pi], [[Relación 18 |Solución colaborativa]], [[Rel 18 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 19&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices. [ [[Media:Rel_19.hs |Enunciado]], [[Relación 19 |Solución colaborativa]], [[Relación 19 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Método de Gauss para triangularizar matrices. [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 |Solución colaborativa]], [[Relación 20 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 21&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices con librerías Data.Matrix y Data.Vector. [ [[Media:Rel_21.hs |Enunciado]], [[Relación 21 |Solución colaborativa]], [[Relación 21 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 22&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices: ejercicios de exámenes (para repasar). [ [[Media:Rel_22.hs |Enunciado]], [[Relación 22 |Solución colaborativa]], [[Relación 22 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 23&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_23.hs |Enunciado]], [[Relación 23 |Solución colaborativa]], [[Relación 23 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico (2): límites, bisección, integrales y bajada. [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva. [ [[Media:Rel_25.hs |Enunciado]], [[Relación 25 |Solución colaborativa]], [[Relación 25 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 26&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva con librerías (solucionada). [ [[Relación 26 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 27&amp;#039;&amp;#039;&amp;#039;: Combinatoria. [ [[Media:Rel_27.hs |Enunciado]], [[Relación 27 |Solución colaborativa]], [[Relación 27 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: El TAD de las pilas.  [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 |Solución colaborativa]], [[Relación 28 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de las colas.  [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 |Solución colaborativa]], [[Relación 29 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de conjuntos.  [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 colab |Solución colaborativa]], [[Relación 31 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 32&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. Regla de Ruffini. [ [[Media:Rel_32.hs |Enunciado]], [[Relación 32 colab |Solución colaborativa]], [[Relación 32 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g1.hs |Enunciado]], [[Exam 3g1 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g2.hs |Enunciado]], [[Exam 3g2 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de los montículos. Librería en https://cutt.ly/tbDyRlr [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Media:Relación_33_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Media:Relación_34_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería Data.Set. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 |Solución colaborativa]], [[Media:Relación_35_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 36&amp;#039;&amp;#039;&amp;#039;: Problemas básicos con el TAD de los grafos. [ [[Media:Rel_36.hs |Enunciado]], [[Relación 36 Colab |Solución colaborativa]], [[Media:Relación_36_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante listas. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica I&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_1.hs |Enunciado]], [[Programación dinámica I |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica II&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_2.hs |Enunciado]], [[Programación Dinámica II |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Grafos&amp;#039;&amp;#039;&amp;#039;: Ejercicios de examen sobre grafos. ([[Media:masgrafos.hs |Enunciado]], [[Grafos (Ej. examen) |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Técnica Divide y vencerás&amp;#039;&amp;#039;&amp;#039;: Puzzle. ([[Media:triomino.hs |Enunciado]], [[Triominos |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica III&amp;#039;&amp;#039;&amp;#039;: Ejercicios de programación dinámica. ([[Media:dinamica3_3.hs |Enunciado]], [[Programación Dinámica III |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso I&amp;#039;&amp;#039;&amp;#039;. ([[Media:Lychrel.hs |Enunciado]], [[Repaso I. Números de Lychrel |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso II: ejercicios de examen&amp;#039;&amp;#039;&amp;#039;. ([[Media:ejExamenes.hs |Enunciado]], [[Repaso II.  |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios Complementarios.&amp;#039;&amp;#039;&amp;#039;([[Media:ejcomplementarios.hs |Enunciado]], [[Ejercicios Complementarios|Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Más ejercicios de examen.&amp;#039;&amp;#039;&amp;#039;([[Media:ejExam.hs |Enunciado]], [[Ejercicios de examen|Solución colaborativa]]).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;!-- EJERCICIOS DEL CURSO PASADO&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Ejercicios de exámenes sobre grafos. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 Colab |Solución colaborativa]], [[Relación 37 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~mjoseh/cursos/i1m-20/doc/manual-Data.Set.html Data.Set]. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Relación 34 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico en Maxima: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_25.mac |Enunciado]], [[Relación 25 |Solución colaborativa]] [[Relación 25 Sol |Solución]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/manual-Data.Set.html Data.Set] (erratas solucionadas). [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 colab |Solución colaborativa]], [[Relación 28 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: División y factorización de polinomios mediante la regla de Ruffini. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Caminos en una retícula. [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Apilamiento de barriles. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 |Solución colaborativa]], [[Relación 31 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante diccionarios. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 Colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de los multiconjuntos mediante diccionarios. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: El problema del granjero mediante búsqueda en espacio de estado. [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Relación 33 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Resolución de problemas mediante búsqueda en espacios de estados. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 colab |Solución colaborativa]], [[Relación 35 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados de repaso.  [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 colab |Solución colaborativa]] ]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Curso Actual==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 1&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(12/11/2021)&amp;#039;&amp;#039;: [ [[Media:Exam1_G2.hs |Enunciado]], [[Parcial 1 |Solución colaborativa]], [[Parcial 1 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 2&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(20/01/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 3&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(08/04/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 4&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(10/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 5&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(24/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Cursos Anteriores==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://github.com/jaalonso/Examenes_de_PF_con_Haskell/blob/master/README.org Repositorio de Exámenes]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Curso 2020/21 Grupo 2&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 11/12/20 |Examen 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(11/12/2020)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 16/02/21 |Examen 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(16/02/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 23/04/21 |Examen 3 Turno 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(23/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 28/04/21 |Examen 3 Turno 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(28/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 21/06/21 |Examen 4]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(21/06/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 05/07/2021 |Examen Julio]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(05/07/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 07/09/2021 |Examen Septiembre]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(07/09/2021)&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10_Sol&amp;diff=514</id>
		<title>Relación 10 Sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10_Sol&amp;diff=514"/>
		<updated>2021-12-08T08:41:33Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Protegió «Relación 10 Sol» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
-- I1M 2021-22: Relación 10&lt;br /&gt;
-- Propiedades del número 2021.&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- En esta relación se presentan ejercicios sobre propiedades del número&lt;br /&gt;
-- 2021.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import Data.List&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Consideramos todos los primos menores que 100:&lt;br /&gt;
--    2, 3, 5, 7, 11, ..., 89, 97&lt;br /&gt;
-- y formamos los correspondientes pares de dominó:&lt;br /&gt;
--    (2,3), (3,5), (5,7), ..., (83,89), (89,97).&lt;br /&gt;
-- La suma de los números en todos los pares es 2021.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDominoPrimos n) es la suma de los números de los pares&lt;br /&gt;
-- de dominó formada a partir de los primos menores que n. Por ejemplo,&lt;br /&gt;
--    sumaDominoPrimos 100 == 2021&lt;br /&gt;
--    sumaDominoPrimos 200 == 8253&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos n = sum (zipWith (+) ps (tail ps))&lt;br /&gt;
  where ps = takeWhile (&amp;lt;=n) primes&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la constante&lt;br /&gt;
--   sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
-- tal que sucSumaDominoPrimos es la sucesión de los números que son&lt;br /&gt;
-- suma de pares de dominó formado con números primos. Por ejemplo,&lt;br /&gt;
--   λ&amp;gt; take 25 sucSumaDominoPrimos&lt;br /&gt;
--   [5,13,25,43,67,97,133,175,227,287,355,433,517,607,707,819,939,1067,&lt;br /&gt;
--    1205,1349,1501,1663,1835,2021,2219]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos = tail (map sumaDominoPrimos primes)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la sucesión&lt;br /&gt;
--   esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumaDominoPrimos n) se verifica si n es un número de la&lt;br /&gt;
-- sucesión anterior. Por ejemplo,&lt;br /&gt;
--  esSumaDominoPrimos 2021    == True&lt;br /&gt;
--  esSumaDominoPrimos 1234509 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos n = n == head (dropWhile (&amp;lt;n) sucSumaDominoPrimos)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. El número 2021 es la suma de 33 más la suma de los 33&lt;br /&gt;
-- primeros números primos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumSumaPrimos n) es la suma de n más los n primeros números&lt;br /&gt;
-- primos. Por ejemplo,&lt;br /&gt;
--   sumSumaPrimos 33 == 2021&lt;br /&gt;
--   sumSumaPrimos 52 == 5641&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
sumSumaPrimos n = fromIntegral n + sum (take n primes)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir la función&lt;br /&gt;
--    esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumSumaPrimos n) se verifica si n es de la suma de m más&lt;br /&gt;
-- los m primeros primos, para algún entero m. Por ejemplo,&lt;br /&gt;
--    esSumSumaPrimos 2021       == True&lt;br /&gt;
--    esSumSumaPrimos 120        == False&lt;br /&gt;
--    esSumSumaPrimos 1234567893 == False&lt;br /&gt;
--    esSumSumaPrimos 774511387  == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1ª solución&lt;br /&gt;
-- ===========&lt;br /&gt;
&lt;br /&gt;
esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumSumaPrimos n = n == head (dropWhile (&amp;lt;n) sucSumSumaPrimos)&lt;br /&gt;
&lt;br /&gt;
-- sucSumSumaPrimos es la lista de los números de la forma m más la suma&lt;br /&gt;
-- de los m primeros primos. Por ejemplo,&lt;br /&gt;
--    take 18 sucSumSumaPrimos&lt;br /&gt;
--    [3,7,13,21,33,47,65,85,109,139,171,209,251,295,343,397,457,519]&lt;br /&gt;
sucSumSumaPrimos :: [Integer]&lt;br /&gt;
sucSumSumaPrimos = map sumSumaPrimos [1..]&lt;br /&gt;
&lt;br /&gt;
-- 2ª solución&lt;br /&gt;
-- ===========&lt;br /&gt;
&lt;br /&gt;
esSumSumaPrimos2 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumSumaPrimos2 n = n == head (dropWhile (&amp;lt;n) sucSumSumaPrimos2)&lt;br /&gt;
&lt;br /&gt;
sucSumSumaPrimos2 :: [Integer]&lt;br /&gt;
sucSumSumaPrimos2 = zipWith (+) [1..] (scanl1 (+) primes)&lt;br /&gt;
&lt;br /&gt;
-- Comparación de eficiencia:&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
-- La comparación es&lt;br /&gt;
--    λ&amp;gt; esSumSumaPrimos 123456789  == False&lt;br /&gt;
--    (11.60 secs, 34,680,466,648 bytes)&lt;br /&gt;
--    λ&amp;gt; esSumSumaPrimos2 123456789 == False&lt;br /&gt;
--    (0.01 secs, 11,300,288 bytes)&lt;br /&gt;
--&lt;br /&gt;
--    λ&amp;gt; esSumSumaPrimos 774511387  == True&lt;br /&gt;
--    (83.50 secs, 234,694,973,880 bytes)&lt;br /&gt;
--    λ&amp;gt; esSumSumaPrimos2 774511387 == True&lt;br /&gt;
--    (0.03 secs, 42,326,032 bytes)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Un número semiprimo es un número natural que es producto&lt;br /&gt;
-- de dos números primos no necesariamente distintos. Por ejemplo, 26 es&lt;br /&gt;
-- semiprimo (porque 26 = 2×13) y 49 también lo es (porque 49 = 7×7).&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    semiprimos  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esSemiprimo n) se verifica si n es semiprimo. Por ejemplo,&lt;br /&gt;
--      esSemiprimo 26          ==  True&lt;br /&gt;
--      esSemiprimo 49          ==  True&lt;br /&gt;
--      esSemiprimo 8           ==  False&lt;br /&gt;
--      esSemiprimo 2021        ==  True&lt;br /&gt;
--      esSemiprimo (21+10^14)  ==  True&lt;br /&gt;
-- + semiprimos es la sucesión de números semiprimos. Por ejemplo,&lt;br /&gt;
--      take 10 semiprimos   ==  [4,6,9,10,14,15,21,22,25,26]&lt;br /&gt;
--      semiprimos !! 580    ==  2021&lt;br /&gt;
--      semiprimos !! 10000  ==  40886&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1ª definición&lt;br /&gt;
-- =============&lt;br /&gt;
&lt;br /&gt;
esSemiprimo1 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo1 n = any prop ps&lt;br /&gt;
  where ps = takeWhile (&amp;lt;= (n `div` 2)) primes&lt;br /&gt;
        prop q = r == 0 &amp;amp;&amp;amp; isPrime d&lt;br /&gt;
          where (d,r) = quotRem n q&lt;br /&gt;
&lt;br /&gt;
semiprimos1 :: [Integer]&lt;br /&gt;
semiprimos1 = filter esSemiprimo1 [4..]&lt;br /&gt;
&lt;br /&gt;
-- 2ª definición&lt;br /&gt;
-- =============&lt;br /&gt;
&lt;br /&gt;
esSemiprimo2 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo2 n = length (primeFactors n) == 2&lt;br /&gt;
&lt;br /&gt;
semiprimos2 :: [Integer]&lt;br /&gt;
semiprimos2 = filter esSemiprimo2 [4..]&lt;br /&gt;
&lt;br /&gt;
-- Comparación de eficiencia&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
-- La comparación es&lt;br /&gt;
--    λ&amp;gt; semiprimos1 !! 1000  == 3599&lt;br /&gt;
--    (0.52 secs, 1,041,413,376 bytes)&lt;br /&gt;
--    λ&amp;gt; semiprimos2 !! 1000 == 3599&lt;br /&gt;
--    (0.04 secs, 51,977,912 bytes)&lt;br /&gt;
&lt;br /&gt;
-- Por tanto:&lt;br /&gt;
&lt;br /&gt;
esSemiprimo = esSemiprimo2&lt;br /&gt;
semiprimos  = semiprimos2&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Un número natural n es un número entero Blum si&lt;br /&gt;
-- n = p × q es un semiprimo para el que p y q son distintos primos&lt;br /&gt;
-- congruentes con 3 módulo 4. Es decir, p y q tienen que ser de la&lt;br /&gt;
-- forma 4 t + 3, para algún número entero t. Los números enteros de&lt;br /&gt;
-- esta forma se denominan números primos de Blum.  Los primeros enteros&lt;br /&gt;
-- de Blum son&lt;br /&gt;
--    21, 33, 57, 69, 77, 93, 129, 133, 141, 161, 177, ...&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBlum  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBlum n) se verifica si n es un número de Blum. Por ejemplo,&lt;br /&gt;
--      esBlum 26          ==  False&lt;br /&gt;
--      esBlum 49          ==  False&lt;br /&gt;
--      esBlum 77          ==  True&lt;br /&gt;
--      esBlum 2021        ==  True&lt;br /&gt;
--      esBlum (21+10^14)  ==  True&lt;br /&gt;
-- + sucBlum es la sucesión de números de Blum. Por ejemplo,&lt;br /&gt;
--      take 10 sucBlum  ==  [21,33,57,69,77,93,129,133,141,161]&lt;br /&gt;
--      sucBlum !! 132    ==  2021&lt;br /&gt;
--      sucBlum !! 10000  ==  186821&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
esBlum n = length ps == 2 &amp;amp;&amp;amp; p /= q &amp;amp;&amp;amp; p `rem` 4 == 3 &amp;amp;&amp;amp; q `rem` 4 == 3&lt;br /&gt;
  where ps      = primeFactors n&lt;br /&gt;
        (p:q:_) = ps&lt;br /&gt;
&lt;br /&gt;
sucBlum  :: [Integer]&lt;br /&gt;
sucBlum = filter esBlum [4..]&lt;br /&gt;
&lt;br /&gt;
sucBlum2  :: [Integer]&lt;br /&gt;
sucBlum2 = filter esBlum semiprimos&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Un número semiprimo n = p x q es brillante si p y q&lt;br /&gt;
-- tienen el mismo número de dígitos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBrillantes  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBrillante n) se verifica si n es brillante. Por ejemplo,&lt;br /&gt;
--      esBrillante 26          ==  False&lt;br /&gt;
--      esBrillante 49          ==  True&lt;br /&gt;
--      esBrillante 77          ==  False&lt;br /&gt;
--      esBrillante 2021        ==  True&lt;br /&gt;
--      esBrillante (21+10^14)  ==  False&lt;br /&gt;
-- + sucBrillantes es la sucesión de números brillantes. Por ejemplo,&lt;br /&gt;
--      take 10 sucBrillante   ==  [4,6,9,10,14,15,21,25,35,49]&lt;br /&gt;
--      sucBrillante !! 130    ==  2021&lt;br /&gt;
--      sucBrillante !! 10000  ==  696649&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
esBrillante n = length ps == 2 &amp;amp;&amp;amp; length (show p) == length (show q)&lt;br /&gt;
  where ps = primeFactors n&lt;br /&gt;
        p = head ps&lt;br /&gt;
        q = head (tail ps)&lt;br /&gt;
&lt;br /&gt;
sucBrillante  :: [Integer]&lt;br /&gt;
sucBrillante = filter esBrillante [4..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Un número natural es amable si se puede expresar como&lt;br /&gt;
-- suma de, al menos, dos números naturales consecutivos. Por ejemplo,&lt;br /&gt;
-- 2021 es amable pues&lt;br /&gt;
--    2021 = 20 + 21 + ... + 65 + 66.&lt;br /&gt;
-- La mayoría de los números naturales son amables, por lo que vamos a&lt;br /&gt;
-- calcular la lista de los números no amables.&lt;br /&gt;
--&lt;br /&gt;
-- Los primeros números no amables son&lt;br /&gt;
--    1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192,&lt;br /&gt;
--    16384, 32768, 65536, 131072, 262144&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sucesionesConSuma :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (sucesionesConSuma n) es la lista de los pares formados por&lt;br /&gt;
-- el primero y por el último elemento de las sucesiones de números&lt;br /&gt;
-- naturales consecutivos con suma n. Por ejemplo,&lt;br /&gt;
--    sucesionesConSuma 15             == [(1,5),(4,6),(7,8)]&lt;br /&gt;
--    sucesionesConSuma 2021           == [(20,66),(26,68),(1010,1011)]&lt;br /&gt;
--    length (sucesionesConSuma 2021)  == 3&lt;br /&gt;
--    length (sucesionesConSuma 3000)  == 7&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sucesionesConSuma :: Integer -&amp;gt; [(Integer,Integer)]&lt;br /&gt;
sucesionesConSuma n =&lt;br /&gt;
    [(x,y) | y &amp;lt;- [1..1 + n `div` 2]&lt;br /&gt;
           , x &amp;lt;- [1..y-1]&lt;br /&gt;
           , (x+y)*(y-x+1) == 2*n]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir las funciones&lt;br /&gt;
--    noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucNoAmables :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (noAmable n) se verifica si n es un número no amable. Por ejemplo,&lt;br /&gt;
--    noAmable 2021 == False&lt;br /&gt;
--    noAmable 1024 == True&lt;br /&gt;
-- + sucNoAmables es la lista de números naturales no amables. Por&lt;br /&gt;
--   ejemplo,&lt;br /&gt;
--    take 10 sucNoAmables == [1,2,4,8,16,32,64,128,256,512]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
noAmable n = null (sucesionesConSuma n)&lt;br /&gt;
&lt;br /&gt;
sucNoAmables :: [Integer]&lt;br /&gt;
sucNoAmables = filter noAmable [1..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Comprobar con QuickCheck que un número natural es no&lt;br /&gt;
-- amable si y sólo si es potencia de 2.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
propNoAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
propNoAmable n = noAmable m == esPotencia2 m&lt;br /&gt;
  where m = 1 + abs n&lt;br /&gt;
&lt;br /&gt;
-- (esPotencia2 n) se verifica si n es potencia de 2. Por ejemplo,&lt;br /&gt;
--    esPotencia2 16 == True&lt;br /&gt;
--    esPotencia2 18 == False&lt;br /&gt;
esPotencia2 :: Integer -&amp;gt; Bool&lt;br /&gt;
esPotencia2 0 = False&lt;br /&gt;
esPotencia2 1 = True&lt;br /&gt;
esPotencia2 n = even n &amp;amp;&amp;amp; esPotencia2 (n `div` 2)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    λ&amp;gt; quickCheck propNoAmable&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Un número natural se denomina aritmético si la media&lt;br /&gt;
-- aritmética de sus divisores es un número entero.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esAritmetico n) se verifica si n es un número aritmético.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    esAritmetico 2021 == True&lt;br /&gt;
--    esAritmetico 24   == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
esAritmetico n = sum ds `mod` genericLength ds == 0&lt;br /&gt;
  where ds = divisores n&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- (divisores n) es la lista de los divisores de n. Por ejemplo,&lt;br /&gt;
--    divisores 2021 == [2021,1,43,47]&lt;br /&gt;
divisores :: Integer -&amp;gt; [Integer]&lt;br /&gt;
divisores n = n : [x | x &amp;lt;- [1.. n`div`2], n `rem` x == 0]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que todos los primos excepto&lt;br /&gt;
-- el 2 son aritméticos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
primosAritmeticos :: Int -&amp;gt; Bool&lt;br /&gt;
primosAritmeticos n = all esAritmetico (take n (tail primes))&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    λ&amp;gt; quickCheck primosAritmeticos&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Definir la función&lt;br /&gt;
--    sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (sucAritmeticosConsecutivos n) es una sucesión de n números&lt;br /&gt;
-- aritméticos consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 5&lt;br /&gt;
--    [19,20,21,22,23]&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 20&lt;br /&gt;
--    [4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,&lt;br /&gt;
--     4968,4969,4970,4971,4972,4973,4974]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
sucAritmeticosConsecutivos n =&lt;br /&gt;
  head (filter consecutivos (segmentosLongitud n sucAritmeticos))&lt;br /&gt;
&lt;br /&gt;
-- sucAritmeticos es la sucesión de los números aritméticos. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    take 10 sucAritmeticos == [1,3,5,6,7,11,13,14,15,17]&lt;br /&gt;
sucAritmeticos :: [Integer]&lt;br /&gt;
sucAritmeticos = filter esAritmetico [1..]&lt;br /&gt;
&lt;br /&gt;
-- (segmentosLongitud n xs) es la sucesión de los segmentos de xs de&lt;br /&gt;
-- longitud n. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; segmentosLongitud 2 &amp;quot;Sevilla&amp;quot;&lt;br /&gt;
--    [&amp;quot;Se&amp;quot;,&amp;quot;ev&amp;quot;,&amp;quot;vi&amp;quot;,&amp;quot;il&amp;quot;,&amp;quot;ll&amp;quot;,&amp;quot;la&amp;quot;,&amp;quot;a&amp;quot;,&amp;quot;&amp;quot;]&lt;br /&gt;
--    λ&amp;gt; segmentosLongitud 3 &amp;quot;Sevilla&amp;quot;&lt;br /&gt;
--    [&amp;quot;Sev&amp;quot;,&amp;quot;evi&amp;quot;,&amp;quot;vil&amp;quot;,&amp;quot;ill&amp;quot;,&amp;quot;lla&amp;quot;,&amp;quot;la&amp;quot;,&amp;quot;a&amp;quot;,&amp;quot;&amp;quot;]&lt;br /&gt;
segmentosLongitud :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentosLongitud n xs = map (take n) (tails xs)&lt;br /&gt;
&lt;br /&gt;
-- (consecutivos ns) se verifica si ns es una lista de números&lt;br /&gt;
-- consecutivos. Por ejemplo,&lt;br /&gt;
--    consecutivos [4,5,6] == True&lt;br /&gt;
--    consecutivos [4,5,7] == False&lt;br /&gt;
consecutivos :: [Integer] -&amp;gt; Bool&lt;br /&gt;
consecutivos ns = all (==1) (zipWith (-) (tail ns) ns)&lt;br /&gt;
&lt;br /&gt;
-- Otra definición de consecutivos es&lt;br /&gt;
consecutivos2 :: [Integer] -&amp;gt; Bool&lt;br /&gt;
consecutivos2 ns = ns == [minimum ns .. maximum ns]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. El número 2021 tiene las propiedades siguientes:&lt;br /&gt;
-- + sumándole su inverso es un número palíndromo: 2021 + 1202 = 3223&lt;br /&gt;
-- + multiplicándolo por su inverso también lo es: 2021 * 1202 = 2429242&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (masInvPalindromo n) se verifica si n más su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--     masInvPalindromo 2021  == True&lt;br /&gt;
--      masInvPalindromo 109   == False&lt;br /&gt;
-- + (prodInvPalindromo n) se verifica si n por su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--      prodInvPalindromo 2021 == True&lt;br /&gt;
--      prodInvPalindromo 1097 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
masInvPalindromo n = palindromo (n + inversoN n)&lt;br /&gt;
&lt;br /&gt;
-- (inversoN x) es el número obtenido invirtiendo los dígitos de x. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    inversoN 2021 == 1202&lt;br /&gt;
inversoN :: Integer -&amp;gt; Integer&lt;br /&gt;
inversoN = read . reverse . show&lt;br /&gt;
&lt;br /&gt;
-- (palindromo n) se verifica si n es un palíndromo. Por ejemplo,&lt;br /&gt;
--    palindromo 23532 == True&lt;br /&gt;
--    palindromo 23352 == False&lt;br /&gt;
palindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
palindromo n = show n == reverse (show n)&lt;br /&gt;
&lt;br /&gt;
prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
prodInvPalindromo n = palindromo (n * inversoN n)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2.. Comprobar con QuickCheck que todo número&lt;br /&gt;
-- prodInvPalindromo es masInvPalindromo.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
propInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
propInvPalindromo n = not (prodInvPalindromo m) || masInvPalindromo m&lt;br /&gt;
  where m = 1 + abs n&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    λ&amp;gt; quickCheck propInvPalindromo&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Comprobar que el número 2021 es el menor  número&lt;br /&gt;
-- natural que verifica las siguientes propiedades:&lt;br /&gt;
--  (+) es la concatenación de dos enteros consecutivos (20 y 21)&lt;br /&gt;
--  (+) es el producto de dos primos consecutivos (43 y 47)&lt;br /&gt;
--&lt;br /&gt;
-- Para ello, definir las funciones&lt;br /&gt;
--    esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    especiales :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esConcatConsecutivos n) se verifica si n es la concatenación de&lt;br /&gt;
--   dos enteros consecutivos. Por ejemplo,&lt;br /&gt;
--      esConcatConsecutivos 2021 == True&lt;br /&gt;
-- + (esProdprimosConsecutivos n) se verifica si n es el producto de dos&lt;br /&gt;
--   primos consecutivos&lt;br /&gt;
--      esProdprimosConsecutivos 2021 == True&lt;br /&gt;
-- + espaciales es la lista de números naturales que verifican las dos&lt;br /&gt;
--   propiedaes anteriores&lt;br /&gt;
--      head especiales == 2021&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- esConcatConsecutivos&lt;br /&gt;
-- ====================&lt;br /&gt;
&lt;br /&gt;
esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esConcatConsecutivos n =&lt;br /&gt;
  n == head (dropWhile (&amp;lt;n) concatEnterosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
-- concatEnterosConsecutivos es la lista de números obtenidos&lt;br /&gt;
-- concatenando dos enteros consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; take 10 concatEnterosConsecutivos&lt;br /&gt;
--    [12,23,34,45,56,67,78,89,910,1011]&lt;br /&gt;
concatEnterosConsecutivos :: [Integer]&lt;br /&gt;
concatEnterosConsecutivos = zipWith pegaNumeros xs (tail xs)&lt;br /&gt;
  where xs = [1..]&lt;br /&gt;
&lt;br /&gt;
-- (pegaNumeros n m) es el número otenido añadiendo los dígitos de m a&lt;br /&gt;
-- continuación de los de n. Por ejemplo,&lt;br /&gt;
--    pegaNumeros 23 416 == 23416&lt;br /&gt;
pegaNumeros :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
pegaNumeros n m = read (show n ++ show m)&lt;br /&gt;
&lt;br /&gt;
-- esProdprimosConsecutivos&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esProdprimosConsecutivos n =&lt;br /&gt;
  n == head (dropWhile (&amp;lt;n) productoPrimosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
-- productoPrimosConsecutivos es la sucesión de los números que son&lt;br /&gt;
-- productos de dos primos consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; take 20 productoPrimosConsecutivos&lt;br /&gt;
--    [6,15,35,77,143,221,323,437,667,899,1147,1517,1763,2021,2491,3127,&lt;br /&gt;
--     3599,4087,4757,5183]&lt;br /&gt;
productoPrimosConsecutivos :: [Integer]&lt;br /&gt;
productoPrimosConsecutivos =&lt;br /&gt;
  zipWith (*) primes (tail primes)&lt;br /&gt;
&lt;br /&gt;
-- especiales&lt;br /&gt;
-- ==========&lt;br /&gt;
&lt;br /&gt;
especiales :: [Integer]&lt;br /&gt;
especiales = [n | n &amp;lt;- productoPrimosConsecutivos&lt;br /&gt;
                , esConcatConsecutivos n]&lt;br /&gt;
&lt;br /&gt;
-- concatPrimos es la lista de números obtenidos concatenando dos primos&lt;br /&gt;
-- consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; take 20 concatPrimos&lt;br /&gt;
--    [23,35,57,711,1113,1317,1719,1923,2329,2931,3137,3741,4143,4347,4753,&lt;br /&gt;
--     5359,5961,6167,6771,7173]&lt;br /&gt;
concatPrimos :: [Integer]&lt;br /&gt;
concatPrimos = zipWith pegaNumeros primes (tail primes)&lt;br /&gt;
&lt;br /&gt;
-- Primer número especial:&lt;br /&gt;
--    head especiales == 2021&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10_Sol&amp;diff=513</id>
		<title>Relación 10 Sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10_Sol&amp;diff=513"/>
		<updated>2021-12-08T08:41:25Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Página creada con «&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt; -- I1M 2021-22: Relación 10 -- Propiedades del número 2021. -- Departamento de Ciencias de la Computación e I.A. -- Universidad de Sevilla -- ===…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
-- I1M 2021-22: Relación 10&lt;br /&gt;
-- Propiedades del número 2021.&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- En esta relación se presentan ejercicios sobre propiedades del número&lt;br /&gt;
-- 2021.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import Data.List&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Consideramos todos los primos menores que 100:&lt;br /&gt;
--    2, 3, 5, 7, 11, ..., 89, 97&lt;br /&gt;
-- y formamos los correspondientes pares de dominó:&lt;br /&gt;
--    (2,3), (3,5), (5,7), ..., (83,89), (89,97).&lt;br /&gt;
-- La suma de los números en todos los pares es 2021.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDominoPrimos n) es la suma de los números de los pares&lt;br /&gt;
-- de dominó formada a partir de los primos menores que n. Por ejemplo,&lt;br /&gt;
--    sumaDominoPrimos 100 == 2021&lt;br /&gt;
--    sumaDominoPrimos 200 == 8253&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos n = sum (zipWith (+) ps (tail ps))&lt;br /&gt;
  where ps = takeWhile (&amp;lt;=n) primes&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la constante&lt;br /&gt;
--   sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
-- tal que sucSumaDominoPrimos es la sucesión de los números que son&lt;br /&gt;
-- suma de pares de dominó formado con números primos. Por ejemplo,&lt;br /&gt;
--   λ&amp;gt; take 25 sucSumaDominoPrimos&lt;br /&gt;
--   [5,13,25,43,67,97,133,175,227,287,355,433,517,607,707,819,939,1067,&lt;br /&gt;
--    1205,1349,1501,1663,1835,2021,2219]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos = tail (map sumaDominoPrimos primes)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la sucesión&lt;br /&gt;
--   esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumaDominoPrimos n) se verifica si n es un número de la&lt;br /&gt;
-- sucesión anterior. Por ejemplo,&lt;br /&gt;
--  esSumaDominoPrimos 2021    == True&lt;br /&gt;
--  esSumaDominoPrimos 1234509 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos n = n == head (dropWhile (&amp;lt;n) sucSumaDominoPrimos)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. El número 2021 es la suma de 33 más la suma de los 33&lt;br /&gt;
-- primeros números primos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumSumaPrimos n) es la suma de n más los n primeros números&lt;br /&gt;
-- primos. Por ejemplo,&lt;br /&gt;
--   sumSumaPrimos 33 == 2021&lt;br /&gt;
--   sumSumaPrimos 52 == 5641&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
sumSumaPrimos n = fromIntegral n + sum (take n primes)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir la función&lt;br /&gt;
--    esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumSumaPrimos n) se verifica si n es de la suma de m más&lt;br /&gt;
-- los m primeros primos, para algún entero m. Por ejemplo,&lt;br /&gt;
--    esSumSumaPrimos 2021       == True&lt;br /&gt;
--    esSumSumaPrimos 120        == False&lt;br /&gt;
--    esSumSumaPrimos 1234567893 == False&lt;br /&gt;
--    esSumSumaPrimos 774511387  == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1ª solución&lt;br /&gt;
-- ===========&lt;br /&gt;
&lt;br /&gt;
esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumSumaPrimos n = n == head (dropWhile (&amp;lt;n) sucSumSumaPrimos)&lt;br /&gt;
&lt;br /&gt;
-- sucSumSumaPrimos es la lista de los números de la forma m más la suma&lt;br /&gt;
-- de los m primeros primos. Por ejemplo,&lt;br /&gt;
--    take 18 sucSumSumaPrimos&lt;br /&gt;
--    [3,7,13,21,33,47,65,85,109,139,171,209,251,295,343,397,457,519]&lt;br /&gt;
sucSumSumaPrimos :: [Integer]&lt;br /&gt;
sucSumSumaPrimos = map sumSumaPrimos [1..]&lt;br /&gt;
&lt;br /&gt;
-- 2ª solución&lt;br /&gt;
-- ===========&lt;br /&gt;
&lt;br /&gt;
esSumSumaPrimos2 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumSumaPrimos2 n = n == head (dropWhile (&amp;lt;n) sucSumSumaPrimos2)&lt;br /&gt;
&lt;br /&gt;
sucSumSumaPrimos2 :: [Integer]&lt;br /&gt;
sucSumSumaPrimos2 = zipWith (+) [1..] (scanl1 (+) primes)&lt;br /&gt;
&lt;br /&gt;
-- Comparación de eficiencia:&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
-- La comparación es&lt;br /&gt;
--    λ&amp;gt; esSumSumaPrimos 123456789  == False&lt;br /&gt;
--    (11.60 secs, 34,680,466,648 bytes)&lt;br /&gt;
--    λ&amp;gt; esSumSumaPrimos2 123456789 == False&lt;br /&gt;
--    (0.01 secs, 11,300,288 bytes)&lt;br /&gt;
--&lt;br /&gt;
--    λ&amp;gt; esSumSumaPrimos 774511387  == True&lt;br /&gt;
--    (83.50 secs, 234,694,973,880 bytes)&lt;br /&gt;
--    λ&amp;gt; esSumSumaPrimos2 774511387 == True&lt;br /&gt;
--    (0.03 secs, 42,326,032 bytes)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Un número semiprimo es un número natural que es producto&lt;br /&gt;
-- de dos números primos no necesariamente distintos. Por ejemplo, 26 es&lt;br /&gt;
-- semiprimo (porque 26 = 2×13) y 49 también lo es (porque 49 = 7×7).&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    semiprimos  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esSemiprimo n) se verifica si n es semiprimo. Por ejemplo,&lt;br /&gt;
--      esSemiprimo 26          ==  True&lt;br /&gt;
--      esSemiprimo 49          ==  True&lt;br /&gt;
--      esSemiprimo 8           ==  False&lt;br /&gt;
--      esSemiprimo 2021        ==  True&lt;br /&gt;
--      esSemiprimo (21+10^14)  ==  True&lt;br /&gt;
-- + semiprimos es la sucesión de números semiprimos. Por ejemplo,&lt;br /&gt;
--      take 10 semiprimos   ==  [4,6,9,10,14,15,21,22,25,26]&lt;br /&gt;
--      semiprimos !! 580    ==  2021&lt;br /&gt;
--      semiprimos !! 10000  ==  40886&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1ª definición&lt;br /&gt;
-- =============&lt;br /&gt;
&lt;br /&gt;
esSemiprimo1 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo1 n = any prop ps&lt;br /&gt;
  where ps = takeWhile (&amp;lt;= (n `div` 2)) primes&lt;br /&gt;
        prop q = r == 0 &amp;amp;&amp;amp; isPrime d&lt;br /&gt;
          where (d,r) = quotRem n q&lt;br /&gt;
&lt;br /&gt;
semiprimos1 :: [Integer]&lt;br /&gt;
semiprimos1 = filter esSemiprimo1 [4..]&lt;br /&gt;
&lt;br /&gt;
-- 2ª definición&lt;br /&gt;
-- =============&lt;br /&gt;
&lt;br /&gt;
esSemiprimo2 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo2 n = length (primeFactors n) == 2&lt;br /&gt;
&lt;br /&gt;
semiprimos2 :: [Integer]&lt;br /&gt;
semiprimos2 = filter esSemiprimo2 [4..]&lt;br /&gt;
&lt;br /&gt;
-- Comparación de eficiencia&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
-- La comparación es&lt;br /&gt;
--    λ&amp;gt; semiprimos1 !! 1000  == 3599&lt;br /&gt;
--    (0.52 secs, 1,041,413,376 bytes)&lt;br /&gt;
--    λ&amp;gt; semiprimos2 !! 1000 == 3599&lt;br /&gt;
--    (0.04 secs, 51,977,912 bytes)&lt;br /&gt;
&lt;br /&gt;
-- Por tanto:&lt;br /&gt;
&lt;br /&gt;
esSemiprimo = esSemiprimo2&lt;br /&gt;
semiprimos  = semiprimos2&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Un número natural n es un número entero Blum si&lt;br /&gt;
-- n = p × q es un semiprimo para el que p y q son distintos primos&lt;br /&gt;
-- congruentes con 3 módulo 4. Es decir, p y q tienen que ser de la&lt;br /&gt;
-- forma 4 t + 3, para algún número entero t. Los números enteros de&lt;br /&gt;
-- esta forma se denominan números primos de Blum.  Los primeros enteros&lt;br /&gt;
-- de Blum son&lt;br /&gt;
--    21, 33, 57, 69, 77, 93, 129, 133, 141, 161, 177, ...&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBlum  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBlum n) se verifica si n es un número de Blum. Por ejemplo,&lt;br /&gt;
--      esBlum 26          ==  False&lt;br /&gt;
--      esBlum 49          ==  False&lt;br /&gt;
--      esBlum 77          ==  True&lt;br /&gt;
--      esBlum 2021        ==  True&lt;br /&gt;
--      esBlum (21+10^14)  ==  True&lt;br /&gt;
-- + sucBlum es la sucesión de números de Blum. Por ejemplo,&lt;br /&gt;
--      take 10 sucBlum  ==  [21,33,57,69,77,93,129,133,141,161]&lt;br /&gt;
--      sucBlum !! 132    ==  2021&lt;br /&gt;
--      sucBlum !! 10000  ==  186821&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
esBlum n = length ps == 2 &amp;amp;&amp;amp; p /= q &amp;amp;&amp;amp; p `rem` 4 == 3 &amp;amp;&amp;amp; q `rem` 4 == 3&lt;br /&gt;
  where ps      = primeFactors n&lt;br /&gt;
        (p:q:_) = ps&lt;br /&gt;
&lt;br /&gt;
sucBlum  :: [Integer]&lt;br /&gt;
sucBlum = filter esBlum [4..]&lt;br /&gt;
&lt;br /&gt;
sucBlum2  :: [Integer]&lt;br /&gt;
sucBlum2 = filter esBlum semiprimos&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Un número semiprimo n = p x q es brillante si p y q&lt;br /&gt;
-- tienen el mismo número de dígitos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBrillantes  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBrillante n) se verifica si n es brillante. Por ejemplo,&lt;br /&gt;
--      esBrillante 26          ==  False&lt;br /&gt;
--      esBrillante 49          ==  True&lt;br /&gt;
--      esBrillante 77          ==  False&lt;br /&gt;
--      esBrillante 2021        ==  True&lt;br /&gt;
--      esBrillante (21+10^14)  ==  False&lt;br /&gt;
-- + sucBrillantes es la sucesión de números brillantes. Por ejemplo,&lt;br /&gt;
--      take 10 sucBrillante   ==  [4,6,9,10,14,15,21,25,35,49]&lt;br /&gt;
--      sucBrillante !! 130    ==  2021&lt;br /&gt;
--      sucBrillante !! 10000  ==  696649&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
esBrillante n = length ps == 2 &amp;amp;&amp;amp; length (show p) == length (show q)&lt;br /&gt;
  where ps = primeFactors n&lt;br /&gt;
        p = head ps&lt;br /&gt;
        q = head (tail ps)&lt;br /&gt;
&lt;br /&gt;
sucBrillante  :: [Integer]&lt;br /&gt;
sucBrillante = filter esBrillante [4..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Un número natural es amable si se puede expresar como&lt;br /&gt;
-- suma de, al menos, dos números naturales consecutivos. Por ejemplo,&lt;br /&gt;
-- 2021 es amable pues&lt;br /&gt;
--    2021 = 20 + 21 + ... + 65 + 66.&lt;br /&gt;
-- La mayoría de los números naturales son amables, por lo que vamos a&lt;br /&gt;
-- calcular la lista de los números no amables.&lt;br /&gt;
--&lt;br /&gt;
-- Los primeros números no amables son&lt;br /&gt;
--    1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192,&lt;br /&gt;
--    16384, 32768, 65536, 131072, 262144&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sucesionesConSuma :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (sucesionesConSuma n) es la lista de los pares formados por&lt;br /&gt;
-- el primero y por el último elemento de las sucesiones de números&lt;br /&gt;
-- naturales consecutivos con suma n. Por ejemplo,&lt;br /&gt;
--    sucesionesConSuma 15             == [(1,5),(4,6),(7,8)]&lt;br /&gt;
--    sucesionesConSuma 2021           == [(20,66),(26,68),(1010,1011)]&lt;br /&gt;
--    length (sucesionesConSuma 2021)  == 3&lt;br /&gt;
--    length (sucesionesConSuma 3000)  == 7&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sucesionesConSuma :: Integer -&amp;gt; [(Integer,Integer)]&lt;br /&gt;
sucesionesConSuma n =&lt;br /&gt;
    [(x,y) | y &amp;lt;- [1..1 + n `div` 2]&lt;br /&gt;
           , x &amp;lt;- [1..y-1]&lt;br /&gt;
           , (x+y)*(y-x+1) == 2*n]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir las funciones&lt;br /&gt;
--    noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucNoAmables :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (noAmable n) se verifica si n es un número no amable. Por ejemplo,&lt;br /&gt;
--    noAmable 2021 == False&lt;br /&gt;
--    noAmable 1024 == True&lt;br /&gt;
-- + sucNoAmables es la lista de números naturales no amables. Por&lt;br /&gt;
--   ejemplo,&lt;br /&gt;
--    take 10 sucNoAmables == [1,2,4,8,16,32,64,128,256,512]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
noAmable n = null (sucesionesConSuma n)&lt;br /&gt;
&lt;br /&gt;
sucNoAmables :: [Integer]&lt;br /&gt;
sucNoAmables = filter noAmable [1..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Comprobar con QuickCheck que un número natural es no&lt;br /&gt;
-- amable si y sólo si es potencia de 2.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
propNoAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
propNoAmable n = noAmable m == esPotencia2 m&lt;br /&gt;
  where m = 1 + abs n&lt;br /&gt;
&lt;br /&gt;
-- (esPotencia2 n) se verifica si n es potencia de 2. Por ejemplo,&lt;br /&gt;
--    esPotencia2 16 == True&lt;br /&gt;
--    esPotencia2 18 == False&lt;br /&gt;
esPotencia2 :: Integer -&amp;gt; Bool&lt;br /&gt;
esPotencia2 0 = False&lt;br /&gt;
esPotencia2 1 = True&lt;br /&gt;
esPotencia2 n = even n &amp;amp;&amp;amp; esPotencia2 (n `div` 2)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    λ&amp;gt; quickCheck propNoAmable&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Un número natural se denomina aritmético si la media&lt;br /&gt;
-- aritmética de sus divisores es un número entero.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esAritmetico n) se verifica si n es un número aritmético.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    esAritmetico 2021 == True&lt;br /&gt;
--    esAritmetico 24   == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
esAritmetico n = sum ds `mod` genericLength ds == 0&lt;br /&gt;
  where ds = divisores n&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- (divisores n) es la lista de los divisores de n. Por ejemplo,&lt;br /&gt;
--    divisores 2021 == [2021,1,43,47]&lt;br /&gt;
divisores :: Integer -&amp;gt; [Integer]&lt;br /&gt;
divisores n = n : [x | x &amp;lt;- [1.. n`div`2], n `rem` x == 0]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que todos los primos excepto&lt;br /&gt;
-- el 2 son aritméticos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
primosAritmeticos :: Int -&amp;gt; Bool&lt;br /&gt;
primosAritmeticos n = all esAritmetico (take n (tail primes))&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    λ&amp;gt; quickCheck primosAritmeticos&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Definir la función&lt;br /&gt;
--    sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (sucAritmeticosConsecutivos n) es una sucesión de n números&lt;br /&gt;
-- aritméticos consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 5&lt;br /&gt;
--    [19,20,21,22,23]&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 20&lt;br /&gt;
--    [4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,&lt;br /&gt;
--     4968,4969,4970,4971,4972,4973,4974]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
sucAritmeticosConsecutivos n =&lt;br /&gt;
  head (filter consecutivos (segmentosLongitud n sucAritmeticos))&lt;br /&gt;
&lt;br /&gt;
-- sucAritmeticos es la sucesión de los números aritméticos. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    take 10 sucAritmeticos == [1,3,5,6,7,11,13,14,15,17]&lt;br /&gt;
sucAritmeticos :: [Integer]&lt;br /&gt;
sucAritmeticos = filter esAritmetico [1..]&lt;br /&gt;
&lt;br /&gt;
-- (segmentosLongitud n xs) es la sucesión de los segmentos de xs de&lt;br /&gt;
-- longitud n. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; segmentosLongitud 2 &amp;quot;Sevilla&amp;quot;&lt;br /&gt;
--    [&amp;quot;Se&amp;quot;,&amp;quot;ev&amp;quot;,&amp;quot;vi&amp;quot;,&amp;quot;il&amp;quot;,&amp;quot;ll&amp;quot;,&amp;quot;la&amp;quot;,&amp;quot;a&amp;quot;,&amp;quot;&amp;quot;]&lt;br /&gt;
--    λ&amp;gt; segmentosLongitud 3 &amp;quot;Sevilla&amp;quot;&lt;br /&gt;
--    [&amp;quot;Sev&amp;quot;,&amp;quot;evi&amp;quot;,&amp;quot;vil&amp;quot;,&amp;quot;ill&amp;quot;,&amp;quot;lla&amp;quot;,&amp;quot;la&amp;quot;,&amp;quot;a&amp;quot;,&amp;quot;&amp;quot;]&lt;br /&gt;
segmentosLongitud :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentosLongitud n xs = map (take n) (tails xs)&lt;br /&gt;
&lt;br /&gt;
-- (consecutivos ns) se verifica si ns es una lista de números&lt;br /&gt;
-- consecutivos. Por ejemplo,&lt;br /&gt;
--    consecutivos [4,5,6] == True&lt;br /&gt;
--    consecutivos [4,5,7] == False&lt;br /&gt;
consecutivos :: [Integer] -&amp;gt; Bool&lt;br /&gt;
consecutivos ns = all (==1) (zipWith (-) (tail ns) ns)&lt;br /&gt;
&lt;br /&gt;
-- Otra definición de consecutivos es&lt;br /&gt;
consecutivos2 :: [Integer] -&amp;gt; Bool&lt;br /&gt;
consecutivos2 ns = ns == [minimum ns .. maximum ns]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. El número 2021 tiene las propiedades siguientes:&lt;br /&gt;
-- + sumándole su inverso es un número palíndromo: 2021 + 1202 = 3223&lt;br /&gt;
-- + multiplicándolo por su inverso también lo es: 2021 * 1202 = 2429242&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (masInvPalindromo n) se verifica si n más su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--     masInvPalindromo 2021  == True&lt;br /&gt;
--      masInvPalindromo 109   == False&lt;br /&gt;
-- + (prodInvPalindromo n) se verifica si n por su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--      prodInvPalindromo 2021 == True&lt;br /&gt;
--      prodInvPalindromo 1097 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
masInvPalindromo n = palindromo (n + inversoN n)&lt;br /&gt;
&lt;br /&gt;
-- (inversoN x) es el número obtenido invirtiendo los dígitos de x. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    inversoN 2021 == 1202&lt;br /&gt;
inversoN :: Integer -&amp;gt; Integer&lt;br /&gt;
inversoN = read . reverse . show&lt;br /&gt;
&lt;br /&gt;
-- (palindromo n) se verifica si n es un palíndromo. Por ejemplo,&lt;br /&gt;
--    palindromo 23532 == True&lt;br /&gt;
--    palindromo 23352 == False&lt;br /&gt;
palindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
palindromo n = show n == reverse (show n)&lt;br /&gt;
&lt;br /&gt;
prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
prodInvPalindromo n = palindromo (n * inversoN n)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2.. Comprobar con QuickCheck que todo número&lt;br /&gt;
-- prodInvPalindromo es masInvPalindromo.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
propInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
propInvPalindromo n = not (prodInvPalindromo m) || masInvPalindromo m&lt;br /&gt;
  where m = 1 + abs n&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    λ&amp;gt; quickCheck propInvPalindromo&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Comprobar que el número 2021 es el menor  número&lt;br /&gt;
-- natural que verifica las siguientes propiedades:&lt;br /&gt;
--  (+) es la concatenación de dos enteros consecutivos (20 y 21)&lt;br /&gt;
--  (+) es el producto de dos primos consecutivos (43 y 47)&lt;br /&gt;
--&lt;br /&gt;
-- Para ello, definir las funciones&lt;br /&gt;
--    esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    especiales :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esConcatConsecutivos n) se verifica si n es la concatenación de&lt;br /&gt;
--   dos enteros consecutivos. Por ejemplo,&lt;br /&gt;
--      esConcatConsecutivos 2021 == True&lt;br /&gt;
-- + (esProdprimosConsecutivos n) se verifica si n es el producto de dos&lt;br /&gt;
--   primos consecutivos&lt;br /&gt;
--      esProdprimosConsecutivos 2021 == True&lt;br /&gt;
-- + espaciales es la lista de números naturales que verifican las dos&lt;br /&gt;
--   propiedaes anteriores&lt;br /&gt;
--      head especiales == 2021&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- esConcatConsecutivos&lt;br /&gt;
-- ====================&lt;br /&gt;
&lt;br /&gt;
esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esConcatConsecutivos n =&lt;br /&gt;
  n == head (dropWhile (&amp;lt;n) concatEnterosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
-- concatEnterosConsecutivos es la lista de números obtenidos&lt;br /&gt;
-- concatenando dos enteros consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; take 10 concatEnterosConsecutivos&lt;br /&gt;
--    [12,23,34,45,56,67,78,89,910,1011]&lt;br /&gt;
concatEnterosConsecutivos :: [Integer]&lt;br /&gt;
concatEnterosConsecutivos = zipWith pegaNumeros xs (tail xs)&lt;br /&gt;
  where xs = [1..]&lt;br /&gt;
&lt;br /&gt;
-- (pegaNumeros n m) es el número otenido añadiendo los dígitos de m a&lt;br /&gt;
-- continuación de los de n. Por ejemplo,&lt;br /&gt;
--    pegaNumeros 23 416 == 23416&lt;br /&gt;
pegaNumeros :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
pegaNumeros n m = read (show n ++ show m)&lt;br /&gt;
&lt;br /&gt;
-- esProdprimosConsecutivos&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esProdprimosConsecutivos n =&lt;br /&gt;
  n == head (dropWhile (&amp;lt;n) productoPrimosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
-- productoPrimosConsecutivos es la sucesión de los números que son&lt;br /&gt;
-- productos de dos primos consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; take 20 productoPrimosConsecutivos&lt;br /&gt;
--    [6,15,35,77,143,221,323,437,667,899,1147,1517,1763,2021,2491,3127,&lt;br /&gt;
--     3599,4087,4757,5183]&lt;br /&gt;
productoPrimosConsecutivos :: [Integer]&lt;br /&gt;
productoPrimosConsecutivos =&lt;br /&gt;
  zipWith (*) primes (tail primes)&lt;br /&gt;
&lt;br /&gt;
-- especiales&lt;br /&gt;
-- ==========&lt;br /&gt;
&lt;br /&gt;
especiales :: [Integer]&lt;br /&gt;
especiales = [n | n &amp;lt;- productoPrimosConsecutivos&lt;br /&gt;
                , esConcatConsecutivos n]&lt;br /&gt;
&lt;br /&gt;
-- concatPrimos es la lista de números obtenidos concatenando dos primos&lt;br /&gt;
-- consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; take 20 concatPrimos&lt;br /&gt;
--    [23,35,57,711,1113,1317,1719,1923,2329,2931,3137,3741,4143,4347,4753,&lt;br /&gt;
--     5359,5961,6167,6771,7173]&lt;br /&gt;
concatPrimos :: [Integer]&lt;br /&gt;
concatPrimos = zipWith pegaNumeros primes (tail primes)&lt;br /&gt;
&lt;br /&gt;
-- Primer número especial:&lt;br /&gt;
--    head especiales == 2021&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=512</id>
		<title>Relación 10</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=512"/>
		<updated>2021-12-08T08:40:53Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Página creada con «&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;  -- I1M 2021-22: Relación 10 -- Propiedades del número 2021. -- Departamento de Ciencias de la Computación e I.A. -- Universidad de Sevilla -- ==…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Relación 10&lt;br /&gt;
-- Propiedades del número 2021.&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- En esta relación se presentan ejercicios sobre propiedades del número&lt;br /&gt;
-- 2021.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import Data.List&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Consideramos todos los primos menores que 100:&lt;br /&gt;
--    2, 3, 5, 7, 11, ..., 89, 97&lt;br /&gt;
-- y formamos los correspondientes pares de dominó:&lt;br /&gt;
--    (2,3), (3,5), (5,7), ..., (83,89), (89,97).&lt;br /&gt;
-- La suma de los números en todos los pares es 2021.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDominoPrimos n) es la suma de los números de los pares&lt;br /&gt;
-- de dominó formada a partir de los primos menores que n. Por ejemplo,&lt;br /&gt;
--    sumaDominoPrimos 100 == 2021&lt;br /&gt;
--    sumaDominoPrimos 200 == 8253&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la constante&lt;br /&gt;
--   sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
-- tal que sucSumaDominoPrimos es la sucesión de los números que son&lt;br /&gt;
-- suma de pares de dominó formado con números primos. Por ejemplo,&lt;br /&gt;
--   λ&amp;gt; take 25 sucSumaDominoPrimos&lt;br /&gt;
--   [5,13,25,43,67,97,133,175,227,287,355,433,517,607,707,819,939,1067,&lt;br /&gt;
--    1205,1349,1501,1663,1835,2021,2219]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la sucesión&lt;br /&gt;
--   esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumaDominoPrimos n) se verifica si n es un número de la&lt;br /&gt;
-- sucesión anterior. Por ejemplo,&lt;br /&gt;
--  esSumaDominoPrimos 2021    == True&lt;br /&gt;
--  esSumaDominoPrimos 1234509 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. El número 2021 es la suma de 33 más la suma de los 33&lt;br /&gt;
-- primeros números primos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumSumaPrimos n) es la suma de n más los n primeros números&lt;br /&gt;
-- primos. Por ejemplo,&lt;br /&gt;
--   sumSumaPrimos 33 == 2021&lt;br /&gt;
--   sumSumaPrimos 52 == 5641&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
sumSumaPrimos n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir la función&lt;br /&gt;
--    esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumSumaPrimos n) se verifica si n es de la suma de m más&lt;br /&gt;
-- los m primeros primos, para algún entero m. Por ejemplo,&lt;br /&gt;
--    esSumSumaPrimos 2021       == True&lt;br /&gt;
--    esSumSumaPrimos 120        == False&lt;br /&gt;
--    esSumSumaPrimos 1234567893 == False&lt;br /&gt;
--    esSumSumaPrimos 774511387  == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumSumaPrimos n = undefined&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Un número semiprimo es un número natural que es producto&lt;br /&gt;
-- de dos números primos no necesariamente distintos. Por ejemplo, 26 es&lt;br /&gt;
-- semiprimo (porque 26 = 2×13) y 49 también lo es (porque 49 = 7×7).&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    semiprimos  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esSemiprimo n) se verifica si n es semiprimo. Por ejemplo,&lt;br /&gt;
--      esSemiprimo 26          ==  True&lt;br /&gt;
--      esSemiprimo 49          ==  True&lt;br /&gt;
--      esSemiprimo 8           ==  False&lt;br /&gt;
--      esSemiprimo 2021        ==  True&lt;br /&gt;
--      esSemiprimo (21+10^14)  ==  True&lt;br /&gt;
-- + semiprimos es la sucesión de números semiprimos. Por ejemplo,&lt;br /&gt;
--      take 10 semiprimos   ==  [4,6,9,10,14,15,21,22,25,26]&lt;br /&gt;
--      semiprimos !! 580    ==  2021&lt;br /&gt;
--      semiprimos !! 10000  ==  40886&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo n = undefined&lt;br /&gt;
&lt;br /&gt;
semiprimos :: [Integer]&lt;br /&gt;
semiprimos = undefined&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Un número natural n es un número entero Blum si&lt;br /&gt;
-- n = p × q es un semiprimo para el que p y q son distintos primos&lt;br /&gt;
-- congruentes con 3 módulo 4. Es decir, p y q tienen que ser de la&lt;br /&gt;
-- forma 4 t + 3, para algún número entero t. Los números enteros de&lt;br /&gt;
-- esta forma se denominan números primos de Blum.  Los primeros enteros&lt;br /&gt;
-- de Blum son&lt;br /&gt;
--    21, 33, 57, 69, 77, 93, 129, 133, 141, 161, 177, ...&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBlum  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBlum n) se verifica si n es un número de Blum. Por ejemplo,&lt;br /&gt;
--      esBlum 26          ==  False&lt;br /&gt;
--      esBlum 49          ==  False&lt;br /&gt;
--      esBlum 77          ==  True&lt;br /&gt;
--      esBlum 2021        ==  True&lt;br /&gt;
--      esBlum (21+10^14)  ==  True&lt;br /&gt;
-- + sucBlum es la sucesión de números de Blum. Por ejemplo,&lt;br /&gt;
--      take 10 sucBlum  ==  [21,33,57,69,77,93,129,133,141,161]&lt;br /&gt;
--      sucBlum !! 132    ==  2021&lt;br /&gt;
--      sucBlum !! 10000  ==  186821&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
esBlum n = undefined&lt;br /&gt;
&lt;br /&gt;
sucBlum  :: [Integer]&lt;br /&gt;
sucBlum = undefined&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Un número semiprimo n = p x q es brillante si p y q&lt;br /&gt;
-- tienen el mismo número de dígitos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBrillantes  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBrillante n) se verifica si n es brillante. Por ejemplo,&lt;br /&gt;
--      esBrillante 26          ==  False&lt;br /&gt;
--      esBrillante 49          ==  True&lt;br /&gt;
--      esBrillante 77          ==  False&lt;br /&gt;
--      esBrillante 2021        ==  True&lt;br /&gt;
--      esBrillante (21+10^14)  ==  False&lt;br /&gt;
-- + sucBrillantes es la sucesión de números brillantes. Por ejemplo,&lt;br /&gt;
--      take 10 sucBrillante   ==  [4,6,9,10,14,15,21,25,35,49]&lt;br /&gt;
--      sucBrillante !! 130    ==  2021&lt;br /&gt;
--      sucBrillante !! 10000  ==  696649&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
esBrillante n = undefined&lt;br /&gt;
&lt;br /&gt;
sucBrillante  :: [Integer]&lt;br /&gt;
sucBrillante = undefined&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Un número natural es amable si se puede expresar como&lt;br /&gt;
-- suma de, al menos, dos números naturales consecutivos. Por ejemplo,&lt;br /&gt;
-- 2021 es amable pues&lt;br /&gt;
--    2021 = 20 + 21 + ... + 65 + 66.&lt;br /&gt;
-- La mayoría de los números naturales son amables, por lo que vamos a&lt;br /&gt;
-- calcular la lista de los números no amables.&lt;br /&gt;
--&lt;br /&gt;
-- Los primeros números no amables son&lt;br /&gt;
--    1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192,&lt;br /&gt;
--    16384, 32768, 65536, 131072, 262144&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sucesionesConSuma :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (sucesionesConSuma n) es la lista de los pares formados por&lt;br /&gt;
-- el primero y por el último elemento de las sucesiones de números&lt;br /&gt;
-- naturales consecutivos con suma n. Por ejemplo,&lt;br /&gt;
--    sucesionesConSuma 15             == [(1,5),(4,6),(7,8)]&lt;br /&gt;
--    sucesionesConSuma 2021           == [(20,66),(26,68),(1010,1011)]&lt;br /&gt;
--    length (sucesionesConSuma 2021)  == 3&lt;br /&gt;
--    length (sucesionesConSuma 3000)  == 7&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sucesionesConSuma :: Integer -&amp;gt; [(Integer,Integer)]&lt;br /&gt;
sucesionesConSuma n = undefined&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir las funciones&lt;br /&gt;
--    noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucNoAmables :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (noAmable n) se verifica si n es un número no amable. Por ejemplo,&lt;br /&gt;
--    noAmable 2021 == False&lt;br /&gt;
--    noAmable 1024 == True&lt;br /&gt;
-- + sucNoAmables es la lista de números naturales no amables. Por&lt;br /&gt;
--   ejemplo,&lt;br /&gt;
--    take 10 sucNoAmables == [1,2,4,8,16,32,64,128,256,512]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
noAmable n = undefined&lt;br /&gt;
&lt;br /&gt;
sucNoAmables :: [Integer]&lt;br /&gt;
sucNoAmables = undefined&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Comprobar con QuickCheck que un número natural es no&lt;br /&gt;
-- amable si y sólo si es potencia de 2.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
propNoAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
propNoAmable n = undefined&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Un número natural se denomina aritmético si la media&lt;br /&gt;
-- aritmética de sus divisores es un número entero.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esAritmetico n) se verifica si n es un número aritmético.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    esAritmetico 2021 == True&lt;br /&gt;
--    esAritmetico 24   == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
esAritmetico n = undefined&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que todos los primos excepto&lt;br /&gt;
-- el 2 son aritméticos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
primosAritmeticos :: Int -&amp;gt; Bool&lt;br /&gt;
primosAritmeticos n = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Definir la función&lt;br /&gt;
--    sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (sucAritmeticosConsecutivos n) es una sucesión de n números&lt;br /&gt;
-- aritméticos consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 5&lt;br /&gt;
--    [19,20,21,22,23]&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 20&lt;br /&gt;
--    [4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,&lt;br /&gt;
--     4968,4969,4970,4971,4972,4973,4974]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
sucAritmeticosConsecutivos n = undefined&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. El número 2021 tiene las propiedades siguientes:&lt;br /&gt;
-- + sumándole su inverso es un número palíndromo: 2021 + 1202 = 3223&lt;br /&gt;
-- + multiplicándolo por su inverso también lo es: 2021 * 1202 = 2429242&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (masInvPalindromo n) se verifica si n más su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--     masInvPalindromo 2021  == True&lt;br /&gt;
--      masInvPalindromo 109   == False&lt;br /&gt;
-- + (prodInvPalindromo n) se verifica si n por su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--      prodInvPalindromo 2021 == True&lt;br /&gt;
--      prodInvPalindromo 1097 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
masInvPalindromo n = undefined&lt;br /&gt;
&lt;br /&gt;
prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
prodInvPalindromo n = undefined&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2.. Comprobar con QuickCheck que todo número&lt;br /&gt;
-- prodInvPalindromo es masInvPalindromo.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
propInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
propInvPalindromo n = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Comprobar que el número 2021 es el menor  número&lt;br /&gt;
-- natural que verifica las siguientes propiedades:&lt;br /&gt;
--  (+) es la concatenación de dos enteros consecutivos (20 y 21)&lt;br /&gt;
--  (+) es el producto de dos primos consecutivos (43 y 47)&lt;br /&gt;
--&lt;br /&gt;
-- Para ello, definir las funciones&lt;br /&gt;
--    esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    especiales :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esConcatConsecutivos n) se verifica si n es la concatenación de&lt;br /&gt;
--   dos enteros consecutivos. Por ejemplo,&lt;br /&gt;
--      esConcatConsecutivos 2021 == True&lt;br /&gt;
-- + (esProdprimosConsecutivos n) se verifica si n es el producto de dos&lt;br /&gt;
--   primos consecutivos&lt;br /&gt;
--      esProdprimosConsecutivos 2021 == True&lt;br /&gt;
-- + espaciales es la lista de números naturales que verifican las dos&lt;br /&gt;
--   propiedaes anteriores&lt;br /&gt;
--      head especiales == 2021&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- esConcatConsecutivos&lt;br /&gt;
-- ====================&lt;br /&gt;
&lt;br /&gt;
esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esConcatConsecutivos n = undefined&lt;br /&gt;
&lt;br /&gt;
-- esProdprimosConsecutivos&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esProdprimosConsecutivos n = undefined&lt;br /&gt;
&lt;br /&gt;
-- especiales&lt;br /&gt;
-- ==========&lt;br /&gt;
&lt;br /&gt;
especiales :: [Integer]&lt;br /&gt;
especiales = undefined&lt;br /&gt;
&lt;br /&gt;
-- Primer número especial:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Archivo:Rel_10.hs&amp;diff=511</id>
		<title>Archivo:Rel 10.hs</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Archivo:Rel_10.hs&amp;diff=511"/>
		<updated>2021-12-08T08:40:18Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=510</id>
		<title>Informática (1º Matemáticas)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=510"/>
		<updated>2021-12-08T08:39:56Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: /* Relación de Ejercicios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==Relación de Ejercicios==&lt;br /&gt;
&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Definiciones por composición sobre números, listas y booleanos. [ [[Media:Rel_1.hs |Enunciado]], [[Relación 1 |Solución colaborativa]], [[Relación 1 Sol |Solución]]  ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Definiciones con condicionales, guardas o patrones. [ [[Media:Rel_2.hs |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Relación 2 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión. [ [[Media:Rel_3.hs |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Relación 3 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión (extra). [ [[Media:Rel_4.hs |Enunciado]], [[Relación 4 |Solución colaborativa editada]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión con cadenas: El cifrado césar. [ [[Media:Rel_5.hs |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Relación 5 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión. [ [[Media:Rel_6.hs |Enunciado]], [[Relación 6 |Solución colaborativa]], [[Relación 6 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión y comprensión (extra). [ [[Media:Rel_7.hs |Enunciado]], [[Relación 7 |Solución colaborativa]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados (extra). [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Propiedades del número 2021. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10 |Solución colaborativa]], [[Relación 10 Sol |Solución ]] ]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: El algoritmo de Luhn. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones sobre cadenas. [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos, Árboles binarios. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10|Solución colaborativa]], [[Relación 10 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (II). [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11|Solución colaborativa]], [[Relación 11 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: Listas infinitas y evaluación perezosa. [ [[Media:Rel_13.hs |Enunciado]], [[Relación 13 |Solución colaborativa]], [[Relación 13 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la programación funcional con listas infinitas. [ [[Media:Rel_14.hs |Enunciado]], [[Relación 14 colab|Solución colaborativa]], [[Relación 14|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: Ecuación con factoriales. [ [[Media:Rel_15.hs |Enunciado]], [[Relación 15 colab |Solución colaborativa]], [[Relación 15 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 16&amp;#039;&amp;#039;&amp;#039;: El juego del nim y las funciones de entrada/salida. [ [[Media:Rel_16.hs |Enunciado]], [[Relación 16 colab|Solución colaborativa]], [[Relación 16 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 17&amp;#039;&amp;#039;&amp;#039;: Cálculo del número pi mediante el método de Montecarlo. [ [[Media:Rel_17.hs |Enunciado]], [[Relación 17 |Solución colaborativa]], [[Rel 17 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 18&amp;#039;&amp;#039;&amp;#039;: Aproximaciones de pi. [ [[Media:Rel_18.hs |Enunciado]], [http://www.cs.us.es/~mjoseh/Digitos_de_pi.txt Fichero con los dígitos de pi], [[Relación 18 |Solución colaborativa]], [[Rel 18 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 19&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices. [ [[Media:Rel_19.hs |Enunciado]], [[Relación 19 |Solución colaborativa]], [[Relación 19 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Método de Gauss para triangularizar matrices. [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 |Solución colaborativa]], [[Relación 20 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 21&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices con librerías Data.Matrix y Data.Vector. [ [[Media:Rel_21.hs |Enunciado]], [[Relación 21 |Solución colaborativa]], [[Relación 21 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 22&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices: ejercicios de exámenes (para repasar). [ [[Media:Rel_22.hs |Enunciado]], [[Relación 22 |Solución colaborativa]], [[Relación 22 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 23&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_23.hs |Enunciado]], [[Relación 23 |Solución colaborativa]], [[Relación 23 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico (2): límites, bisección, integrales y bajada. [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva. [ [[Media:Rel_25.hs |Enunciado]], [[Relación 25 |Solución colaborativa]], [[Relación 25 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 26&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva con librerías (solucionada). [ [[Relación 26 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 27&amp;#039;&amp;#039;&amp;#039;: Combinatoria. [ [[Media:Rel_27.hs |Enunciado]], [[Relación 27 |Solución colaborativa]], [[Relación 27 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: El TAD de las pilas.  [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 |Solución colaborativa]], [[Relación 28 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de las colas.  [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 |Solución colaborativa]], [[Relación 29 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de conjuntos.  [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 colab |Solución colaborativa]], [[Relación 31 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 32&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. Regla de Ruffini. [ [[Media:Rel_32.hs |Enunciado]], [[Relación 32 colab |Solución colaborativa]], [[Relación 32 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g1.hs |Enunciado]], [[Exam 3g1 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g2.hs |Enunciado]], [[Exam 3g2 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de los montículos. Librería en https://cutt.ly/tbDyRlr [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Media:Relación_33_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Media:Relación_34_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería Data.Set. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 |Solución colaborativa]], [[Media:Relación_35_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 36&amp;#039;&amp;#039;&amp;#039;: Problemas básicos con el TAD de los grafos. [ [[Media:Rel_36.hs |Enunciado]], [[Relación 36 Colab |Solución colaborativa]], [[Media:Relación_36_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante listas. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica I&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_1.hs |Enunciado]], [[Programación dinámica I |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica II&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_2.hs |Enunciado]], [[Programación Dinámica II |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Grafos&amp;#039;&amp;#039;&amp;#039;: Ejercicios de examen sobre grafos. ([[Media:masgrafos.hs |Enunciado]], [[Grafos (Ej. examen) |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Técnica Divide y vencerás&amp;#039;&amp;#039;&amp;#039;: Puzzle. ([[Media:triomino.hs |Enunciado]], [[Triominos |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica III&amp;#039;&amp;#039;&amp;#039;: Ejercicios de programación dinámica. ([[Media:dinamica3_3.hs |Enunciado]], [[Programación Dinámica III |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso I&amp;#039;&amp;#039;&amp;#039;. ([[Media:Lychrel.hs |Enunciado]], [[Repaso I. Números de Lychrel |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso II: ejercicios de examen&amp;#039;&amp;#039;&amp;#039;. ([[Media:ejExamenes.hs |Enunciado]], [[Repaso II.  |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios Complementarios.&amp;#039;&amp;#039;&amp;#039;([[Media:ejcomplementarios.hs |Enunciado]], [[Ejercicios Complementarios|Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Más ejercicios de examen.&amp;#039;&amp;#039;&amp;#039;([[Media:ejExam.hs |Enunciado]], [[Ejercicios de examen|Solución colaborativa]]).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;!-- EJERCICIOS DEL CURSO PASADO&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Ejercicios de exámenes sobre grafos. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 Colab |Solución colaborativa]], [[Relación 37 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~mjoseh/cursos/i1m-20/doc/manual-Data.Set.html Data.Set]. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Relación 34 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico en Maxima: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_25.mac |Enunciado]], [[Relación 25 |Solución colaborativa]] [[Relación 25 Sol |Solución]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/manual-Data.Set.html Data.Set] (erratas solucionadas). [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 colab |Solución colaborativa]], [[Relación 28 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: División y factorización de polinomios mediante la regla de Ruffini. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Caminos en una retícula. [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Apilamiento de barriles. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 |Solución colaborativa]], [[Relación 31 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante diccionarios. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 Colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de los multiconjuntos mediante diccionarios. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: El problema del granjero mediante búsqueda en espacio de estado. [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Relación 33 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Resolución de problemas mediante búsqueda en espacios de estados. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 colab |Solución colaborativa]], [[Relación 35 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados de repaso.  [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 colab |Solución colaborativa]] ]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Curso Actual==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 1&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(12/11/2021)&amp;#039;&amp;#039;: [ [[Media:Exam1_G2.hs |Enunciado]], [[Parcial 1 |Solución colaborativa]], [[Parcial 1 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 2&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(20/01/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 3&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(08/04/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 4&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(10/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 5&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(24/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Cursos Anteriores==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://github.com/jaalonso/Examenes_de_PF_con_Haskell/blob/master/README.org Repositorio de Exámenes]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Curso 2020/21 Grupo 2&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 11/12/20 |Examen 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(11/12/2020)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 16/02/21 |Examen 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(16/02/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 23/04/21 |Examen 3 Turno 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(23/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 28/04/21 |Examen 3 Turno 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(28/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 21/06/21 |Examen 4]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(21/06/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 05/07/2021 |Examen Julio]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(05/07/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 07/09/2021 |Examen Septiembre]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(07/09/2021)&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=507</id>
		<title>Relación 9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=507"/>
		<updated>2021-12-03T09:52:34Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Rel_9.hs (01 de diciembre de 2021)&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados (II)&lt;br /&gt;
-- Departamento de Ciencias de la Computación e Inteligencia Artificial&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Librerías auxiliares&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
import Data.Char&lt;br /&gt;
import Data.List&lt;br /&gt;
-- El siguiente módulo hay que instalarlo:&lt;br /&gt;
--cabal install Primes&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Se considera la función&lt;br /&gt;
--      resultadoPos :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (resultadoPos f xs) es la lista de los elementos de la lista&lt;br /&gt;
-- xs tales que el valor de la función f sobre ellos es positivo. Por ejemplo,&lt;br /&gt;
--   resultadoPos head [[-1,2],[-9,4],[2,3]]       ==  [[2,3]]&lt;br /&gt;
--   resultadoPos sum [[1,2],[9],[-8,3],[],[3,5]]  ==  [[1,2],[9],[3,5]]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
resultadoPosC :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosC f xs = [x | x &amp;lt;- xs, f x &amp;gt; 0]&lt;br /&gt;
&lt;br /&gt;
resultadoPosS :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosS f xs = filter g xs&lt;br /&gt;
                   where g x = f x &amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
resultadoPosR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosR f [] = []&lt;br /&gt;
resultadoPosR f (x:xs) | f x &amp;gt; 0    = x : resultadoPosR f xs&lt;br /&gt;
                       | otherwise  = resultadoPosR f xs&lt;br /&gt;
&lt;br /&gt;
resultadoPosPR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosPR f xs = foldr g [] xs&lt;br /&gt;
                    where g prim recu | f prim &amp;gt; 0 = prim : recu&lt;br /&gt;
                                      | otherwise = recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Se considera la función&lt;br /&gt;
--     intercala :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (intercala y xs) es la lista que resulta de intercalar el elemento&lt;br /&gt;
-- y delante de todos los elementos de la lista xs que sean menores que y.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--   intercala 5 [1,2,6,3,7,9]  ==  [5,1,5,2,6,5,3,7,9]&lt;br /&gt;
--   intercala 5 [6,7,9,8]      ==  [6,7,9,8]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
intercalaC :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaC y xs = concat [if x&amp;lt;y then [y,x] else [x] | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
intercalaS :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaS y xs = concat (map f xs)&lt;br /&gt;
                where f x = if x&amp;lt;y then [y,x] else [x]&lt;br /&gt;
&lt;br /&gt;
intercalaR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaR y [] = []&lt;br /&gt;
intercalaR y (x:xs) | x&amp;lt;y  = [y,x] ++ intercalaR y xs&lt;br /&gt;
                    | x&amp;gt;y  = [x] ++ intercalaR y xs&lt;br /&gt;
&lt;br /&gt;
intercalaPR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaPR y xs = foldr g [] xs&lt;br /&gt;
                 where g x recu | x&amp;lt;y  = [y,x] ++ recu&lt;br /&gt;
                                | x&amp;gt;y  = [x] ++ recu&lt;br /&gt;
&lt;br /&gt;
intercalaA :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaA y xs = aux [] xs&lt;br /&gt;
                where aux v [] = v&lt;br /&gt;
                      aux v (x:xs) | x&amp;lt;y        = aux (v++[y,x]) xs&lt;br /&gt;
                                   | otherwise  = aux (v++[x]) xs&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
intercala1 :: (Ord a, Num a) =&amp;gt; a -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
intercala1 n xs = concat [if a &amp;lt; n then [n,a] else [a] | a&amp;lt;-xs]&lt;br /&gt;
&lt;br /&gt;
intercala2 :: (Ord a, Num a) =&amp;gt; a -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
intercala22 n xs = concat (map f xs)&lt;br /&gt;
                  where f x = if x &amp;lt; n then [n,x] else [x]&lt;br /&gt;
&lt;br /&gt;
intercala3 :: (Ord a, Num a) =&amp;gt; a -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
intercala3 n [] = []&lt;br /&gt;
intercala3 n (x:xs) = (if x &amp;lt; n then [n,x] else [x]) ++ (intercala3 n (xs))&lt;br /&gt;
&lt;br /&gt;
intercala4 n (x:xs) = (foldr (p) [] (x:xs) )&lt;br /&gt;
                      where p prim recu | prim &amp;lt; n = (n : prim:recu)&lt;br /&gt;
                                        | otherwise = (prim:recu)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Se considera la función&lt;br /&gt;
--    dec2ent :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (dec2ent xs) es el número entero cuyas cifras ordenadas son los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo,&lt;br /&gt;
--   dec2ent [2,3,4,5]  ==  2345&lt;br /&gt;
--   dec2ent [1..9]     ==  123456789&lt;br /&gt;
--&lt;br /&gt;
-- Defie esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
dec2ent1 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent1 xs = read (concat [show x| x &amp;lt;- (sort xs)]) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent2 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent2 xs = read (concat (map show (sort xs))) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent3 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent3Aux :: Show a =&amp;gt; [a] -&amp;gt; [Char]&lt;br /&gt;
dec2ent3Aux [] = []&lt;br /&gt;
dec2ent3Aux (x:xs) = (show x) ++ (dec2ent3Aux xs)&lt;br /&gt;
dec2ent3 xs = read (dec2ent3Aux (sort xs)) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent4 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent4 xs = read (concat (foldr f [] (sort xs))) :: Integer&lt;br /&gt;
            where f prim recu = show prim :recu&lt;br /&gt;
&lt;br /&gt;
-- Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
dec2entC xs = sum[ x*10^e|(x,e)&amp;lt;- zip (reverse xs) [0..length xs-1]]&lt;br /&gt;
&lt;br /&gt;
dec2entS xs =sum( map f ( zip xs [n,n-1..0]))&lt;br /&gt;
  where n= length xs-1&lt;br /&gt;
        f (x,i) = x*10^i&lt;br /&gt;
dec2entR [] = 0&lt;br /&gt;
dec2entR (x:xs) = x*10^(length xs) + dec2entR xs&lt;br /&gt;
&lt;br /&gt;
dec2entP xs = foldr f 0 ( zip xs [n,n-1..0])&lt;br /&gt;
  where n= length xs-1&lt;br /&gt;
        f (x,i) recu = x*10^i + recu&lt;br /&gt;
&lt;br /&gt;
-- Juan José Calero Vela:&lt;br /&gt;
&lt;br /&gt;
pos :: Integer -&amp;gt; [Integer] -&amp;gt; Integer&lt;br /&gt;
pos x [] = 0&lt;br /&gt;
pos x (y:xs) = if x==y then 1 else 1 + pos x xs&lt;br /&gt;
&lt;br /&gt;
dec2entC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entC xs = sum [ x*(10^(pos x (reverse xs)-1)) | x&amp;lt;-xs]&lt;br /&gt;
&lt;br /&gt;
-- profesor: solución vista en clase&lt;br /&gt;
dec2entS xs = sum (map f (zip xs [n-1,n-2..0]))&lt;br /&gt;
            where f (x,i) = x * 10^i&lt;br /&gt;
                  n = length xs &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--Manuel Alcaide&lt;br /&gt;
&lt;br /&gt;
dec2ent1&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent1&amp;#039; xs = sum[x*(10^y)|(x,y)&amp;lt;-(zip xs [((length (xs))-1),((length (xs))-2)..0])]&lt;br /&gt;
&lt;br /&gt;
dec2ent2&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent2&amp;#039; xs = sum (map f (zip xs [((length (xs))-1),((length (xs))-2)..0]))&lt;br /&gt;
  where f (x,y) = x*(10^y)&lt;br /&gt;
&lt;br /&gt;
dec2ent3&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent3&amp;#039; [] = 0&lt;br /&gt;
dec2ent3&amp;#039; (x:xs) = x*(10^((length (x:xs))-1)) + dec2ent3 xs&lt;br /&gt;
&lt;br /&gt;
dec2ent4&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent4&amp;#039; xs = foldr f 0 $ zip xs [((length xs)-1),((length xs)-2)..0]&lt;br /&gt;
  where f (x,p) recu = x*(10^p) + recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se considera la función&lt;br /&gt;
--     diferencia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (diferencia xs ys) es la diferencia entre los conjuntos xs e&lt;br /&gt;
-- ys; es decir, el conjunto de los elementos de la lista xs que no se&lt;br /&gt;
-- encuentran en la lista ys. Por ejemplo,&lt;br /&gt;
--   diferencia [2,3,5,6] [5,2,7]  ==  [3,6]&lt;br /&gt;
--   diferencia [1,3,5,7] [2,4,6]  ==  [1,3,5,7]&lt;br /&gt;
--   diferencia [1,3] [1..9]       ==  []&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
diferenciaC :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaC xs ys = [x | x &amp;lt;- xs, notElem x ys]&lt;br /&gt;
  &lt;br /&gt;
diferenciaS :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaS xs ys = concat (map f xs)&lt;br /&gt;
                  where f x | notElem x ys  = [x]&lt;br /&gt;
                            | otherwise     = []&lt;br /&gt;
  &lt;br /&gt;
diferenciaR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaR [] _ = []&lt;br /&gt;
diferenciaR (x:xs) ys | notElem x ys  = [x] ++ diferenciaR xs ys&lt;br /&gt;
                      | otherwise     = diferenciaR xs ys&lt;br /&gt;
  &lt;br /&gt;
diferenciaPR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaPR xs ys = foldr g [] xs&lt;br /&gt;
                   where g x recu | notElem x ys  = [x] ++ recu&lt;br /&gt;
                                  | otherwise     = recu&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
diferencia1 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia1 xs ys = [x | x &amp;lt;- xs, not (elem x ys) ] -- ++ [y | y &amp;lt;- ys, not (elem y xs) ]&lt;br /&gt;
&lt;br /&gt;
diferencia2 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia2 (x:xs) ys = filter f (x:xs)&lt;br /&gt;
                   where f a = not (elem a ys)&lt;br /&gt;
&lt;br /&gt;
diferencia3 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia3 [] _ = []&lt;br /&gt;
diferencia3 (x:xs) ys | not (elem x ys) = x : (diferencia3 xs ys)&lt;br /&gt;
                      | otherwise = (diferencia3 xs ys)&lt;br /&gt;
&lt;br /&gt;
diferencia4 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia4 (x:xs) ys = foldr f [] (x:xs)&lt;br /&gt;
                     where f prim recu | not (elem prim ys) = prim : recu&lt;br /&gt;
                                       | otherwise = recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Se considera la función&lt;br /&gt;
--   primerosYultimos :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
-- tal que (primerosYultimos xss) es el par formado por la lista de los&lt;br /&gt;
-- primeros elementos de las listas no vacías de xss y la lista de los&lt;br /&gt;
-- últimos elementos de las listas no vacías de xss. Por ejemplo,&lt;br /&gt;
--   primerosYultimos [[1,2],[5,3,4],[],[9]]  ==  ([1,5,9],[2,4,9])&lt;br /&gt;
--   primerosYultimos [[1,2],[1,2,3],[1..4]]  ==  ([1,1,1],[2,3,4])&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
primerosYultimos1 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos1 xss = ([head x | x &amp;lt;- xss, not (null x)], [last x | x &amp;lt;- xss, not (null x)]) &lt;br /&gt;
&lt;br /&gt;
noVacios :: Foldable t =&amp;gt; [t a] -&amp;gt; [t a]&lt;br /&gt;
noVacios xss = filter (not.null) xss&lt;br /&gt;
primerosYultimos2 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos2 xss = (map head (noVacios xss), map last (noVacios xss))&lt;br /&gt;
&lt;br /&gt;
primeros3 :: [[a]] -&amp;gt; [a]&lt;br /&gt;
primeros3 [] = []&lt;br /&gt;
primeros3 (xs:xss) | not (null xs) = (head xs) : (primeros3 xss)&lt;br /&gt;
                   | otherwise = (primeros3 xss)&lt;br /&gt;
ultimos3 :: [[a]] -&amp;gt; [a]&lt;br /&gt;
ultimos3 [] = []&lt;br /&gt;
ultimos3 (xs:xss) | not (null xs) = (last xs) : (ultimos3 xss)&lt;br /&gt;
                  | otherwise = (ultimos3 xss)&lt;br /&gt;
primerosYultimos3 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos3 xss = (primeros3 xss, ultimos3 xss )&lt;br /&gt;
&lt;br /&gt;
primeros4 :: Foldable t =&amp;gt; t [a] -&amp;gt; [a]&lt;br /&gt;
primeros4 xss = foldr p4 [] xss&lt;br /&gt;
             where p4 prim recu | not (null prim) = head prim : recu&lt;br /&gt;
                                | otherwise = recu&lt;br /&gt;
ultimos4 :: Foldable t =&amp;gt; t [a] -&amp;gt; [a]                                &lt;br /&gt;
ultimos4 xss = foldr u4 [] xss&lt;br /&gt;
             where u4 prim recu | not (null prim) = last prim : recu&lt;br /&gt;
                                | otherwise = recu&lt;br /&gt;
primerosYultimos4 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos4 xss = (primeros4 xss, ultimos4 xss)&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
primerosYultimosC :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosC xss = (concat [(take 1  xs) | xs &amp;lt;- xss], concat [take 1 (reverse xs) | xs &amp;lt;- xss])&lt;br /&gt;
                     &lt;br /&gt;
primerosYultimosS :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosS xss = (concat (map (take 1) xss), concat (map (take 1) (map reverse xss)))&lt;br /&gt;
&lt;br /&gt;
primerosYultimosR :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosR xss = (primerosR xss, ultimosR xss)&lt;br /&gt;
&lt;br /&gt;
primerosR [] = []&lt;br /&gt;
primerosR (xs:xss) | null xs    = primerosR xss&lt;br /&gt;
                   | otherwise  = [head xs] ++ primerosR xss&lt;br /&gt;
ultimosR [] = []&lt;br /&gt;
ultimosR (xs:xss) | null xs    = ultimosR xss&lt;br /&gt;
                  | otherwise  = [last xs] ++ ultimosR xss&lt;br /&gt;
                  &lt;br /&gt;
primerosYultimosPR :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosPR xss = (primerosPR xss, ultimosPR xss) &lt;br /&gt;
&lt;br /&gt;
primerosPR xss = foldr f [] xss&lt;br /&gt;
              where f x recu | null x     = recu&lt;br /&gt;
                             | otherwise  = [head x] ++ recu&lt;br /&gt;
ultimosPR xss = foldr f [] xss&lt;br /&gt;
              where f x recu | null x     = recu&lt;br /&gt;
                             | otherwise  = [last x] ++ recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una lista hermanada es una lista de números estrictamente&lt;br /&gt;
-- positivos en la que cada elemento tiene algún factor primo en común con el&lt;br /&gt;
-- siguiente, en caso de que exista, o alguno de los dos es un 1. Por ejemplo,&lt;br /&gt;
-- [2,6,3,9,1,5] es una lista hermanada.&lt;br /&gt;
&lt;br /&gt;
-- Se considera la función&lt;br /&gt;
--    hermanada :: [Int] -&amp;gt; Bool&lt;br /&gt;
-- tal que (hermanada xs) comprueba que la lista xs es hermanada según la&lt;br /&gt;
-- definición anterior. Por ejemplo,&lt;br /&gt;
--    hermanada [2,6,3,9,1,5]  ==  True&lt;br /&gt;
--    hermanada [2,3,5]        ==  False&lt;br /&gt;
--&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;gcd&amp;#039;&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
primo1 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo1 x = [1,x]==[a| a&amp;lt;- [1..x], rem x a == 0] -- Me dice si un número es primo&lt;br /&gt;
hermanada1 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada1 xs = sum [1 | (a,b) &amp;lt;- (zip xs (tail xs)), (if ((a/=1) &amp;amp;&amp;amp; (b/=1))&lt;br /&gt;
                                                  then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo1 (gcd a b)))&lt;br /&gt;
                                                  else True),&lt;br /&gt;
                                                                                a&amp;gt;0, b&amp;gt;0 ] == (length xs) -1&lt;br /&gt;
          -- a,b &amp;gt; 0 porque tienen que ser extrictamente positivos&lt;br /&gt;
          -- ((length xs) - 1) == length (zip xs (tail xs))&lt;br /&gt;
&lt;br /&gt;
primo2 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo2 x = filter p2 [1..x] == [1,x]&lt;br /&gt;
         where p2 b = (rem x b == 0)&lt;br /&gt;
hermanada2 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada2 xs = and (map prop2 (zip xs (tail xs)))&lt;br /&gt;
           where prop2 (a,b) = if a&amp;gt;0 &amp;amp;&amp;amp; b&amp;gt;0&lt;br /&gt;
                               then (if ((a/=1) &amp;amp;&amp;amp; (b/=1)) then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo2 (gcd a b))) else True)&lt;br /&gt;
                               else False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primo3 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo3 n = noHayNumerosDivisoresDe n 2 (n - 1)&lt;br /&gt;
noHayNumerosDivisoresDe :: Integral t =&amp;gt; t -&amp;gt; t -&amp;gt; t -&amp;gt; Bool&lt;br /&gt;
noHayNumerosDivisoresDe n minimo maximo   | minimo &amp;gt;= maximo  = True&lt;br /&gt;
                                          | rem n minimo == 0 = False&lt;br /&gt;
                                          | otherwise         = noHayNumerosDivisoresDe n (minimo + 1) maximo&lt;br /&gt;
hermanada3 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada3 [b] = True&lt;br /&gt;
hermanada3 (a:b:xs) = (if ((a/=1) &amp;amp;&amp;amp; (b/=1)) then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo2 (gcd a b))) else True)&lt;br /&gt;
                      &amp;amp;&amp;amp; hermanada3 (b:xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
hermanada4 xs = undefined&lt;br /&gt;
---------------------------------------------------------------------------------------&lt;br /&gt;
--Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
hermanadaC :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaC xs | elem 0 xs  = False&lt;br /&gt;
              | otherwise  = and [(gcd x y == x) || (gcd x y == y) || not (null (primeFactors (gcd x y))) | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
        &lt;br /&gt;
hermanadaS :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaS xs | elem 0 xs  = False&lt;br /&gt;
              | otherwise  = and (map f (zip xs (tail xs)))&lt;br /&gt;
              where f (x,y) = (gcd x y == x) || (gcd x y == y) || not (null (primeFactors (gcd x y)))&lt;br /&gt;
                                    &lt;br /&gt;
hermanadaR :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaR [x] = True&lt;br /&gt;
hermanadaR (x:y:xs) | elem 0 (x:y:xs)  = False&lt;br /&gt;
                    | otherwise        = ((gcd x y == x) || (gcd x y == y) || not (null (primeFactors (gcd x y)))) &amp;amp;&amp;amp; hermanadaR (y:xs)&lt;br /&gt;
&lt;br /&gt;
hermanadaPR :: [Int] -&amp;gt; Bool   &lt;br /&gt;
hermanadaPR xs | elem 0 xs = False&lt;br /&gt;
               | otherwise = foldr f True (zip xs (tail xs))&lt;br /&gt;
               where f (x,y) recu = ((gcd x y == x) || (gcd x y == y) || not (null (primeFactors (gcd x y)))) &amp;amp;&amp;amp; recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un elemento de una lista es permanente si ninguno de los que&lt;br /&gt;
-- vienen a continuación en la lista es mayor que él. Consideramos la función&lt;br /&gt;
--   permanentes :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (permanentes xs) es la lista de los elementos permanentes de la&lt;br /&gt;
-- lista xs. Por ejemplo,&lt;br /&gt;
--   permanentes [80,1,7,8,4]  ==  [80,8,4]&lt;br /&gt;
&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;tails&amp;#039; de Data.List.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
permanentes1 :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes1 xs = [a | (a,b) &amp;lt;- (zip xs (init (tails xs))), a == maximum b ]&lt;br /&gt;
&lt;br /&gt;
permanentes2 :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes2 xs = map head (filter p2 (init (tails xs)))&lt;br /&gt;
              where p2 (x:xs) = x == maximum (x:xs)&lt;br /&gt;
&lt;br /&gt;
comparacion3 :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
comparacion3 a [] = True&lt;br /&gt;
comparacion3 a b = a &amp;gt;= b &lt;br /&gt;
permanentes3 :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes3 [] = []&lt;br /&gt;
permanentes3 (x:xs) | [x] `comparacion3` [maximum3 xs] = x : permanentes3 xs&lt;br /&gt;
                    | otherwise = permanentes3 xs&lt;br /&gt;
                 where maximum3 [] = if x &amp;lt; 0 then x else -x&lt;br /&gt;
                       maximum3 xs = maximum xs&lt;br /&gt;
&lt;br /&gt;
permanentes4:: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes4 (x:xs) = foldr f4 [] (x:xs)&lt;br /&gt;
                    where f4 prim recu | [prim] `comparacion3` [maximum3 recu] = prim : recu&lt;br /&gt;
                                       | otherwise = recu&lt;br /&gt;
                          maximum3 [] = if x &amp;lt; 0 then x else -x&lt;br /&gt;
                          maximum3 xs = maximum xs&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
permanentesC :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesC xs = [x | (x, xs&amp;#039;) &amp;lt;- zip xs (tails (drop 1 xs)), xs&amp;#039; == [] || x &amp;gt;= maximum xs&amp;#039;] &lt;br /&gt;
&lt;br /&gt;
permanentesS :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesS xs = filter p xs&lt;br /&gt;
                where p x = x == maximum (dropWhile (/=x) xs)&lt;br /&gt;
  &lt;br /&gt;
permanentesR :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesR [] = []&lt;br /&gt;
permanentesR [x] = [x] &lt;br /&gt;
permanentesR (x:xs) | x &amp;gt;= maximum xs  = [x] ++ permanentesR xs&lt;br /&gt;
                    | otherwise        = permanentesR xs&lt;br /&gt;
                    &lt;br /&gt;
permanentesPR :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesPR (x:xs) = foldr f [] (x:xs)&lt;br /&gt;
                     where f x recu | x &amp;gt;= maximum&amp;#039; (dropWhile (/=x) xs)  = [x] ++ recu&lt;br /&gt;
                                    | otherwise                           = recu&lt;br /&gt;
maximum&amp;#039; xs | null xs    = 0&lt;br /&gt;
            | otherwise  = maximum xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Un número entero positivo n es muy primo si es n primo&lt;br /&gt;
-- y todos los números que resultan de ir suprimimiendo la última cifra&lt;br /&gt;
-- también son primos. Por ejemplo, 7193 es muy primo pues los números&lt;br /&gt;
-- 7193, 719, 71 y 7 son todos primos. &lt;br /&gt;
-- &lt;br /&gt;
-- Define la función &lt;br /&gt;
--    muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- que (muyPrimo n) se verifica si n es muy primo. Por ejemplo,&lt;br /&gt;
--    muyPrimo 7193  == True&lt;br /&gt;
--    muyPrimo 71932 == False&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
esPrimo :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
esPrimo x = filter p2 [1..x] == [1,x]&lt;br /&gt;
         where p2 b = (rem x b == 0)&lt;br /&gt;
muyPrimo :: Integer -&amp;gt; Bool         &lt;br /&gt;
muyPrimo n | esPrimo n = length (show n) == sum [1 | a &amp;lt;- (descomposicion n), esPrimo (read a :: Integer) ]&lt;br /&gt;
           | otherwise = False&lt;br /&gt;
           where descomposicion n =  [reverse x | x &amp;lt;- (init(tails (reverse (show n))))] &lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
muyPrimo&amp;#039; :: Integer -&amp;gt; Bool&lt;br /&gt;
muyPrimo&amp;#039; n = and (map isPrime (lista n))&lt;br /&gt;
lista n = [read a :: Integer | a &amp;lt;- tail (inits (show n))] &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- ¿Cuántos números de cinco cifras son muy primos?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
calculoMuyPrimo = sum [1 | x &amp;lt;- [10000..99999], muyPrimo x] -- Tras unos minutos, sale 15.&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
muyPrimos5cifras = sum [1 | x &amp;lt;- [10000..99999], muyPrimo&amp;#039; x] -- Sale 15 &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=502</id>
		<title>Relación 9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=502"/>
		<updated>2021-12-03T09:37:36Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Rel_9.hs (01 de diciembre de 2021)&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados (II)&lt;br /&gt;
-- Departamento de Ciencias de la Computación e Inteligencia Artificial&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Librerías auxiliares&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
import Data.Char&lt;br /&gt;
import Data.List&lt;br /&gt;
-- El siguiente módulo hay que instalarlo:&lt;br /&gt;
--cabal install Primes&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Se considera la función&lt;br /&gt;
--      resultadoPos :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (resultadoPos f xs) es la lista de los elementos de la lista&lt;br /&gt;
-- xs tales que el valor de la función f sobre ellos es positivo. Por ejemplo,&lt;br /&gt;
--   resultadoPos head [[-1,2],[-9,4],[2,3]]       ==  [[2,3]]&lt;br /&gt;
--   resultadoPos sum [[1,2],[9],[-8,3],[],[3,5]]  ==  [[1,2],[9],[3,5]]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
resultadoPosC :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosC f xs = [x | x &amp;lt;- xs, f x &amp;gt; 0]&lt;br /&gt;
&lt;br /&gt;
resultadoPosS :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosS f xs = filter g xs&lt;br /&gt;
                   where g x = f x &amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
resultadoPosR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosR f [] = []&lt;br /&gt;
resultadoPosR f (x:xs) | f x &amp;gt; 0    = x : resultadoPosR f xs&lt;br /&gt;
                       | otherwise  = resultadoPosR f xs&lt;br /&gt;
&lt;br /&gt;
resultadoPosPR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosPR f xs = foldr g [] xs&lt;br /&gt;
                    where g prim recu | f prim &amp;gt; 0 = prim : recu&lt;br /&gt;
                                      | otherwise = recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Se considera la función&lt;br /&gt;
--     intercala :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (intercala y xs) es la lista que resulta de intercalar el elemento&lt;br /&gt;
-- y delante de todos los elementos de la lista xs que sean menores que y.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--   intercala 5 [1,2,6,3,7,9]  ==  [5,1,5,2,6,5,3,7,9]&lt;br /&gt;
--   intercala 5 [6,7,9,8]      ==  [6,7,9,8]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
intercalaC :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaC y xs = concat [if x&amp;lt;y then [y,x] else [x] | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
intercalaS :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaS y xs = concat (map f xs)&lt;br /&gt;
                where f x = if x&amp;lt;y then [y,x] else [x]&lt;br /&gt;
&lt;br /&gt;
intercalaR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaR y [] = []&lt;br /&gt;
intercalaR y (x:xs) | x&amp;lt;y  = [y,x] ++ intercalaR y xs&lt;br /&gt;
                    | x&amp;gt;y  = [x] ++ intercalaR y xs&lt;br /&gt;
&lt;br /&gt;
intercalaPR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaPR y xs = foldr g [] xs&lt;br /&gt;
                 where g x recu | x&amp;lt;y  = [y,x] ++ recu&lt;br /&gt;
                                | x&amp;gt;y  = [x] ++ recu&lt;br /&gt;
&lt;br /&gt;
intercalaA :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaA y xs = aux [] xs&lt;br /&gt;
                where aux v [] = v&lt;br /&gt;
                      aux v (x:xs) | x&amp;lt;y        = aux (v++[y,x]) xs&lt;br /&gt;
                                   | otherwise  = aux (v++[x]) xs&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
intercala1 :: (Ord a, Num a) =&amp;gt; a -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
intercala1 n xs = concat [if a &amp;lt; n then [n,a] else [a] | a&amp;lt;-xs]&lt;br /&gt;
&lt;br /&gt;
intercala2 :: (Ord a, Num a) =&amp;gt; a -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
intercala22 n xs = concat (map f xs)&lt;br /&gt;
                  where f x = if x &amp;lt; n then [n,x] else [x]&lt;br /&gt;
&lt;br /&gt;
intercala3 :: (Ord a, Num a) =&amp;gt; a -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
intercala3 n [] = []&lt;br /&gt;
intercala3 n (x:xs) = (if x &amp;lt; n then [n,x] else [x]) ++ (intercala3 n (xs))&lt;br /&gt;
&lt;br /&gt;
intercala4 n (x:xs) = (foldr (p) [] (x:xs) )&lt;br /&gt;
                      where p prim recu | prim &amp;lt; n = (n : prim:recu)&lt;br /&gt;
                                        | otherwise = (prim:recu)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Se considera la función&lt;br /&gt;
--    dec2ent :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (dec2ent xs) es el número entero cuyas cifras ordenadas son los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo,&lt;br /&gt;
--   dec2ent [2,3,4,5]  ==  2345&lt;br /&gt;
--   dec2ent [1..9]     ==  123456789&lt;br /&gt;
--&lt;br /&gt;
-- Defie esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
dec2ent1 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent1 xs = read (concat [show x| x &amp;lt;- (sort xs)]) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent2 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent2 xs = read (concat (map show (sort xs))) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent3 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent3Aux :: Show a =&amp;gt; [a] -&amp;gt; [Char]&lt;br /&gt;
dec2ent3Aux [] = []&lt;br /&gt;
dec2ent3Aux (x:xs) = (show x) ++ (dec2ent3Aux xs)&lt;br /&gt;
dec2ent3 xs = read (dec2ent3Aux (sort xs)) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent4 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent4 xs = read (concat (foldr f [] (sort xs))) :: Integer&lt;br /&gt;
            where f prim recu = show prim :recu&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
dec2entC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entC xs = sum [x*10^i | (x,i) &amp;lt;- zip xs (reverse [0..length xs-1])]&lt;br /&gt;
&lt;br /&gt;
dec2entS :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS xs = sum (map f xs)&lt;br /&gt;
            where f x = x*10^(length (dropWhile (/=x) xs) -1)&lt;br /&gt;
&lt;br /&gt;
-- profesor: solución vista en clase&lt;br /&gt;
dec2entS xs = sum (map f (zip xs [n-1,n-2..0]))&lt;br /&gt;
            where f (x,i) = x * 10^i&lt;br /&gt;
                  n = length xs -1&lt;br /&gt;
&lt;br /&gt;
dec2entR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entR [] = 0&lt;br /&gt;
dec2entR (x:xs) = x*10^(length xs) + dec2entR xs&lt;br /&gt;
&lt;br /&gt;
dec2entPR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entPR xs = foldr f 0 xs&lt;br /&gt;
             where f x recu = x*10^(length (dropWhile (/=x) xs) -1) + recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se considera la función&lt;br /&gt;
--     diferencia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (diferencia xs ys) es la diferencia entre los conjuntos xs e&lt;br /&gt;
-- ys; es decir, el conjunto de los elementos de la lista xs que no se&lt;br /&gt;
-- encuentran en la lista ys. Por ejemplo,&lt;br /&gt;
--   diferencia [2,3,5,6] [5,2,7]  ==  [3,6]&lt;br /&gt;
--   diferencia [1,3,5,7] [2,4,6]  ==  [1,3,5,7]&lt;br /&gt;
--   diferencia [1,3] [1..9]       ==  []&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
diferenciaC :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaC xs ys = [x | x &amp;lt;- xs, notElem x ys]&lt;br /&gt;
  &lt;br /&gt;
diferenciaS :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaS xs ys = concat (map f xs)&lt;br /&gt;
                  where f x | notElem x ys  = [x]&lt;br /&gt;
                            | otherwise     = []&lt;br /&gt;
  &lt;br /&gt;
diferenciaR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaR [] _ = []&lt;br /&gt;
diferenciaR (x:xs) ys | notElem x ys  = [x] ++ diferenciaR xs ys&lt;br /&gt;
                      | otherwise     = diferenciaR xs ys&lt;br /&gt;
  &lt;br /&gt;
diferenciaPR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaPR xs ys = foldr g [] xs&lt;br /&gt;
                   where g x recu | notElem x ys  = [x] ++ recu&lt;br /&gt;
                                  | otherwise     = recu&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
diferencia1 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia1 xs ys = [x | x &amp;lt;- xs, not (elem x ys) ] -- ++ [y | y &amp;lt;- ys, not (elem y xs) ]&lt;br /&gt;
&lt;br /&gt;
diferencia2 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia2 (x:xs) ys = filter f (x:xs)&lt;br /&gt;
                   where f a = not (elem a ys)&lt;br /&gt;
&lt;br /&gt;
diferencia3 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia3 [] _ = []&lt;br /&gt;
diferencia3 (x:xs) ys | not (elem x ys) = x : (diferencia3 xs ys)&lt;br /&gt;
                      | otherwise = (diferencia3 xs ys)&lt;br /&gt;
&lt;br /&gt;
diferencia4 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia4 (x:xs) ys = foldr f [] (x:xs)&lt;br /&gt;
                     where f prim recu | not (elem prim ys) = prim : recu&lt;br /&gt;
                                       | otherwise = recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Se considera la función&lt;br /&gt;
--   primerosYultimos :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
-- tal que (primerosYultimos xss) es el par formado por la lista de los&lt;br /&gt;
-- primeros elementos de las listas no vacías de xss y la lista de los&lt;br /&gt;
-- últimos elementos de las listas no vacías de xss. Por ejemplo,&lt;br /&gt;
--   primerosYultimos [[1,2],[5,3,4],[],[9]]  ==  ([1,5,9],[2,4,9])&lt;br /&gt;
--   primerosYultimos [[1,2],[1,2,3],[1..4]]  ==  ([1,1,1],[2,3,4])&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
primerosYultimos1 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos1 xss = ([head x | x &amp;lt;- xss, not (null x)], [last x | x &amp;lt;- xss, not (null x)]) &lt;br /&gt;
&lt;br /&gt;
noVacios :: Foldable t =&amp;gt; [t a] -&amp;gt; [t a]&lt;br /&gt;
noVacios xss = filter (not.null) xss&lt;br /&gt;
primerosYultimos2 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos2 xss = (map head (noVacios xss), map last (noVacios xss))&lt;br /&gt;
&lt;br /&gt;
primeros3 :: [[a]] -&amp;gt; [a]&lt;br /&gt;
primeros3 [] = []&lt;br /&gt;
primeros3 (xs:xss) | not (null xs) = (head xs) : (primeros3 xss)&lt;br /&gt;
                   | otherwise = (primeros3 xss)&lt;br /&gt;
ultimos3 :: [[a]] -&amp;gt; [a]&lt;br /&gt;
ultimos3 [] = []&lt;br /&gt;
ultimos3 (xs:xss) | not (null xs) = (last xs) : (ultimos3 xss)&lt;br /&gt;
                  | otherwise = (ultimos3 xss)&lt;br /&gt;
primerosYultimos3 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos3 xss = (primeros3 xss, ultimos3 xss )&lt;br /&gt;
&lt;br /&gt;
primeros4 :: Foldable t =&amp;gt; t [a] -&amp;gt; [a]&lt;br /&gt;
primeros4 xss = foldr p4 [] xss&lt;br /&gt;
             where p4 prim recu | not (null prim) = head prim : recu&lt;br /&gt;
                                | otherwise = recu&lt;br /&gt;
ultimos4 :: Foldable t =&amp;gt; t [a] -&amp;gt; [a]                                &lt;br /&gt;
ultimos4 xss = foldr u4 [] xss&lt;br /&gt;
             where u4 prim recu | not (null prim) = last prim : recu&lt;br /&gt;
                                | otherwise = recu&lt;br /&gt;
primerosYultimos4 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos4 xss = (primeros4 xss, ultimos4 xss)&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
primerosYultimosC :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosC xss = (concat [(take 1  xs) | xs &amp;lt;- xss], concat [take 1 (reverse xs) | xs &amp;lt;- xss])&lt;br /&gt;
                     &lt;br /&gt;
primerosYultimosS :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosS xss = (concat (map (take 1) xss), concat (map (take 1) (map reverse xss)))&lt;br /&gt;
&lt;br /&gt;
primerosYultimosR :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosR xss = (primerosR xss, ultimosR xss)&lt;br /&gt;
&lt;br /&gt;
primerosR [] = []&lt;br /&gt;
primerosR (xs:xss) | null xs    = primerosR xss&lt;br /&gt;
                   | otherwise  = [head xs] ++ primerosR xss&lt;br /&gt;
ultimosR [] = []&lt;br /&gt;
ultimosR (xs:xss) | null xs    = ultimosR xss&lt;br /&gt;
                  | otherwise  = [last xs] ++ ultimosR xss&lt;br /&gt;
                  &lt;br /&gt;
primerosYultimosPR :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosPR xss = (primerosPR xss, ultimosPR xss) &lt;br /&gt;
&lt;br /&gt;
primerosPR xss = foldr f [] xss&lt;br /&gt;
              where f x recu | null x     = recu&lt;br /&gt;
                             | otherwise  = [head x] ++ recu&lt;br /&gt;
ultimosPR xss = foldr f [] xss&lt;br /&gt;
              where f x recu | null x     = recu&lt;br /&gt;
                             | otherwise  = [last x] ++ recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una lista hermanada es una lista de números estrictamente&lt;br /&gt;
-- positivos en la que cada elemento tiene algún factor primo en común con el&lt;br /&gt;
-- siguiente, en caso de que exista, o alguno de los dos es un 1. Por ejemplo,&lt;br /&gt;
-- [2,6,3,9,1,5] es una lista hermanada.&lt;br /&gt;
&lt;br /&gt;
-- Se considera la función&lt;br /&gt;
--    hermanada :: [Int] -&amp;gt; Bool&lt;br /&gt;
-- tal que (hermanada xs) comprueba que la lista xs es hermanada según la&lt;br /&gt;
-- definición anterior. Por ejemplo,&lt;br /&gt;
--    hermanada [2,6,3,9,1,5]  ==  True&lt;br /&gt;
--    hermanada [2,3,5]        ==  False&lt;br /&gt;
--&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;gcd&amp;#039;&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
primo1 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo1 x = [1,x]==[a| a&amp;lt;- [1..x], rem x a == 0] -- Me dice si un número es primo&lt;br /&gt;
hermanada1 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada1 xs = sum [1 | (a,b) &amp;lt;- (zip xs (tail xs)), (if ((a/=1) &amp;amp;&amp;amp; (b/=1))&lt;br /&gt;
                                                  then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo1 (gcd a b)))&lt;br /&gt;
                                                  else True),&lt;br /&gt;
                                                                                a&amp;gt;0, b&amp;gt;0 ] == (length xs) -1&lt;br /&gt;
          -- a,b &amp;gt; 0 porque tienen que ser extrictamente positivos&lt;br /&gt;
          -- ((length xs) - 1) == length (zip xs (tail xs))&lt;br /&gt;
&lt;br /&gt;
primo2 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo2 x = filter p2 [1..x] == [1,x]&lt;br /&gt;
         where p2 b = (rem x b == 0)&lt;br /&gt;
hermanada2 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada2 xs = and (map prop2 (zip xs (tail xs)))&lt;br /&gt;
           where prop2 (a,b) = if a&amp;gt;0 &amp;amp;&amp;amp; b&amp;gt;0&lt;br /&gt;
                               then (if ((a/=1) &amp;amp;&amp;amp; (b/=1)) then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo2 (gcd a b))) else True)&lt;br /&gt;
                               else False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primo3 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo3 n = noHayNumerosDivisoresDe n 2 (n - 1)&lt;br /&gt;
noHayNumerosDivisoresDe :: Integral t =&amp;gt; t -&amp;gt; t -&amp;gt; t -&amp;gt; Bool&lt;br /&gt;
noHayNumerosDivisoresDe n minimo maximo   | minimo &amp;gt;= maximo  = True&lt;br /&gt;
                                          | rem n minimo == 0 = False&lt;br /&gt;
                                          | otherwise         = noHayNumerosDivisoresDe n (minimo + 1) maximo&lt;br /&gt;
hermanada3 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada3 [b] = True&lt;br /&gt;
hermanada3 (a:b:xs) = (if ((a/=1) &amp;amp;&amp;amp; (b/=1)) then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo2 (gcd a b))) else True)&lt;br /&gt;
                      &amp;amp;&amp;amp; hermanada3 (b:xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
hermanada4 xs = undefined&lt;br /&gt;
---------------------------------------------------------------------------------------&lt;br /&gt;
--Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
hermanadaC :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaC xs | elem 0 xs  = False&lt;br /&gt;
              | otherwise  = and [(gcd x y == x) || (gcd x y == y) || not (null (primeFactors (gcd x y))) | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
        &lt;br /&gt;
hermanadaS :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaS xs | elem 0 xs  = False&lt;br /&gt;
              | otherwise  = and (map f (zip xs (tail xs)))&lt;br /&gt;
              where f (x,y) = (gcd x y == x) || (gcd x y == y) || not (null (primeFactors (gcd x y)))&lt;br /&gt;
                                    &lt;br /&gt;
hermanadaR :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaR [x] = True&lt;br /&gt;
hermanadaR (x:y:xs) | elem 0 (x:y:xs)  = False&lt;br /&gt;
                    | otherwise        = ((gcd x y == x) || (gcd x y == y) || not (null (primeFactors (gcd x y)))) &amp;amp;&amp;amp; hermanadaR (y:xs)&lt;br /&gt;
&lt;br /&gt;
hermanadaPR :: [Int] -&amp;gt; Bool   &lt;br /&gt;
hermanadaPR xs | elem 0 xs = False&lt;br /&gt;
               | otherwise = foldr f True (zip xs (tail xs))&lt;br /&gt;
               where f (x,y) recu = ((gcd x y == x) || (gcd x y == y) || not (null (primeFactors (gcd x y)))) &amp;amp;&amp;amp; recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un elemento de una lista es permanente si ninguno de los que&lt;br /&gt;
-- vienen a continuación en la lista es mayor que él. Consideramos la función&lt;br /&gt;
--   permanentes :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (permanentes xs) es la lista de los elementos permanentes de la&lt;br /&gt;
-- lista xs. Por ejemplo,&lt;br /&gt;
--   permanentes [80,1,7,8,4]  ==  [80,8,4]&lt;br /&gt;
&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;tails&amp;#039; de Data.List.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
permanentes1 :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes1 xs = [a | (a,b) &amp;lt;- (zip xs (init (tails xs))), a == maximum b ]&lt;br /&gt;
&lt;br /&gt;
permanentes2 :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes2 xs = map head (filter p2 (init (tails xs)))&lt;br /&gt;
              where p2 (x:xs) = x == maximum (x:xs)&lt;br /&gt;
&lt;br /&gt;
comparacion3 :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
comparacion3 a [] = True&lt;br /&gt;
comparacion3 a b = a &amp;gt;= b &lt;br /&gt;
permanentes3 :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes3 [] = []&lt;br /&gt;
permanentes3 (x:xs) | [x] `comparacion3` [maximum3 xs] = x : permanentes3 xs&lt;br /&gt;
                    | otherwise = permanentes3 xs&lt;br /&gt;
                 where maximum3 [] = if x &amp;lt; 0 then x else -x&lt;br /&gt;
                       maximum3 xs = maximum xs&lt;br /&gt;
&lt;br /&gt;
permanentes4:: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes4 (x:xs) = foldr f4 [] (x:xs)&lt;br /&gt;
                    where f4 prim recu | [prim] `comparacion3` [maximum3 recu] = prim : recu&lt;br /&gt;
                                       | otherwise = recu&lt;br /&gt;
                          maximum3 [] = if x &amp;lt; 0 then x else -x&lt;br /&gt;
                          maximum3 xs = maximum xs&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
permanentesC :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesC xs = [x | (x, xs&amp;#039;) &amp;lt;- zip xs (tails (drop 1 xs)), xs&amp;#039; == [] || x &amp;gt;= maximum xs&amp;#039;] &lt;br /&gt;
&lt;br /&gt;
permanentesS :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesS xs = filter p xs&lt;br /&gt;
                where p x = x == maximum (dropWhile (/=x) xs)&lt;br /&gt;
  &lt;br /&gt;
permanentesR :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesR [] = []&lt;br /&gt;
permanentesR [x] = [x] &lt;br /&gt;
permanentesR (x:xs) | x &amp;gt;= maximum xs  = [x] ++ permanentesR xs&lt;br /&gt;
                    | otherwise        = permanentesR xs&lt;br /&gt;
                    &lt;br /&gt;
permanentesPR :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesPR (x:xs) = foldr f [] (x:xs)&lt;br /&gt;
                     where f x recu | x &amp;gt;= maximum&amp;#039; (dropWhile (/=x) xs)  = [x] ++ recu&lt;br /&gt;
                                    | otherwise                           = recu&lt;br /&gt;
maximum&amp;#039; xs | null xs    = 0&lt;br /&gt;
            | otherwise  = maximum xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Un número entero positivo n es muy primo si es n primo&lt;br /&gt;
-- y todos los números que resultan de ir suprimimiendo la última cifra&lt;br /&gt;
-- también son primos. Por ejemplo, 7193 es muy primo pues los números&lt;br /&gt;
-- 7193, 719, 71 y 7 son todos primos. &lt;br /&gt;
-- &lt;br /&gt;
-- Define la función &lt;br /&gt;
--    muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- que (muyPrimo n) se verifica si n es muy primo. Por ejemplo,&lt;br /&gt;
--    muyPrimo 7193  == True&lt;br /&gt;
--    muyPrimo 71932 == False&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
esPrimo :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
esPrimo x = filter p2 [1..x] == [1,x]&lt;br /&gt;
         where p2 b = (rem x b == 0)&lt;br /&gt;
muyPrimo :: Integer -&amp;gt; Bool         &lt;br /&gt;
muyPrimo n | esPrimo n = length (show n) == sum [1 | a &amp;lt;- (descomposicion n), esPrimo (read a :: Integer) ]&lt;br /&gt;
           | otherwise = False&lt;br /&gt;
           where descomposicion n =  [reverse x | x &amp;lt;- (init(tails (reverse (show n))))] &lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
muyPrimo&amp;#039; :: Integer -&amp;gt; Bool&lt;br /&gt;
muyPrimo&amp;#039; n = and (map isPrime (lista n))&lt;br /&gt;
lista n = [read a :: Integer | a &amp;lt;- tail (inits (show n))] &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- ¿Cuántos números de cinco cifras son muy primos?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
calculoMuyPrimo = sum [1 | x &amp;lt;- [10000..99999], muyPrimo x] -- Tras unos minutos, sale 15.&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
muyPrimos5cifras = sum [1 | x &amp;lt;- [10000..99999], muyPrimo&amp;#039; x] -- Sale 15 &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=457</id>
		<title>Informática (1º Matemáticas)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=457"/>
		<updated>2021-11-17T22:32:44Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: /* Relación de Ejercicios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==Relación de Ejercicios==&lt;br /&gt;
&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Definiciones por composición sobre números, listas y booleanos. [ [[Media:Rel_1.hs |Enunciado]], [[Relación 1 |Solución colaborativa]], [[Relación 1 Sol |Solución]]  ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Definiciones con condicionales, guardas o patrones. [ [[Media:Rel_2.hs |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Relación 2 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión. [ [[Media:Rel_3.hs |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Relación 3 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión (extra). [ [[Media:Rel_4.hs |Enunciado]], [[Relación 4 |Solución colaborativa editada]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión con cadenas: El cifrado césar. [ [[Media:Rel_5.hs |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Relación 5 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión. [ [[Media:Rel_6.hs |Enunciado]], [[Relación 6 |Solución colaborativa]], [[Relación 6 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión y comprensión (extra). [ [[Media:Rel_7.hs |Enunciado]], [[Relación 7 |Solución colaborativa]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]]&amp;lt;!--, [[Relación 8 Sol |Solución ]]--&amp;gt; ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados (extra). [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]] ]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: El algoritmo de Luhn. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones sobre cadenas. [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos, Árboles binarios. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10|Solución colaborativa]], [[Relación 10 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (II). [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11|Solución colaborativa]], [[Relación 11 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Propiedades del número 2021. [ [[Media:Rel_12.hs |Enunciado]], [[Relación 12 |Solución colaborativa]], [[Relación 12 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: Listas infinitas y evaluación perezosa. [ [[Media:Rel_13.hs |Enunciado]], [[Relación 13 |Solución colaborativa]], [[Relación 13 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la programación funcional con listas infinitas. [ [[Media:Rel_14.hs |Enunciado]], [[Relación 14 colab|Solución colaborativa]], [[Relación 14|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: Ecuación con factoriales. [ [[Media:Rel_15.hs |Enunciado]], [[Relación 15 colab |Solución colaborativa]], [[Relación 15 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 16&amp;#039;&amp;#039;&amp;#039;: El juego del nim y las funciones de entrada/salida. [ [[Media:Rel_16.hs |Enunciado]], [[Relación 16 colab|Solución colaborativa]], [[Relación 16 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 17&amp;#039;&amp;#039;&amp;#039;: Cálculo del número pi mediante el método de Montecarlo. [ [[Media:Rel_17.hs |Enunciado]], [[Relación 17 |Solución colaborativa]], [[Rel 17 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 18&amp;#039;&amp;#039;&amp;#039;: Aproximaciones de pi. [ [[Media:Rel_18.hs |Enunciado]], [http://www.cs.us.es/~mjoseh/Digitos_de_pi.txt Fichero con los dígitos de pi], [[Relación 18 |Solución colaborativa]], [[Rel 18 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 19&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices. [ [[Media:Rel_19.hs |Enunciado]], [[Relación 19 |Solución colaborativa]], [[Relación 19 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Método de Gauss para triangularizar matrices. [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 |Solución colaborativa]], [[Relación 20 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 21&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices con librerías Data.Matrix y Data.Vector. [ [[Media:Rel_21.hs |Enunciado]], [[Relación 21 |Solución colaborativa]], [[Relación 21 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 22&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices: ejercicios de exámenes (para repasar). [ [[Media:Rel_22.hs |Enunciado]], [[Relación 22 |Solución colaborativa]], [[Relación 22 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 23&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_23.hs |Enunciado]], [[Relación 23 |Solución colaborativa]], [[Relación 23 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico (2): límites, bisección, integrales y bajada. [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva. [ [[Media:Rel_25.hs |Enunciado]], [[Relación 25 |Solución colaborativa]], [[Relación 25 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 26&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva con librerías (solucionada). [ [[Relación 26 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 27&amp;#039;&amp;#039;&amp;#039;: Combinatoria. [ [[Media:Rel_27.hs |Enunciado]], [[Relación 27 |Solución colaborativa]], [[Relación 27 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: El TAD de las pilas.  [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 |Solución colaborativa]], [[Relación 28 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de las colas.  [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 |Solución colaborativa]], [[Relación 29 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de conjuntos.  [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 colab |Solución colaborativa]], [[Relación 31 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 32&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. Regla de Ruffini. [ [[Media:Rel_32.hs |Enunciado]], [[Relación 32 colab |Solución colaborativa]], [[Relación 32 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g1.hs |Enunciado]], [[Exam 3g1 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g2.hs |Enunciado]], [[Exam 3g2 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de los montículos. Librería en https://cutt.ly/tbDyRlr [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Media:Relación_33_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Media:Relación_34_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería Data.Set. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 |Solución colaborativa]], [[Media:Relación_35_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 36&amp;#039;&amp;#039;&amp;#039;: Problemas básicos con el TAD de los grafos. [ [[Media:Rel_36.hs |Enunciado]], [[Relación 36 Colab |Solución colaborativa]], [[Media:Relación_36_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante listas. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica I&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_1.hs |Enunciado]], [[Programación dinámica I |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica II&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_2.hs |Enunciado]], [[Programación Dinámica II |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Grafos&amp;#039;&amp;#039;&amp;#039;: Ejercicios de examen sobre grafos. ([[Media:masgrafos.hs |Enunciado]], [[Grafos (Ej. examen) |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Técnica Divide y vencerás&amp;#039;&amp;#039;&amp;#039;: Puzzle. ([[Media:triomino.hs |Enunciado]], [[Triominos |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica III&amp;#039;&amp;#039;&amp;#039;: Ejercicios de programación dinámica. ([[Media:dinamica3_3.hs |Enunciado]], [[Programación Dinámica III |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso I&amp;#039;&amp;#039;&amp;#039;. ([[Media:Lychrel.hs |Enunciado]], [[Repaso I. Números de Lychrel |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso II: ejercicios de examen&amp;#039;&amp;#039;&amp;#039;. ([[Media:ejExamenes.hs |Enunciado]], [[Repaso II.  |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios Complementarios.&amp;#039;&amp;#039;&amp;#039;([[Media:ejcomplementarios.hs |Enunciado]], [[Ejercicios Complementarios|Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Más ejercicios de examen.&amp;#039;&amp;#039;&amp;#039;([[Media:ejExam.hs |Enunciado]], [[Ejercicios de examen|Solución colaborativa]]).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;!-- EJERCICIOS DEL CURSO PASADO&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Ejercicios de exámenes sobre grafos. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 Colab |Solución colaborativa]], [[Relación 37 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~mjoseh/cursos/i1m-20/doc/manual-Data.Set.html Data.Set]. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Relación 34 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico en Maxima: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_25.mac |Enunciado]], [[Relación 25 |Solución colaborativa]] [[Relación 25 Sol |Solución]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/manual-Data.Set.html Data.Set] (erratas solucionadas). [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 colab |Solución colaborativa]], [[Relación 28 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: División y factorización de polinomios mediante la regla de Ruffini. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Caminos en una retícula. [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Apilamiento de barriles. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 |Solución colaborativa]], [[Relación 31 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante diccionarios. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 Colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de los multiconjuntos mediante diccionarios. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: El problema del granjero mediante búsqueda en espacio de estado. [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Relación 33 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Resolución de problemas mediante búsqueda en espacios de estados. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 colab |Solución colaborativa]], [[Relación 35 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados de repaso.  [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 colab |Solución colaborativa]] ]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Curso Actual==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 1&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(12/11/2021)&amp;#039;&amp;#039;: [ [[Media:Exam1_G2.hs |Enunciado]], [[Parcial 1 |Solución colaborativa]], [[Parcial 1 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 2&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(20/01/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 3&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(08/04/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 4&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(10/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 5&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(24/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Cursos Anteriores==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://github.com/jaalonso/Examenes_de_PF_con_Haskell/blob/master/README.org Repositorio de Exámenes]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Curso 2020/21 Grupo 2&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 11/12/20 |Examen 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(11/12/2020)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 16/02/21 |Examen 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(16/02/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 23/04/21 |Examen 3 Turno 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(23/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 28/04/21 |Examen 3 Turno 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(28/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 21/06/21 |Examen 4]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(21/06/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 05/07/2021 |Examen Julio]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(05/07/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 07/09/2021 |Examen Septiembre]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(07/09/2021)&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=456</id>
		<title>Relación 9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=456"/>
		<updated>2021-11-17T22:32:13Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Página creada con «&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;  -- I1M 2021-22: Rel_9.hs (01 de diciembre de 2021) -- Funciones de orden superior y definiciones por plegados (II) -- Departamento de Ciencias de l…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Rel_9.hs (01 de diciembre de 2021)&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados (II)&lt;br /&gt;
-- Departamento de Ciencias de la Computación e Inteligencia Artificial&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Librerías auxiliares&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
import Data.Char&lt;br /&gt;
import Data.List&lt;br /&gt;
-- El siguiente módulo hay que instalarlo:&lt;br /&gt;
--cabal install Primes&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Se considera la función&lt;br /&gt;
--      resultadoPos :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (resultadoPos f xs) es la lista de los elementos de la lista&lt;br /&gt;
-- xs tales que el valor de la función f sobre ellos es positivo. Por ejemplo,&lt;br /&gt;
--   resultadoPos head [[-1,2],[-9,4],[2,3]]       ==  [[2,3]]&lt;br /&gt;
--   resultadoPos sum [[1,2],[9],[-8,3],[],[3,5]]  ==  [[1,2],[9],[3,5]]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Se considera la función&lt;br /&gt;
--     intercala :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (intercala y xs) es la lista que resulta de intercalar el elemento&lt;br /&gt;
-- y delante de todos los elementos de la lista xs que sean menores que y.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--   intercala 5 [1,2,6,3,7,9]  ==  [5,1,5,2,6,5,3,7,9]&lt;br /&gt;
--   intercala 5 [6,7,9,8]      ==  [6,7,9,8]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Se considera la función&lt;br /&gt;
--    dec2ent :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (dec2ent xs) es el número entero cuyas cifras ordenadas son los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo,&lt;br /&gt;
--   dec2ent [2,3,4,5]  ==  2345&lt;br /&gt;
--   dec2ent [1..9]     ==  123456789&lt;br /&gt;
--&lt;br /&gt;
-- Defie esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se considera la función&lt;br /&gt;
--     diferencia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (diferencia xs ys) es la diferencia entre los conjuntos xs e&lt;br /&gt;
-- ys; es decir, el conjunto de los elementos de la lista xs que no se&lt;br /&gt;
-- encuentran en la lista ys. Por ejemplo,&lt;br /&gt;
--   diferencia [2,3,5,6] [5,2,7]  ==  [3,6]&lt;br /&gt;
--   diferencia [1,3,5,7] [2,4,6]  ==  [1,3,5,7]&lt;br /&gt;
--   diferencia [1,3] [1..9]       ==  []&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Se considera la función&lt;br /&gt;
--   primerosYultimos :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
-- tal que (primerosYultimos xss) es el par formado por la lista de los&lt;br /&gt;
-- primeros elementos de las listas no vacías de xss y la lista de los&lt;br /&gt;
-- últimos elementos de las listas no vacías de xss. Por ejemplo,&lt;br /&gt;
--   primerosYultimos [[1,2],[5,3,4],[],[9]]  ==  ([1,5,9],[2,4,9])&lt;br /&gt;
--   primerosYultimos [[1,2],[1,2,3],[1..4]]  ==  ([1,1,1],[2,3,4])&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una lista hermanada es una lista de números estrictamente&lt;br /&gt;
-- positivos en la que cada elemento tiene algún factor primo en común con el&lt;br /&gt;
-- siguiente, en caso de que exista, o alguno de los dos es un 1. Por ejemplo,&lt;br /&gt;
-- [2,6,3,9,1,5] es una lista hermanada.&lt;br /&gt;
&lt;br /&gt;
-- Se considera la función&lt;br /&gt;
--    hermanada :: [Int] -&amp;gt; Bool&lt;br /&gt;
-- tal que (hermanada xs) comprueba que la lista xs es hermanada según la&lt;br /&gt;
-- definición anterior. Por ejemplo,&lt;br /&gt;
--    hermanada [2,6,3,9,1,5]  ==  True&lt;br /&gt;
--    hermanada [2,3,5]        ==  False&lt;br /&gt;
--&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;gcd&amp;#039;&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un elemento de una lista es permanente si ninguno de los que&lt;br /&gt;
-- vienen a continuación en la lista es mayor que él. Consideramos la función&lt;br /&gt;
--   permanentes :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (permanentes xs) es la lista de los elementos permanentes de la&lt;br /&gt;
-- lista xs. Por ejemplo,&lt;br /&gt;
--   permanentes [80,1,7,8,4]  ==  [80,8,4]&lt;br /&gt;
&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;tails&amp;#039; de Data.List.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
               &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Un número entero positivo n es muy primo si es n primo&lt;br /&gt;
-- y todos los números que resultan de ir suprimimiendo la última cifra&lt;br /&gt;
-- también son primos. Por ejemplo, 7193 es muy primo pues los números&lt;br /&gt;
-- 7193, 719, 71 y 7 son todos primos. &lt;br /&gt;
-- &lt;br /&gt;
-- Define la función &lt;br /&gt;
--    muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- que (muyPrimo n) se verifica si n es muy primo. Por ejemplo,&lt;br /&gt;
--    muyPrimo 7193  == True&lt;br /&gt;
--    muyPrimo 71932 == False&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- ¿Cuántos números de cinco cifras son muy primos?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Archivo:Rel_9.hs&amp;diff=455</id>
		<title>Archivo:Rel 9.hs</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Archivo:Rel_9.hs&amp;diff=455"/>
		<updated>2021-11-17T22:31:46Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8_Sol&amp;diff=454</id>
		<title>Relación 8 Sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8_Sol&amp;diff=454"/>
		<updated>2021-11-17T22:31:32Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Protegió «Relación 8 Sol» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Rel_8_sol.hs&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados.&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Esta relación tiene contiene ejercicios con funciones de orden&lt;br /&gt;
-- superior y definiciones por plegado correspondientes al tema 7 &lt;br /&gt;
-- http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-7.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías auxiliares                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función&lt;br /&gt;
--    segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (segmentos p xs) es la lista de los segmentos de xs cuyos&lt;br /&gt;
-- elementos verifican la propiedad p. Por ejemplo,&lt;br /&gt;
--    segmentos even [1,2,0,4,9,6,4,5,7,2]  ==  [[2,0,4],[6,4],[2]]&lt;br /&gt;
--    segmentos odd  [1,2,0,4,9,6,4,5,7,2]  ==  [[1],[9],[5,7]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentos _ [] = []&lt;br /&gt;
segmentos p (x:xs) &lt;br /&gt;
    | p x       = takeWhile p (x:xs) : segmentos p (dropWhile p xs)&lt;br /&gt;
    | otherwise = segmentos p xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir, por comprensión, la función&lt;br /&gt;
--    relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosC r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC r xs = and [r x y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir, por recursión, la función&lt;br /&gt;
--    relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosR r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosR (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosR (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR r (x:y:zs) = r x y &amp;amp;&amp;amp; relacionadosR r (y:zs)&lt;br /&gt;
relacionadosR _ _        = True&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir la función&lt;br /&gt;
--    agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (agrupa xss) es la lista de las listas obtenidas agrupando&lt;br /&gt;
-- los primeros elementos, los segundos, ... Por ejemplo, &lt;br /&gt;
--    agrupa [[1..6],[7..9],[10..20]]  ==  [[1,7,10],[2,8,11],[3,9,12]]&lt;br /&gt;
--    agrupa []                        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
agrupa []  = []&lt;br /&gt;
agrupa xss&lt;br /&gt;
    | [] `elem` xss = []&lt;br /&gt;
    | otherwise     = primeros xss : agrupa (restos xss)&lt;br /&gt;
    where primeros = map head&lt;br /&gt;
          restos   = map tail&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Comprobar con QuickChek que la longitud de todos los&lt;br /&gt;
-- elementos de (agrupa xs) es igual a la longitud de xs.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_agrupa :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_agrupa xss =&lt;br /&gt;
    and [length xs == n | xs &amp;lt;- agrupa xss]&lt;br /&gt;
    where n = length xss&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_agrupa&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
comprueba_agrupa :: IO ()&lt;br /&gt;
comprueba_agrupa =&lt;br /&gt;
  quickCheck prop_agrupa&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. Definir, por recursión, la función &lt;br /&gt;
--    concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatR xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatR [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatR []       = []&lt;br /&gt;
concatR (xs:xss) = xs ++ concatR xss&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. Definir, por comprensión, la función&lt;br /&gt;
--    filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaC f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaC (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaC f p xs = [f x | x &amp;lt;- xs, p x]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir, usando map y filter, la función&lt;br /&gt;
--    filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaMF f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaMF (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaMF f p xs = map f (filter p xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir, por recursión, la función&lt;br /&gt;
--    filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaR f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaR (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaR _ _ [] = []&lt;br /&gt;
filtraAplicaR f p (x:xs) | p x       = f x : filtraAplicaR f p xs&lt;br /&gt;
                         | otherwise = filtraAplicaR f p xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Definir, mediante recursión, la función&lt;br /&gt;
--    maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumR [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumR [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumR [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumR es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumR [x]      = x&lt;br /&gt;
maximumR (x:y:ys) = max x (maximumR (y:ys))&lt;br /&gt;
maximumR _        = error &amp;quot;Imposible&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. La función de plegado foldr1 está definida por &lt;br /&gt;
--    foldr1 :: (a -&amp;gt; a -&amp;gt; a) -&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
--    foldr1 _ [x]    =  x&lt;br /&gt;
--    foldr1 f (x:xs) =  f x (foldr1 f xs)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir, mediante plegado con foldr1, la función&lt;br /&gt;
--    maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumP [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumP [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumP [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumP es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumP = foldr1 max&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir, usando foldr, la función &lt;br /&gt;
--    concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatP xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatP [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatP = foldr (++) []&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que la funciones concatR,&lt;br /&gt;
-- concatP y concat son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_concat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_concat xss =&lt;br /&gt;
  concatR xss == ys &amp;amp;&amp;amp; concatP xss == ys&lt;br /&gt;
  where ys = concat xss&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_concat&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que la longitud de &lt;br /&gt;
-- (concatP xss) es la suma de las longitudes de los elementos de xss.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_longConcat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_longConcat xss =&lt;br /&gt;
    length (concatP xss) == sum [length xs | xs &amp;lt;- xss]&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_longConcat&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir, por plegado, la función&lt;br /&gt;
--    filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaP f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaP (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaP f p = foldr g []&lt;br /&gt;
    where g x y | p x       = f x : y&lt;br /&gt;
                | otherwise = y&lt;br /&gt;
&lt;br /&gt;
-- La definición por plegado usando lambda es&lt;br /&gt;
filtraAplicaP2 :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaP2 f p = &lt;br /&gt;
    foldr (\x y -&amp;gt; if p x then f x : y else y) []&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, con la función all, la función&lt;br /&gt;
--    relacionadosA :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosA r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosA (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosA (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Se redefine la relación &amp;#039;r&amp;#039; con &amp;#039;rpar&amp;#039; para que se aplique a pares&lt;br /&gt;
relacionadosA :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosA r xs = all rpar (zip xs (tail xs))&lt;br /&gt;
  where rpar (x,y) = r x y&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, con la función foldr, la función&lt;br /&gt;
--    relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosP r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosP (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosP (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosP r xs = foldr rfpar True (zip xs (tail xs))&lt;br /&gt;
  where rfpar (x,y) b = (r x y) &amp;amp;&amp;amp; b&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.3. (Basado en el ejercicio 4 del primer parcial)&lt;br /&gt;
-- Una lista se dirá muy creciente si cada elemento es mayor estricto&lt;br /&gt;
-- que el triple del siguiente. &lt;br /&gt;
-- Empleando tan solo (relacionadosA p xs), define el predicado &lt;br /&gt;
--          muyCreciente :: [Integer] -&amp;gt; Bool&lt;br /&gt;
-- tal que (muyCreciente xs) se verifica si xs es muy creciente. Por&lt;br /&gt;
-- ejemplo:&lt;br /&gt;
-- muyCreciente [1,5,23,115]  == True&lt;br /&gt;
-- muyCreciente [1,2,7,14]    == False&lt;br /&gt;
-- muyCreciente [7]           == True&lt;br /&gt;
-- muyCreciente []            == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
muyCreciente :: [Integer] -&amp;gt; Bool&lt;br /&gt;
muyCreciente xs = relacionadosA relMuyCreciente xs&lt;br /&gt;
  where relMuyCreciente a b = b &amp;gt; a*3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8_Sol&amp;diff=453</id>
		<title>Relación 8 Sol</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8_Sol&amp;diff=453"/>
		<updated>2021-11-17T22:31:23Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Página creada con «&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;  -- I1M 2021-22: Rel_8_sol.hs -- Funciones de orden superior y definiciones por plegados. -- Departamento de Ciencias de la Computación e I.A. -- U…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Rel_8_sol.hs&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados.&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Esta relación tiene contiene ejercicios con funciones de orden&lt;br /&gt;
-- superior y definiciones por plegado correspondientes al tema 7 &lt;br /&gt;
-- http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-7.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías auxiliares                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función&lt;br /&gt;
--    segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (segmentos p xs) es la lista de los segmentos de xs cuyos&lt;br /&gt;
-- elementos verifican la propiedad p. Por ejemplo,&lt;br /&gt;
--    segmentos even [1,2,0,4,9,6,4,5,7,2]  ==  [[2,0,4],[6,4],[2]]&lt;br /&gt;
--    segmentos odd  [1,2,0,4,9,6,4,5,7,2]  ==  [[1],[9],[5,7]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentos _ [] = []&lt;br /&gt;
segmentos p (x:xs) &lt;br /&gt;
    | p x       = takeWhile p (x:xs) : segmentos p (dropWhile p xs)&lt;br /&gt;
    | otherwise = segmentos p xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir, por comprensión, la función&lt;br /&gt;
--    relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosC r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC r xs = and [r x y | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir, por recursión, la función&lt;br /&gt;
--    relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosR r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosR (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosR (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR r (x:y:zs) = r x y &amp;amp;&amp;amp; relacionadosR r (y:zs)&lt;br /&gt;
relacionadosR _ _        = True&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir la función&lt;br /&gt;
--    agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (agrupa xss) es la lista de las listas obtenidas agrupando&lt;br /&gt;
-- los primeros elementos, los segundos, ... Por ejemplo, &lt;br /&gt;
--    agrupa [[1..6],[7..9],[10..20]]  ==  [[1,7,10],[2,8,11],[3,9,12]]&lt;br /&gt;
--    agrupa []                        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
agrupa []  = []&lt;br /&gt;
agrupa xss&lt;br /&gt;
    | [] `elem` xss = []&lt;br /&gt;
    | otherwise     = primeros xss : agrupa (restos xss)&lt;br /&gt;
    where primeros = map head&lt;br /&gt;
          restos   = map tail&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Comprobar con QuickChek que la longitud de todos los&lt;br /&gt;
-- elementos de (agrupa xs) es igual a la longitud de xs.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_agrupa :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_agrupa xss =&lt;br /&gt;
    and [length xs == n | xs &amp;lt;- agrupa xss]&lt;br /&gt;
    where n = length xss&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_agrupa&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
comprueba_agrupa :: IO ()&lt;br /&gt;
comprueba_agrupa =&lt;br /&gt;
  quickCheck prop_agrupa&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. Definir, por recursión, la función &lt;br /&gt;
--    concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatR xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatR [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatR []       = []&lt;br /&gt;
concatR (xs:xss) = xs ++ concatR xss&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. Definir, por comprensión, la función&lt;br /&gt;
--    filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaC f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaC (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaC f p xs = [f x | x &amp;lt;- xs, p x]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir, usando map y filter, la función&lt;br /&gt;
--    filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaMF f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaMF (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaMF f p xs = map f (filter p xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir, por recursión, la función&lt;br /&gt;
--    filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaR f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaR (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaR _ _ [] = []&lt;br /&gt;
filtraAplicaR f p (x:xs) | p x       = f x : filtraAplicaR f p xs&lt;br /&gt;
                         | otherwise = filtraAplicaR f p xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Definir, mediante recursión, la función&lt;br /&gt;
--    maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumR [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumR [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumR [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumR es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumR [x]      = x&lt;br /&gt;
maximumR (x:y:ys) = max x (maximumR (y:ys))&lt;br /&gt;
maximumR _        = error &amp;quot;Imposible&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. La función de plegado foldr1 está definida por &lt;br /&gt;
--    foldr1 :: (a -&amp;gt; a -&amp;gt; a) -&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
--    foldr1 _ [x]    =  x&lt;br /&gt;
--    foldr1 f (x:xs) =  f x (foldr1 f xs)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir, mediante plegado con foldr1, la función&lt;br /&gt;
--    maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumP [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumP [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumP [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumP es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumP = foldr1 max&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir, usando foldr, la función &lt;br /&gt;
--    concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatP xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatP [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatP = foldr (++) []&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que la funciones concatR,&lt;br /&gt;
-- concatP y concat son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_concat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_concat xss =&lt;br /&gt;
  concatR xss == ys &amp;amp;&amp;amp; concatP xss == ys&lt;br /&gt;
  where ys = concat xss&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_concat&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que la longitud de &lt;br /&gt;
-- (concatP xss) es la suma de las longitudes de los elementos de xss.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_longConcat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_longConcat xss =&lt;br /&gt;
    length (concatP xss) == sum [length xs | xs &amp;lt;- xss]&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_longConcat&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir, por plegado, la función&lt;br /&gt;
--    filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaP f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaP (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaP f p = foldr g []&lt;br /&gt;
    where g x y | p x       = f x : y&lt;br /&gt;
                | otherwise = y&lt;br /&gt;
&lt;br /&gt;
-- La definición por plegado usando lambda es&lt;br /&gt;
filtraAplicaP2 :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaP2 f p = &lt;br /&gt;
    foldr (\x y -&amp;gt; if p x then f x : y else y) []&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, con la función all, la función&lt;br /&gt;
--    relacionadosA :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosA r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosA (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosA (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Se redefine la relación &amp;#039;r&amp;#039; con &amp;#039;rpar&amp;#039; para que se aplique a pares&lt;br /&gt;
relacionadosA :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosA r xs = all rpar (zip xs (tail xs))&lt;br /&gt;
  where rpar (x,y) = r x y&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, con la función foldr, la función&lt;br /&gt;
--    relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosP r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosP (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosP (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosP r xs = foldr rfpar True (zip xs (tail xs))&lt;br /&gt;
  where rfpar (x,y) b = (r x y) &amp;amp;&amp;amp; b&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.3. (Basado en el ejercicio 4 del primer parcial)&lt;br /&gt;
-- Una lista se dirá muy creciente si cada elemento es mayor estricto&lt;br /&gt;
-- que el triple del siguiente. &lt;br /&gt;
-- Empleando tan solo (relacionadosA p xs), define el predicado &lt;br /&gt;
--          muyCreciente :: [Integer] -&amp;gt; Bool&lt;br /&gt;
-- tal que (muyCreciente xs) se verifica si xs es muy creciente. Por&lt;br /&gt;
-- ejemplo:&lt;br /&gt;
-- muyCreciente [1,5,23,115]  == True&lt;br /&gt;
-- muyCreciente [1,2,7,14]    == False&lt;br /&gt;
-- muyCreciente [7]           == True&lt;br /&gt;
-- muyCreciente []            == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
muyCreciente :: [Integer] -&amp;gt; Bool&lt;br /&gt;
muyCreciente xs = relacionadosA relMuyCreciente xs&lt;br /&gt;
  where relMuyCreciente a b = b &amp;gt; a*3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8&amp;diff=452</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8&amp;diff=452"/>
		<updated>2021-11-17T22:30:44Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Página creada con «&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;  -- I1M 2021-22: Rel_8.hs (24 de noviembre de 2021) -- Funciones de orden superior y definiciones por plegados. -- Departamento de Ciencias de la Co…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Rel_8.hs (24 de noviembre de 2021)&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados.&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Esta relación tiene contiene ejercicios con funciones de orden&lt;br /&gt;
-- superior y definiciones por plegado correspondientes al tema 7 &lt;br /&gt;
-- http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-7.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías auxiliares                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función&lt;br /&gt;
--    segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (segmentos p xs) es la lista de los segmentos de xs cuyos&lt;br /&gt;
-- elementos verifican la propiedad p. Por ejemplo,&lt;br /&gt;
--    segmentos even [1,2,0,4,9,6,4,5,7,2]  ==  [[2,0,4],[6,4],[2]]&lt;br /&gt;
--    segmentos odd  [1,2,0,4,9,6,4,5,7,2]  ==  [[1],[9],[5,7]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentos = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir, por comprensión, la función&lt;br /&gt;
--    relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosC r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC r xs = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir, por recursión, la función&lt;br /&gt;
--    relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosR r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosR (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosR (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir la función&lt;br /&gt;
--    agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (agrupa xss) es la lista de las listas obtenidas agrupando&lt;br /&gt;
-- los primeros elementos, los segundos, ... Por ejemplo, &lt;br /&gt;
--    agrupa [[1..6],[7..9],[10..20]]  ==  [[1,7,10],[2,8,11],[3,9,12]]&lt;br /&gt;
--    agrupa []                        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
agrupa = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Comprobar con QuickChek que la longitud de todos los&lt;br /&gt;
-- elementos de (agrupa xs) es igual a la longitud de xs.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_agrupa :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_agrupa xss = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir, por recursión, la función &lt;br /&gt;
--    concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatR xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatR [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatR = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. Definir, por comprensión, la función&lt;br /&gt;
--    filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaC f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaC (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaC f p xs = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir, usando map y filter, la función&lt;br /&gt;
--    filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaMF f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaMF (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaMF f p xs = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir, por recursión, la función&lt;br /&gt;
--    filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaR f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaR (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaR = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Definir, mediante recursión, la función&lt;br /&gt;
--    maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumR [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumR [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumR [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumR es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumR = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. La función de plegado foldr1 está definida por &lt;br /&gt;
--    foldr1 :: (a -&amp;gt; a -&amp;gt; a) -&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
--    foldr1 _ [x]    =  x&lt;br /&gt;
--    foldr1 f (x:xs) =  f x (foldr1 f xs)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir, mediante plegado con foldr1, la función&lt;br /&gt;
--    maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumP [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumP [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumP [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumP es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumP = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir, usando foldr, la función &lt;br /&gt;
--    concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatP xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatP [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatP = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que la funciones concatR,&lt;br /&gt;
-- concatP y concat son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_concat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_concat xss = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que la longitud de &lt;br /&gt;
-- (concatP xss) es la suma de las longitudes de los elementos de xss.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_longConcat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_longConcat xss = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir, por plegado, la función&lt;br /&gt;
--    filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaP f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaP (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaP f p = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, con la función all, la función&lt;br /&gt;
--    relacionadosA :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosA r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosA (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosA (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
relacionadosA :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosA = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, con la función foldr, la función&lt;br /&gt;
--    relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosP r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosP (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosP (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosP = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.3. (Basado en el ejercicio 4 del primer parcial del&lt;br /&gt;
-- grupo E de 2017)&lt;br /&gt;
-- Una lista se dirá muy creciente si cada elemento es mayor estricto&lt;br /&gt;
-- que el triple del siguiente. &lt;br /&gt;
-- Empleando tan solo (relacionadosA p xs), define el predicado &lt;br /&gt;
--          muyCreciente :: [Integer] -&amp;gt; Bool&lt;br /&gt;
-- tal que (muyCreciente xs) se verifica si xs es muy creciente. Por&lt;br /&gt;
-- ejemplo:&lt;br /&gt;
-- muyCreciente [1,5,23,115]  == True&lt;br /&gt;
-- muyCreciente [1,2,7,14]    == False&lt;br /&gt;
-- muyCreciente [7]           == True&lt;br /&gt;
-- muyCreciente []            == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
muyCreciente :: [Integer] -&amp;gt; Bool&lt;br /&gt;
muyCreciente xs = undefined&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Archivo:Rel_8.hs&amp;diff=451</id>
		<title>Archivo:Rel 8.hs</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Archivo:Rel_8.hs&amp;diff=451"/>
		<updated>2021-11-17T22:30:15Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=450</id>
		<title>Informática (1º Matemáticas)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=450"/>
		<updated>2021-11-17T22:29:56Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: /* Relación de Ejercicios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==Relación de Ejercicios==&lt;br /&gt;
&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Definiciones por composición sobre números, listas y booleanos. [ [[Media:Rel_1.hs |Enunciado]], [[Relación 1 |Solución colaborativa]], [[Relación 1 Sol |Solución]]  ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Definiciones con condicionales, guardas o patrones. [ [[Media:Rel_2.hs |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Relación 2 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión. [ [[Media:Rel_3.hs |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Relación 3 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión (extra). [ [[Media:Rel_4.hs |Enunciado]], [[Relación 4 |Solución colaborativa editada]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión con cadenas: El cifrado césar. [ [[Media:Rel_5.hs |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Relación 5 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión. [ [[Media:Rel_6.hs |Enunciado]], [[Relación 6 |Solución colaborativa]], [[Relación 6 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión y comprensión (extra). [ [[Media:Rel_7.hs |Enunciado]], [[Relación 7 |Solución colaborativa]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados (extra). [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]] ]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: El algoritmo de Luhn. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones sobre cadenas. [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos, Árboles binarios. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10|Solución colaborativa]], [[Relación 10 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (II). [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11|Solución colaborativa]], [[Relación 11 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Propiedades del número 2021. [ [[Media:Rel_12.hs |Enunciado]], [[Relación 12 |Solución colaborativa]], [[Relación 12 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: Listas infinitas y evaluación perezosa. [ [[Media:Rel_13.hs |Enunciado]], [[Relación 13 |Solución colaborativa]], [[Relación 13 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la programación funcional con listas infinitas. [ [[Media:Rel_14.hs |Enunciado]], [[Relación 14 colab|Solución colaborativa]], [[Relación 14|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: Ecuación con factoriales. [ [[Media:Rel_15.hs |Enunciado]], [[Relación 15 colab |Solución colaborativa]], [[Relación 15 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 16&amp;#039;&amp;#039;&amp;#039;: El juego del nim y las funciones de entrada/salida. [ [[Media:Rel_16.hs |Enunciado]], [[Relación 16 colab|Solución colaborativa]], [[Relación 16 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 17&amp;#039;&amp;#039;&amp;#039;: Cálculo del número pi mediante el método de Montecarlo. [ [[Media:Rel_17.hs |Enunciado]], [[Relación 17 |Solución colaborativa]], [[Rel 17 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 18&amp;#039;&amp;#039;&amp;#039;: Aproximaciones de pi. [ [[Media:Rel_18.hs |Enunciado]], [http://www.cs.us.es/~mjoseh/Digitos_de_pi.txt Fichero con los dígitos de pi], [[Relación 18 |Solución colaborativa]], [[Rel 18 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 19&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices. [ [[Media:Rel_19.hs |Enunciado]], [[Relación 19 |Solución colaborativa]], [[Relación 19 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Método de Gauss para triangularizar matrices. [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 |Solución colaborativa]], [[Relación 20 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 21&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices con librerías Data.Matrix y Data.Vector. [ [[Media:Rel_21.hs |Enunciado]], [[Relación 21 |Solución colaborativa]], [[Relación 21 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 22&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices: ejercicios de exámenes (para repasar). [ [[Media:Rel_22.hs |Enunciado]], [[Relación 22 |Solución colaborativa]], [[Relación 22 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 23&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_23.hs |Enunciado]], [[Relación 23 |Solución colaborativa]], [[Relación 23 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico (2): límites, bisección, integrales y bajada. [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva. [ [[Media:Rel_25.hs |Enunciado]], [[Relación 25 |Solución colaborativa]], [[Relación 25 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 26&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva con librerías (solucionada). [ [[Relación 26 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 27&amp;#039;&amp;#039;&amp;#039;: Combinatoria. [ [[Media:Rel_27.hs |Enunciado]], [[Relación 27 |Solución colaborativa]], [[Relación 27 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: El TAD de las pilas.  [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 |Solución colaborativa]], [[Relación 28 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de las colas.  [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 |Solución colaborativa]], [[Relación 29 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de conjuntos.  [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 colab |Solución colaborativa]], [[Relación 31 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 32&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. Regla de Ruffini. [ [[Media:Rel_32.hs |Enunciado]], [[Relación 32 colab |Solución colaborativa]], [[Relación 32 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g1.hs |Enunciado]], [[Exam 3g1 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g2.hs |Enunciado]], [[Exam 3g2 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de los montículos. Librería en https://cutt.ly/tbDyRlr [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Media:Relación_33_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Media:Relación_34_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería Data.Set. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 |Solución colaborativa]], [[Media:Relación_35_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 36&amp;#039;&amp;#039;&amp;#039;: Problemas básicos con el TAD de los grafos. [ [[Media:Rel_36.hs |Enunciado]], [[Relación 36 Colab |Solución colaborativa]], [[Media:Relación_36_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante listas. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica I&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_1.hs |Enunciado]], [[Programación dinámica I |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica II&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_2.hs |Enunciado]], [[Programación Dinámica II |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Grafos&amp;#039;&amp;#039;&amp;#039;: Ejercicios de examen sobre grafos. ([[Media:masgrafos.hs |Enunciado]], [[Grafos (Ej. examen) |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Técnica Divide y vencerás&amp;#039;&amp;#039;&amp;#039;: Puzzle. ([[Media:triomino.hs |Enunciado]], [[Triominos |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica III&amp;#039;&amp;#039;&amp;#039;: Ejercicios de programación dinámica. ([[Media:dinamica3_3.hs |Enunciado]], [[Programación Dinámica III |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso I&amp;#039;&amp;#039;&amp;#039;. ([[Media:Lychrel.hs |Enunciado]], [[Repaso I. Números de Lychrel |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso II: ejercicios de examen&amp;#039;&amp;#039;&amp;#039;. ([[Media:ejExamenes.hs |Enunciado]], [[Repaso II.  |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios Complementarios.&amp;#039;&amp;#039;&amp;#039;([[Media:ejcomplementarios.hs |Enunciado]], [[Ejercicios Complementarios|Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Más ejercicios de examen.&amp;#039;&amp;#039;&amp;#039;([[Media:ejExam.hs |Enunciado]], [[Ejercicios de examen|Solución colaborativa]]).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;!-- EJERCICIOS DEL CURSO PASADO&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Ejercicios de exámenes sobre grafos. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 Colab |Solución colaborativa]], [[Relación 37 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~mjoseh/cursos/i1m-20/doc/manual-Data.Set.html Data.Set]. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Relación 34 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico en Maxima: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_25.mac |Enunciado]], [[Relación 25 |Solución colaborativa]] [[Relación 25 Sol |Solución]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/manual-Data.Set.html Data.Set] (erratas solucionadas). [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 colab |Solución colaborativa]], [[Relación 28 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: División y factorización de polinomios mediante la regla de Ruffini. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Caminos en una retícula. [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Apilamiento de barriles. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 |Solución colaborativa]], [[Relación 31 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante diccionarios. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 Colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de los multiconjuntos mediante diccionarios. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: El problema del granjero mediante búsqueda en espacio de estado. [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Relación 33 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Resolución de problemas mediante búsqueda en espacios de estados. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 colab |Solución colaborativa]], [[Relación 35 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados de repaso.  [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 colab |Solución colaborativa]] ]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Curso Actual==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 1&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(12/11/2021)&amp;#039;&amp;#039;: [ [[Media:Exam1_G2.hs |Enunciado]], [[Parcial 1 |Solución colaborativa]], [[Parcial 1 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 2&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(20/01/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 3&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(08/04/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 4&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(10/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 5&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(24/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Cursos Anteriores==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://github.com/jaalonso/Examenes_de_PF_con_Haskell/blob/master/README.org Repositorio de Exámenes]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Curso 2020/21 Grupo 2&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 11/12/20 |Examen 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(11/12/2020)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 16/02/21 |Examen 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(16/02/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 23/04/21 |Examen 3 Turno 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(23/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 28/04/21 |Examen 3 Turno 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(28/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 21/06/21 |Examen 4]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(21/06/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 05/07/2021 |Examen Julio]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(05/07/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 07/09/2021 |Examen Septiembre]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(07/09/2021)&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=449</id>
		<title>Informática (1º Matemáticas)</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Inform%C3%A1tica_(1%C2%BA_Matem%C3%A1ticas)&amp;diff=449"/>
		<updated>2021-11-17T22:23:22Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: /* Exámenes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==Relación de Ejercicios==&lt;br /&gt;
&lt;br /&gt;
En esta página se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Definiciones por composición sobre números, listas y booleanos. [ [[Media:Rel_1.hs |Enunciado]], [[Relación 1 |Solución colaborativa]], [[Relación 1 Sol |Solución]]  ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Definiciones con condicionales, guardas o patrones. [ [[Media:Rel_2.hs |Enunciado]], [[Relación 2 |Solución colaborativa]], [[Relación 2 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión. [ [[Media:Rel_3.hs |Enunciado]], [[Relación 3 |Solución colaborativa]], [[Relación 3 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión (extra). [ [[Media:Rel_4.hs |Enunciado]], [[Relación 4 |Solución colaborativa editada]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Definiciones por comprensión con cadenas: El cifrado césar. [ [[Media:Rel_5.hs |Enunciado]], [[Relación 5 |Solución colaborativa]], [[Relación 5 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión. [ [[Media:Rel_6.hs |Enunciado]], [[Relación 6 |Solución colaborativa]], [[Relación 6 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Definiciones por recursión y comprensión (extra). [ [[Media:Rel_7.hs |Enunciado]], [[Relación 7 |Solución colaborativa]] ]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados. [ [[Media:Rel_6.hs |Enunciado]], [[Relación 6 |Solución colaborativa]], [[Relación 6 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Funciones de orden superior y definiciones por plegados (II). [ [[Media:Rel_7.hs |Enunciado]], [[Relación 7 |Solución colaborativa]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: El algoritmo de Luhn. [ [[Media:Rel_8.hs |Enunciado]], [[Relación 8 |Solución colaborativa]], [[Relación 8 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Funciones sobre cadenas. [ [[Media:Rel_9.hs |Enunciado]], [[Relación 9 |Solución colaborativa]], [[Relación 9 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos, Árboles binarios. [ [[Media:Rel_10.hs |Enunciado]], [[Relación 10|Solución colaborativa]], [[Relación 10 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Tipos de datos algebraicos (II). [ [[Media:Rel_11.hs |Enunciado]], [[Relación 11|Solución colaborativa]], [[Relación 11 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 12&amp;#039;&amp;#039;&amp;#039;: Propiedades del número 2021. [ [[Media:Rel_12.hs |Enunciado]], [[Relación 12 |Solución colaborativa]], [[Relación 12 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 13&amp;#039;&amp;#039;&amp;#039;: Listas infinitas y evaluación perezosa. [ [[Media:Rel_13.hs |Enunciado]], [[Relación 13 |Solución colaborativa]], [[Relación 13 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 14&amp;#039;&amp;#039;&amp;#039;: Aplicaciones de la programación funcional con listas infinitas. [ [[Media:Rel_14.hs |Enunciado]], [[Relación 14 colab|Solución colaborativa]], [[Relación 14|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 15&amp;#039;&amp;#039;&amp;#039;: Ecuación con factoriales. [ [[Media:Rel_15.hs |Enunciado]], [[Relación 15 colab |Solución colaborativa]], [[Relación 15 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 16&amp;#039;&amp;#039;&amp;#039;: El juego del nim y las funciones de entrada/salida. [ [[Media:Rel_16.hs |Enunciado]], [[Relación 16 colab|Solución colaborativa]], [[Relación 16 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 17&amp;#039;&amp;#039;&amp;#039;: Cálculo del número pi mediante el método de Montecarlo. [ [[Media:Rel_17.hs |Enunciado]], [[Relación 17 |Solución colaborativa]], [[Rel 17 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 18&amp;#039;&amp;#039;&amp;#039;: Aproximaciones de pi. [ [[Media:Rel_18.hs |Enunciado]], [http://www.cs.us.es/~mjoseh/Digitos_de_pi.txt Fichero con los dígitos de pi], [[Relación 18 |Solución colaborativa]], [[Rel 18 sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 19&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices. [ [[Media:Rel_19.hs |Enunciado]], [[Relación 19 |Solución colaborativa]], [[Relación 19 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Método de Gauss para triangularizar matrices. [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 |Solución colaborativa]], [[Relación 20 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 21&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices con librerías Data.Matrix y Data.Vector. [ [[Media:Rel_21.hs |Enunciado]], [[Relación 21 |Solución colaborativa]], [[Relación 21 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 22&amp;#039;&amp;#039;&amp;#039;: Vectores y matrices: ejercicios de exámenes (para repasar). [ [[Media:Rel_22.hs |Enunciado]], [[Relación 22 |Solución colaborativa]], [[Relación 22 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 23&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_23.hs |Enunciado]], [[Relación 23 |Solución colaborativa]], [[Relación 23 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico (2): límites, bisección, integrales y bajada. [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva. [ [[Media:Rel_25.hs |Enunciado]], [[Relación 25 |Solución colaborativa]], [[Relación 25 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 26&amp;#039;&amp;#039;&amp;#039;: Estadística descriptiva con librerías (solucionada). [ [[Relación 26 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 27&amp;#039;&amp;#039;&amp;#039;: Combinatoria. [ [[Media:Rel_27.hs |Enunciado]], [[Relación 27 |Solución colaborativa]], [[Relación 27 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: El TAD de las pilas.  [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 |Solución colaborativa]], [[Relación 28 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de las colas.  [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 |Solución colaborativa]], [[Relación 29 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de conjuntos.  [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 colab |Solución colaborativa]], [[Relación 31 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 32&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. Regla de Ruffini. [ [[Media:Rel_32.hs |Enunciado]], [[Relación 32 colab |Solución colaborativa]], [[Relación 32 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g1.hs |Enunciado]], [[Exam 3g1 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios examen&amp;#039;&amp;#039;&amp;#039;: Pilas, árboles, matrices. [ [[Media:Exam3g2.hs |Enunciado]], [[Exam 3g2 colab |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de los montículos. Librería en https://cutt.ly/tbDyRlr [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Media:Relación_33_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Media:Relación_34_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería Data.Set. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 |Solución colaborativa]], [[Media:Relación_35_sol.hs| Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 36&amp;#039;&amp;#039;&amp;#039;: Problemas básicos con el TAD de los grafos. [ [[Media:Rel_36.hs |Enunciado]], [[Relación 36 Colab |Solución colaborativa]], [[Media:Relación_36_sol.hs|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante listas. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 |Solución colaborativa]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica I&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_1.hs |Enunciado]], [[Programación dinámica I |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica II&amp;#039;&amp;#039;&amp;#039;: Ejercicios de recursión/ programación dinámica. ([[Media:dinamica_2.hs |Enunciado]], [[Programación Dinámica II |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Grafos&amp;#039;&amp;#039;&amp;#039;: Ejercicios de examen sobre grafos. ([[Media:masgrafos.hs |Enunciado]], [[Grafos (Ej. examen) |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Técnica Divide y vencerás&amp;#039;&amp;#039;&amp;#039;: Puzzle. ([[Media:triomino.hs |Enunciado]], [[Triominos |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programación Dinámica III&amp;#039;&amp;#039;&amp;#039;: Ejercicios de programación dinámica. ([[Media:dinamica3_3.hs |Enunciado]], [[Programación Dinámica III |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso I&amp;#039;&amp;#039;&amp;#039;. ([[Media:Lychrel.hs |Enunciado]], [[Repaso I. Números de Lychrel |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Repaso II: ejercicios de examen&amp;#039;&amp;#039;&amp;#039;. ([[Media:ejExamenes.hs |Enunciado]], [[Repaso II.  |Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejercicios Complementarios.&amp;#039;&amp;#039;&amp;#039;([[Media:ejcomplementarios.hs |Enunciado]], [[Ejercicios Complementarios|Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Más ejercicios de examen.&amp;#039;&amp;#039;&amp;#039;([[Media:ejExam.hs |Enunciado]], [[Ejercicios de examen|Solución colaborativa]]).&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;!-- EJERCICIOS DEL CURSO PASADO&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 37&amp;#039;&amp;#039;&amp;#039;: Ejercicios de exámenes sobre grafos. [ [[Media:Rel_37.hs |Enunciado]], [[Relación 37 Colab |Solución colaborativa]], [[Relación 37 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~mjoseh/cursos/i1m-20/doc/manual-Data.Set.html Data.Set]. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 |Solución colaborativa]], [[Relación 34 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 25&amp;#039;&amp;#039;&amp;#039;: Cálculo numérico en Maxima: Diferenciación y métodos de Herón y de Newton. [ [[Media:Rel_25.mac |Enunciado]], [[Relación 25 |Solución colaborativa]] [[Relación 25 Sol |Solución]]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 24&amp;#039;&amp;#039;&amp;#039;: Relaciones binarias homogéneas con la librería [http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/manual-Data.Set.html Data.Set] (erratas solucionadas). [ [[Media:Rel_24.hs |Enunciado]], [[Relación 24 |Solución colaborativa]], [[Relación 24 Sol | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 28&amp;#039;&amp;#039;&amp;#039;: Operaciones con el TAD de polinomios. [ [[Media:Rel_28.hs |Enunciado]], [[Relación 28 colab |Solución colaborativa]], [[Relación 28 sol|Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: División y factorización de polinomios mediante la regla de Ruffini. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 30&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Caminos en una retícula. [ [[Media:Rel_30.hs |Enunciado]], [[Relación 30 |Solución colaborativa]], [[Relación 30 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 31&amp;#039;&amp;#039;&amp;#039;: Programación dinámica: Apilamiento de barriles. [ [[Media:Rel_31.hs |Enunciado]], [[Relación 31 |Solución colaborativa]], [[Relación 31 Sol |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Implementación del TAD de los grafos mediante diccionarios. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 Colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 29&amp;#039;&amp;#039;&amp;#039;: El TAD de los multiconjuntos mediante diccionarios. [ [[Media:Rel_29.hs |Enunciado]], [[Relación 29 colab |Solución colaborativa]], [[Relación 29 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 33&amp;#039;&amp;#039;&amp;#039;: El problema del granjero mediante búsqueda en espacio de estado. [ [[Media:Rel_33.hs |Enunciado]], [[Relación 33 colab |Solución colaborativa]], [[Relación 33 |Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 34&amp;#039;&amp;#039;&amp;#039;: Resolución de problemas mediante búsqueda en espacios de estados. [ [[Media:Rel_34.hs |Enunciado]], [[Relación 34 colab |Solución colaborativa]], [[Relación 34 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 35&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados. [ [[Media:Rel_35.hs |Enunciado]], [[Relación 35 colab |Solución colaborativa]], [[Relación 35 | Solución]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 20&amp;#039;&amp;#039;&amp;#039;: Ejercicios variados de repaso.  [ [[Media:Rel_20.hs |Enunciado]], [[Relación 20 colab |Solución colaborativa]] ]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Curso Actual==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 1&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(12/11/2021)&amp;#039;&amp;#039;: [ [[Media:Exam1_G2.hs |Enunciado]], [[Parcial 1 |Solución colaborativa]], [[Parcial 1 Sol |Solución ]] ]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 2&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(20/01/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 3&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(08/04/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 4&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(10/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Examen 5&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(24/06/2022)&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Exámenes Cursos Anteriores==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://github.com/jaalonso/Examenes_de_PF_con_Haskell/blob/master/README.org Repositorio de Exámenes]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Curso 2020/21 Grupo 2&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 11/12/20 |Examen 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(11/12/2020)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 16/02/21 |Examen 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(16/02/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 23/04/21 |Examen 3 Turno 2]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(23/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 28/04/21 |Examen 3 Turno 1]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(28/04/21)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 21/06/21 |Examen 4]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(21/06/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 05/07/2021 |Examen Julio]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(05/07/2021)&amp;#039;&amp;#039;&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;[[Examen 07/09/2021 |Examen Septiembre]]&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;(07/09/2021)&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Examen_07/09/2021&amp;diff=448</id>
		<title>Examen 07/09/2021</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Examen_07/09/2021&amp;diff=448"/>
		<updated>2021-11-17T22:19:31Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- Informática (1º del Grado en Matemáticas)&lt;br /&gt;
-- 2ª convocatoria&lt;br /&gt;
&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
-- Nombre: &lt;br /&gt;
-- Apellidos: &lt;br /&gt;
-- UVUS:&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías                                           --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Data.Matrix&lt;br /&gt;
import qualified Data.Set as S&lt;br /&gt;
import qualified Data.Vector as V&lt;br /&gt;
import Data.List&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import I1M.Cola&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Una permutación de n se representa como una lista de los&lt;br /&gt;
-- elementos 1..n. Por ejemplo, la lista [3,1,2,4] representa la&lt;br /&gt;
-- permutación tal que corresponde con la transformación:&lt;br /&gt;
--      1 -&amp;gt; 3&lt;br /&gt;
--      2 -&amp;gt; 1&lt;br /&gt;
--      3 -&amp;gt; 2&lt;br /&gt;
--      4 -&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   compPermutaciones :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (compPermutaciones p q) es composición de las permutaciones p&lt;br /&gt;
-- y q. Por ejemplo, si p = [1,3,4,2] y q = [3,1,2,4], la composición&lt;br /&gt;
-- es:&lt;br /&gt;
--     1 -&amp;gt; 1 -&amp;gt; 3&lt;br /&gt;
--     2 -&amp;gt; 3 -&amp;gt; 2&lt;br /&gt;
--     3 -&amp;gt; 4 -&amp;gt; 4&lt;br /&gt;
--     4 -&amp;gt; 2 -&amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
--   compPermutaciones [1,3,4,2] [3,1,2,4] == [3,2,4,1]&lt;br /&gt;
&lt;br /&gt;
compPermutaciones :: [Int] -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
compPermutaciones p q = &lt;br /&gt;
    map snd (comp (zip [1..n] p) (zip [1..n] q))&lt;br /&gt;
        where n = length p&lt;br /&gt;
              comp r s = [(x,z) | (x,y) &amp;lt;- r, (y&amp;#039;,z) &amp;lt;-s, y == y&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Se tienen n cartas numeradas en un único montón en orden&lt;br /&gt;
-- creciente desde arriba hacia abajo; es decir, la carta de más arriba&lt;br /&gt;
-- es la número 1, luego sigue la número 2, ...&lt;br /&gt;
-- &lt;br /&gt;
-- Se hace lo siguiente: &lt;br /&gt;
-- + se coloca la carta número 1 debajo de todas, &lt;br /&gt;
-- + se quita de arriba la carta número 2, &lt;br /&gt;
-- + se coloca la carta número 3 debajo de todas, &lt;br /&gt;
-- + se quita de arriba la carta número 4, &lt;br /&gt;
-- + ...  &lt;br /&gt;
-- &lt;br /&gt;
-- El proceso continúa siempre de la misma manera: se coloca la carta de&lt;br /&gt;
-- más arriba debajo de todas y se quita la que ha quedado arriba, hasta&lt;br /&gt;
-- que quede una única carta.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    cartaFinal :: Int -&amp;gt; Int&lt;br /&gt;
-- tal que (cartaFinal n) es la carta final que queda en el montón. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cartaFinal 4   == 1&lt;br /&gt;
--    cartaFinal 7   == 7&lt;br /&gt;
--    cartaFinal 10  == 5&lt;br /&gt;
--    cartaFinal 20  == 9&lt;br /&gt;
--    cartaFinal 100 == 73&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Usando listas:&lt;br /&gt;
&lt;br /&gt;
cartaFinal :: Int -&amp;gt; Int&lt;br /&gt;
cartaFinal n = head (until pred paso [1..n])&lt;br /&gt;
  where paso (x:xs) = tail (xs++[x])&lt;br /&gt;
        pred (x:xs) = null xs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Usando colas:&lt;br /&gt;
&lt;br /&gt;
cartaFinalC :: Int -&amp;gt; Int&lt;br /&gt;
cartaFinalC n = primero (until pred paso cInicial)&lt;br /&gt;
  where cInicial = foldr inserta vacia [n,n-1..1]&lt;br /&gt;
        pred c = not (esVacia c) &amp;amp;&amp;amp; esVacia (resto c)&lt;br /&gt;
        paso c = resto (inserta (primero c) (resto c))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Dada una matriz A, de dimensión n×n , sea X_i el&lt;br /&gt;
-- conjunto de elementos de la fila i, e Y_j el conjunto de elementos de&lt;br /&gt;
-- la columna j, 1 ≤ i, j ≤ n. Decimos que A es dorada si&lt;br /&gt;
-- X_1,...,X_n,Y_1,...,Y_n son conjuntos distintos.&lt;br /&gt;
&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     esMatrizDorada :: Ord a =&amp;gt; Matrix a -&amp;gt; Bool&lt;br /&gt;
-- tal que (esMatrizDorada A) verifique si A es dorada. Por ejemplo,&lt;br /&gt;
--     esMatrizDorada (fromLists [[1,2,1],[1,1,1],[2,2,2]]) == False&lt;br /&gt;
--     esMatrizDorada (fromLists [[1,2,1],[1,1,1],[3,3,4]]) == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esMatrizDorada :: Ord a =&amp;gt; Matrix a -&amp;gt; Bool&lt;br /&gt;
esMatrizDorada p =  &lt;br /&gt;
  conjDistintosLista (filas p ++ columnas p)&lt;br /&gt;
  where n = nrows p&lt;br /&gt;
        filas p = [S.fromList (V.toList (getRow i p)) | i &amp;lt;-[1..n]]&lt;br /&gt;
        columnas p = [S.fromList (V.toList (getCol i p)) | i &amp;lt;-[1..n]]&lt;br /&gt;
&lt;br /&gt;
conjDistintosLista :: Ord a =&amp;gt; [S.Set a] -&amp;gt; Bool&lt;br /&gt;
conjDistintosLista []       = True&lt;br /&gt;
conjDistintosLista (xs:xss) = &lt;br /&gt;
  all (not . ((==) xs)) xss &amp;amp;&amp;amp; conjDistintosLista xss&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Consideremos el problema de construir los árboles&lt;br /&gt;
-- etiquetados en las hojas, a partir de una lista xs, de forma que el&lt;br /&gt;
-- borde del árbol consista en los elementos de esta lista. Por ejemplo,&lt;br /&gt;
-- si xs = [1,2,3], los árboles que se obtienen son los siguientes:&lt;br /&gt;
&lt;br /&gt;
--          .              .&lt;br /&gt;
--         / \            / \&lt;br /&gt;
--        1   .          .   3&lt;br /&gt;
--           / \        / \&lt;br /&gt;
--          2   3      1   2&lt;br /&gt;
&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     arboles:: [Int] -&amp;gt; [Arbol]&lt;br /&gt;
-- tal que (arboles xs) es la lista de los árboles que se pueden&lt;br /&gt;
-- construir de forma que los elementos que constituyen su borde es la&lt;br /&gt;
-- lista xs. Por ejemplo,&lt;br /&gt;
--      arboles [1..3] = [Nodo (Hoja 1) (Nodo (Hoja 2) (Hoja 3)),&lt;br /&gt;
--                        Nodo (Nodo (Hoja 1) (Hoja 2)) (Hoja 3)]&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol = Hoja Int | Nodo Arbol Arbol &lt;br /&gt;
             deriving Show&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Definimos la función arboles, de forma recursiva&lt;br /&gt;
&lt;br /&gt;
arboles:: [Int] -&amp;gt; [Arbol]&lt;br /&gt;
arboles [x] = [Hoja x]&lt;br /&gt;
arboles (x:xs) = concatMap (prefijos x) (arboles xs)&lt;br /&gt;
&lt;br /&gt;
-- (prefijos x a) es la lista de todas las formas en la que x puede ser&lt;br /&gt;
-- insertada como la hoja más a la izquierda en el árbol a. Por ejemplo,&lt;br /&gt;
-- si el árbol es &lt;br /&gt;
--      .&lt;br /&gt;
--     / \&lt;br /&gt;
--    2   3&lt;br /&gt;
--&lt;br /&gt;
-- hay dos formas de insertar 1 de forma que sea la hoja más a la&lt;br /&gt;
-- izquierda:&lt;br /&gt;
&lt;br /&gt;
--          .              .&lt;br /&gt;
--         / \            / \&lt;br /&gt;
--        1   .          .   3&lt;br /&gt;
--           / \        / \&lt;br /&gt;
--          2   3      1   2&lt;br /&gt;
&lt;br /&gt;
prefijos:: Int -&amp;gt; Arbol -&amp;gt; [Arbol]&lt;br /&gt;
prefijos x a@(Hoja y) = [Nodo (Hoja x) a]&lt;br /&gt;
prefijos x a@(Nodo i d) = &lt;br /&gt;
    (Nodo (Hoja x) a):[Nodo i&amp;#039; d | i&amp;#039; &amp;lt;- prefijos x i]&lt;br /&gt;
&lt;br /&gt;
-- prefijos 1 (Nodo (Hoja 2) (Hoja 3))&lt;br /&gt;
-- [Nodo (Hoja 1) (Nodo (Hoja 2) (Hoja 3)),&lt;br /&gt;
--  Nodo (Nodo (Hoja 1) (Hoja 2)) (Hoja 3)]&lt;br /&gt;
&lt;br /&gt;
-- arboles [1..3]&lt;br /&gt;
-- [Nodo (Hoja 1) (Nodo (Hoja 2) (Hoja 3)),&lt;br /&gt;
--  Nodo (Nodo (Hoja 1) (Hoja 2)) (Hoja 3)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Examen_07/09/2021&amp;diff=447</id>
		<title>Examen 07/09/2021</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Examen_07/09/2021&amp;diff=447"/>
		<updated>2021-11-17T22:18:52Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Protegió «Examen 07/09/2021» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- Informática (1º del Grado en Matemáticas)&lt;br /&gt;
-- 2ª convocatoria&lt;br /&gt;
&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
-- Nombre: &lt;br /&gt;
-- Apellidos: &lt;br /&gt;
-- UVUS:&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías                                           --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Data.Matrix&lt;br /&gt;
import qualified Data.Set as S&lt;br /&gt;
import qualified Data.Vector as V&lt;br /&gt;
import Data.List&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import I1M.Cola&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio ?. Una permutación de n se representa como una lista de los&lt;br /&gt;
-- elementos 1..n. Por ejemplo, la lista [3,1,2,4] representa la&lt;br /&gt;
-- permutación tal que corresponde con la transformación:&lt;br /&gt;
--      1 -&amp;gt; 3&lt;br /&gt;
--      2 -&amp;gt; 1&lt;br /&gt;
--      3 -&amp;gt; 2&lt;br /&gt;
--      4 -&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   compPermutaciones :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (compPermutaciones p q) es composición de las permutaciones p&lt;br /&gt;
-- y q. Por ejemplo, si p = [1,3,4,2] y q = [3,1,2,4], la composición&lt;br /&gt;
-- es:&lt;br /&gt;
--     1 -&amp;gt; 1 -&amp;gt; 3&lt;br /&gt;
--     2 -&amp;gt; 3 -&amp;gt; 2&lt;br /&gt;
--     3 -&amp;gt; 4 -&amp;gt; 4&lt;br /&gt;
--     4 -&amp;gt; 2 -&amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
--   compPermutaciones [1,3,4,2] [3,1,2,4] == [3,2,4,1]&lt;br /&gt;
&lt;br /&gt;
compPermutaciones :: [Int] -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
compPermutaciones p q = &lt;br /&gt;
    map snd (comp (zip [1..n] p) (zip [1..n] q))&lt;br /&gt;
        where n = length p&lt;br /&gt;
              comp r s = [(x,z) | (x,y) &amp;lt;- r, (y&amp;#039;,z) &amp;lt;-s, y == y&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio ?. Se tienen n cartas numeradas en un único montón en orden&lt;br /&gt;
-- creciente desde arriba hacia abajo; es decir, la carta de más arriba&lt;br /&gt;
-- es la número 1, luego sigue la número 2, ...&lt;br /&gt;
-- &lt;br /&gt;
-- Se hace lo siguiente: &lt;br /&gt;
-- + se coloca la carta número 1 debajo de todas, &lt;br /&gt;
-- + se quita de arriba la carta número 2, &lt;br /&gt;
-- + se coloca la carta número 3 debajo de todas, &lt;br /&gt;
-- + se quita de arriba la carta número 4, &lt;br /&gt;
-- + ...  &lt;br /&gt;
-- &lt;br /&gt;
-- El proceso continúa siempre de la misma manera: se coloca la carta de&lt;br /&gt;
-- más arriba debajo de todas y se quita la que ha quedado arriba, hasta&lt;br /&gt;
-- que quede una única carta.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    cartaFinal :: Int -&amp;gt; Int&lt;br /&gt;
-- tal que (cartaFinal n) es la carta final que queda en el montón. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cartaFinal 4   == 1&lt;br /&gt;
--    cartaFinal 7   == 7&lt;br /&gt;
--    cartaFinal 10  == 5&lt;br /&gt;
--    cartaFinal 20  == 9&lt;br /&gt;
--    cartaFinal 100 == 73&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Usando listas:&lt;br /&gt;
&lt;br /&gt;
cartaFinal :: Int -&amp;gt; Int&lt;br /&gt;
cartaFinal n = head (until pred paso [1..n])&lt;br /&gt;
  where paso (x:xs) = tail (xs++[x])&lt;br /&gt;
        pred (x:xs) = null xs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Usando colas:&lt;br /&gt;
&lt;br /&gt;
cartaFinalC :: Int -&amp;gt; Int&lt;br /&gt;
cartaFinalC n = primero (until pred paso cInicial)&lt;br /&gt;
  where cInicial = foldr inserta vacia [n,n-1..1]&lt;br /&gt;
        pred c = not (esVacia c) &amp;amp;&amp;amp; esVacia (resto c)&lt;br /&gt;
        paso c = resto (inserta (primero c) (resto c))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio ?. Dada una matriz A, de dimensión n×n , sea X_i el&lt;br /&gt;
-- conjunto de elementos de la fila i, e Y_j el conjunto de elementos de&lt;br /&gt;
-- la columna j, 1 ≤ i, j ≤ n. Decimos que A es dorada si&lt;br /&gt;
-- X_1,...,X_n,Y_1,...,Y_n son conjuntos distintos.&lt;br /&gt;
&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     esMatrizDorada :: Ord a =&amp;gt; Matrix a -&amp;gt; Bool&lt;br /&gt;
-- tal que (esMatrizDorada A) verifique si A es dorada. Por ejemplo,&lt;br /&gt;
--     esMatrizDorada (fromLists [[1,2,1],[1,1,1],[2,2,2]]) == False&lt;br /&gt;
--     esMatrizDorada (fromLists [[1,2,1],[1,1,1],[3,3,4]]) == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esMatrizDorada :: Ord a =&amp;gt; Matrix a -&amp;gt; Bool&lt;br /&gt;
esMatrizDorada p =  &lt;br /&gt;
  conjDistintosLista (filas p ++ columnas p)&lt;br /&gt;
  where n = nrows p&lt;br /&gt;
        filas p = [S.fromList (V.toList (getRow i p)) | i &amp;lt;-[1..n]]&lt;br /&gt;
        columnas p = [S.fromList (V.toList (getCol i p)) | i &amp;lt;-[1..n]]&lt;br /&gt;
&lt;br /&gt;
conjDistintosLista :: Ord a =&amp;gt; [S.Set a] -&amp;gt; Bool&lt;br /&gt;
conjDistintosLista []       = True&lt;br /&gt;
conjDistintosLista (xs:xss) = &lt;br /&gt;
  all (not . ((==) xs)) xss &amp;amp;&amp;amp; conjDistintosLista xss&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio ?. Consideremos el problema de construir los árboles&lt;br /&gt;
-- etiquetados en las hojas, a partir de una lista xs, de forma que el&lt;br /&gt;
-- borde del árbol consista en los elementos de esta lista. Por ejemplo,&lt;br /&gt;
-- si xs = [1,2,3], los árboles que se obtienen son los siguientes:&lt;br /&gt;
&lt;br /&gt;
--          .              .&lt;br /&gt;
--         / \            / \&lt;br /&gt;
--        1   .          .   3&lt;br /&gt;
--           / \        / \&lt;br /&gt;
--          2   3      1   2&lt;br /&gt;
&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     arboles:: [Int] -&amp;gt; [Arbol]&lt;br /&gt;
-- tal que (arboles xs) es la lista de los árboles que se pueden&lt;br /&gt;
-- construir de forma que los elementos que constituyen su borde es la&lt;br /&gt;
-- lista xs. Por ejemplo,&lt;br /&gt;
--      arboles [1..3] = [Nodo (Hoja 1) (Nodo (Hoja 2) (Hoja 3)),&lt;br /&gt;
--                        Nodo (Nodo (Hoja 1) (Hoja 2)) (Hoja 3)]&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol = Hoja Int | Nodo Arbol Arbol &lt;br /&gt;
             deriving Show&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Definimos la función arboles, de forma recursiva&lt;br /&gt;
&lt;br /&gt;
arboles:: [Int] -&amp;gt; [Arbol]&lt;br /&gt;
arboles [x] = [Hoja x]&lt;br /&gt;
arboles (x:xs) = concatMap (prefijos x) (arboles xs)&lt;br /&gt;
&lt;br /&gt;
-- (prefijos x a) es la lista de todas las formas en la que x puede ser&lt;br /&gt;
-- insertada como la hoja más a la izquierda en el árbol a. Por ejemplo,&lt;br /&gt;
-- si el árbol es &lt;br /&gt;
--      .&lt;br /&gt;
--     / \&lt;br /&gt;
--    2   3&lt;br /&gt;
--&lt;br /&gt;
-- hay dos formas de insertar 1 de forma que sea la hoja más a la&lt;br /&gt;
-- izquierda:&lt;br /&gt;
&lt;br /&gt;
--          .              .&lt;br /&gt;
--         / \            / \&lt;br /&gt;
--        1   .          .   3&lt;br /&gt;
--           / \        / \&lt;br /&gt;
--          2   3      1   2&lt;br /&gt;
&lt;br /&gt;
prefijos:: Int -&amp;gt; Arbol -&amp;gt; [Arbol]&lt;br /&gt;
prefijos x a@(Hoja y) = [Nodo (Hoja x) a]&lt;br /&gt;
prefijos x a@(Nodo i d) = &lt;br /&gt;
    (Nodo (Hoja x) a):[Nodo i&amp;#039; d | i&amp;#039; &amp;lt;- prefijos x i]&lt;br /&gt;
&lt;br /&gt;
-- prefijos 1 (Nodo (Hoja 2) (Hoja 3))&lt;br /&gt;
-- [Nodo (Hoja 1) (Nodo (Hoja 2) (Hoja 3)),&lt;br /&gt;
--  Nodo (Nodo (Hoja 1) (Hoja 2)) (Hoja 3)]&lt;br /&gt;
&lt;br /&gt;
-- arboles [1..3]&lt;br /&gt;
-- [Nodo (Hoja 1) (Nodo (Hoja 2) (Hoja 3)),&lt;br /&gt;
--  Nodo (Nodo (Hoja 1) (Hoja 2)) (Hoja 3)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Examen_07/09/2021&amp;diff=446</id>
		<title>Examen 07/09/2021</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Examen_07/09/2021&amp;diff=446"/>
		<updated>2021-11-17T22:18:44Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Página creada con «&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;  -- Informática (1º del Grado en Matemáticas) -- 2ª convocatoria  -- ===================================================================== -- No…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- Informática (1º del Grado en Matemáticas)&lt;br /&gt;
-- 2ª convocatoria&lt;br /&gt;
&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
-- Nombre: &lt;br /&gt;
-- Apellidos: &lt;br /&gt;
-- UVUS:&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías                                           --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Data.Matrix&lt;br /&gt;
import qualified Data.Set as S&lt;br /&gt;
import qualified Data.Vector as V&lt;br /&gt;
import Data.List&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import I1M.Cola&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio ?. Una permutación de n se representa como una lista de los&lt;br /&gt;
-- elementos 1..n. Por ejemplo, la lista [3,1,2,4] representa la&lt;br /&gt;
-- permutación tal que corresponde con la transformación:&lt;br /&gt;
--      1 -&amp;gt; 3&lt;br /&gt;
--      2 -&amp;gt; 1&lt;br /&gt;
--      3 -&amp;gt; 2&lt;br /&gt;
--      4 -&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   compPermutaciones :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (compPermutaciones p q) es composición de las permutaciones p&lt;br /&gt;
-- y q. Por ejemplo, si p = [1,3,4,2] y q = [3,1,2,4], la composición&lt;br /&gt;
-- es:&lt;br /&gt;
--     1 -&amp;gt; 1 -&amp;gt; 3&lt;br /&gt;
--     2 -&amp;gt; 3 -&amp;gt; 2&lt;br /&gt;
--     3 -&amp;gt; 4 -&amp;gt; 4&lt;br /&gt;
--     4 -&amp;gt; 2 -&amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
--   compPermutaciones [1,3,4,2] [3,1,2,4] == [3,2,4,1]&lt;br /&gt;
&lt;br /&gt;
compPermutaciones :: [Int] -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
compPermutaciones p q = &lt;br /&gt;
    map snd (comp (zip [1..n] p) (zip [1..n] q))&lt;br /&gt;
        where n = length p&lt;br /&gt;
              comp r s = [(x,z) | (x,y) &amp;lt;- r, (y&amp;#039;,z) &amp;lt;-s, y == y&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio ?. Se tienen n cartas numeradas en un único montón en orden&lt;br /&gt;
-- creciente desde arriba hacia abajo; es decir, la carta de más arriba&lt;br /&gt;
-- es la número 1, luego sigue la número 2, ...&lt;br /&gt;
-- &lt;br /&gt;
-- Se hace lo siguiente: &lt;br /&gt;
-- + se coloca la carta número 1 debajo de todas, &lt;br /&gt;
-- + se quita de arriba la carta número 2, &lt;br /&gt;
-- + se coloca la carta número 3 debajo de todas, &lt;br /&gt;
-- + se quita de arriba la carta número 4, &lt;br /&gt;
-- + ...  &lt;br /&gt;
-- &lt;br /&gt;
-- El proceso continúa siempre de la misma manera: se coloca la carta de&lt;br /&gt;
-- más arriba debajo de todas y se quita la que ha quedado arriba, hasta&lt;br /&gt;
-- que quede una única carta.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    cartaFinal :: Int -&amp;gt; Int&lt;br /&gt;
-- tal que (cartaFinal n) es la carta final que queda en el montón. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    cartaFinal 4   == 1&lt;br /&gt;
--    cartaFinal 7   == 7&lt;br /&gt;
--    cartaFinal 10  == 5&lt;br /&gt;
--    cartaFinal 20  == 9&lt;br /&gt;
--    cartaFinal 100 == 73&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Usando listas:&lt;br /&gt;
&lt;br /&gt;
cartaFinal :: Int -&amp;gt; Int&lt;br /&gt;
cartaFinal n = head (until pred paso [1..n])&lt;br /&gt;
  where paso (x:xs) = tail (xs++[x])&lt;br /&gt;
        pred (x:xs) = null xs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Usando colas:&lt;br /&gt;
&lt;br /&gt;
cartaFinalC :: Int -&amp;gt; Int&lt;br /&gt;
cartaFinalC n = primero (until pred paso cInicial)&lt;br /&gt;
  where cInicial = foldr inserta vacia [n,n-1..1]&lt;br /&gt;
        pred c = not (esVacia c) &amp;amp;&amp;amp; esVacia (resto c)&lt;br /&gt;
        paso c = resto (inserta (primero c) (resto c))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio ?. Dada una matriz A, de dimensión n×n , sea X_i el&lt;br /&gt;
-- conjunto de elementos de la fila i, e Y_j el conjunto de elementos de&lt;br /&gt;
-- la columna j, 1 ≤ i, j ≤ n. Decimos que A es dorada si&lt;br /&gt;
-- X_1,...,X_n,Y_1,...,Y_n son conjuntos distintos.&lt;br /&gt;
&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     esMatrizDorada :: Ord a =&amp;gt; Matrix a -&amp;gt; Bool&lt;br /&gt;
-- tal que (esMatrizDorada A) verifique si A es dorada. Por ejemplo,&lt;br /&gt;
--     esMatrizDorada (fromLists [[1,2,1],[1,1,1],[2,2,2]]) == False&lt;br /&gt;
--     esMatrizDorada (fromLists [[1,2,1],[1,1,1],[3,3,4]]) == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esMatrizDorada :: Ord a =&amp;gt; Matrix a -&amp;gt; Bool&lt;br /&gt;
esMatrizDorada p =  &lt;br /&gt;
  conjDistintosLista (filas p ++ columnas p)&lt;br /&gt;
  where n = nrows p&lt;br /&gt;
        filas p = [S.fromList (V.toList (getRow i p)) | i &amp;lt;-[1..n]]&lt;br /&gt;
        columnas p = [S.fromList (V.toList (getCol i p)) | i &amp;lt;-[1..n]]&lt;br /&gt;
&lt;br /&gt;
conjDistintosLista :: Ord a =&amp;gt; [S.Set a] -&amp;gt; Bool&lt;br /&gt;
conjDistintosLista []       = True&lt;br /&gt;
conjDistintosLista (xs:xss) = &lt;br /&gt;
  all (not . ((==) xs)) xss &amp;amp;&amp;amp; conjDistintosLista xss&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio ?. Consideremos el problema de construir los árboles&lt;br /&gt;
-- etiquetados en las hojas, a partir de una lista xs, de forma que el&lt;br /&gt;
-- borde del árbol consista en los elementos de esta lista. Por ejemplo,&lt;br /&gt;
-- si xs = [1,2,3], los árboles que se obtienen son los siguientes:&lt;br /&gt;
&lt;br /&gt;
--          .              .&lt;br /&gt;
--         / \            / \&lt;br /&gt;
--        1   .          .   3&lt;br /&gt;
--           / \        / \&lt;br /&gt;
--          2   3      1   2&lt;br /&gt;
&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     arboles:: [Int] -&amp;gt; [Arbol]&lt;br /&gt;
-- tal que (arboles xs) es la lista de los árboles que se pueden&lt;br /&gt;
-- construir de forma que los elementos que constituyen su borde es la&lt;br /&gt;
-- lista xs. Por ejemplo,&lt;br /&gt;
--      arboles [1..3] = [Nodo (Hoja 1) (Nodo (Hoja 2) (Hoja 3)),&lt;br /&gt;
--                        Nodo (Nodo (Hoja 1) (Hoja 2)) (Hoja 3)]&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol = Hoja Int | Nodo Arbol Arbol &lt;br /&gt;
             deriving Show&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Definimos la función arboles, de forma recursiva&lt;br /&gt;
&lt;br /&gt;
arboles:: [Int] -&amp;gt; [Arbol]&lt;br /&gt;
arboles [x] = [Hoja x]&lt;br /&gt;
arboles (x:xs) = concatMap (prefijos x) (arboles xs)&lt;br /&gt;
&lt;br /&gt;
-- (prefijos x a) es la lista de todas las formas en la que x puede ser&lt;br /&gt;
-- insertada como la hoja más a la izquierda en el árbol a. Por ejemplo,&lt;br /&gt;
-- si el árbol es &lt;br /&gt;
--      .&lt;br /&gt;
--     / \&lt;br /&gt;
--    2   3&lt;br /&gt;
--&lt;br /&gt;
-- hay dos formas de insertar 1 de forma que sea la hoja más a la&lt;br /&gt;
-- izquierda:&lt;br /&gt;
&lt;br /&gt;
--          .              .&lt;br /&gt;
--         / \            / \&lt;br /&gt;
--        1   .          .   3&lt;br /&gt;
--           / \        / \&lt;br /&gt;
--          2   3      1   2&lt;br /&gt;
&lt;br /&gt;
prefijos:: Int -&amp;gt; Arbol -&amp;gt; [Arbol]&lt;br /&gt;
prefijos x a@(Hoja y) = [Nodo (Hoja x) a]&lt;br /&gt;
prefijos x a@(Nodo i d) = &lt;br /&gt;
    (Nodo (Hoja x) a):[Nodo i&amp;#039; d | i&amp;#039; &amp;lt;- prefijos x i]&lt;br /&gt;
&lt;br /&gt;
-- prefijos 1 (Nodo (Hoja 2) (Hoja 3))&lt;br /&gt;
-- [Nodo (Hoja 1) (Nodo (Hoja 2) (Hoja 3)),&lt;br /&gt;
--  Nodo (Nodo (Hoja 1) (Hoja 2)) (Hoja 3)]&lt;br /&gt;
&lt;br /&gt;
-- arboles [1..3]&lt;br /&gt;
-- [Nodo (Hoja 1) (Nodo (Hoja 2) (Hoja 3)),&lt;br /&gt;
--  Nodo (Nodo (Hoja 1) (Hoja 2)) (Hoja 3)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Examen_05/07/2021&amp;diff=445</id>
		<title>Examen 05/07/2021</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Examen_05/07/2021&amp;diff=445"/>
		<updated>2021-11-17T22:18:21Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Página creada con «&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;   import Data.List import Data.Maybe import Data.Numbers.Primes import Test.QuickCheck import I1M.PolOperaciones  -- -------------------------------…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import Data.List&lt;br /&gt;
import Data.Maybe&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
import I1M.PolOperaciones&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Dado un número entero n &amp;gt; 1, se puede transformar en una&lt;br /&gt;
-- lista como sigue:&lt;br /&gt;
-- + Se comienza con la lista xs formada por los divisores primos de n&lt;br /&gt;
--   ordenados de menor a mayor.&lt;br /&gt;
-- + A continuación, cada x elemento de xs se sustituye por la lista&lt;br /&gt;
--   vacía si x es igual a 2 o por su índice en la sucesión de los&lt;br /&gt;
--   números primos si x es distinto de 2. &lt;br /&gt;
-- La lista obtenida se llama la codificación de n. Por ejemplo, si n es&lt;br /&gt;
-- 3300 en el primer paso se obtiene la lista&lt;br /&gt;
--    [2,2,3,5,5,11]&lt;br /&gt;
-- y en el segundo,&lt;br /&gt;
--    [[],[],[1],[2],[2],[4]]&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    codificacion   :: Int -&amp;gt; [[Int]]&lt;br /&gt;
--    decodificacion :: [[Int]] -&amp;gt; Int&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (codificacion n) es la codificación del número n. Por ejemplo,&lt;br /&gt;
--      codificacion 3300  ==  [[],[],[1],[2],[2],[4]]&lt;br /&gt;
--      codificacion 12    ==  [[],[],[1]]&lt;br /&gt;
--      codificacion 324   ==  [[],[],[1],[1],[1],[1]]&lt;br /&gt;
--      codificacion 525   ==  [[1],[2],[2],[3]]&lt;br /&gt;
-- + (decodificacion xss) es el número n tal que su codificación es&lt;br /&gt;
--   xss. Por ejemplo,&lt;br /&gt;
--      decodificacion [[],[],[1],[2],[2],[4]] ==  3300&lt;br /&gt;
--      decodificacion [[],[],[1]]             ==  12&lt;br /&gt;
--      decodificacion [[],[],[1],[1],[1],[1]] ==  324&lt;br /&gt;
--      decodificacion [[1],[2],[2],[3]]       ==  525&lt;br /&gt;
--&lt;br /&gt;
-- Comprobar con QuickChek para todo número entero n &amp;gt; 1, si decodifica&lt;br /&gt;
-- la codificación de n se obtiene el número n.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
codificacion :: Int -&amp;gt; [[Int]]&lt;br /&gt;
codificacion n = map f (primeFactors n)&lt;br /&gt;
  where f p | p == 2    = []&lt;br /&gt;
            | otherwise = [indicePrimo p]&lt;br /&gt;
&lt;br /&gt;
-- (indicePrimo p) es la posición de p en la sucesión de los números&lt;br /&gt;
-- primos. Por ejemplo,&lt;br /&gt;
--    indicePrimo 3 ==  1&lt;br /&gt;
--    indicePrimo 7 ==  3&lt;br /&gt;
indicePrimo :: Int -&amp;gt; Int&lt;br /&gt;
indicePrimo p = head [i | (i,q) &amp;lt;- zip [0..] primes, q == p]&lt;br /&gt;
&lt;br /&gt;
-- Se puede redefinir como sigue&lt;br /&gt;
indicePrimo2 :: Int -&amp;gt; Int&lt;br /&gt;
indicePrimo2 = fromJust . (`elemIndex` primes)&lt;br /&gt;
&lt;br /&gt;
decodificacion :: [[Int]] -&amp;gt; Int&lt;br /&gt;
decodificacion = product . map g&lt;br /&gt;
  where g []     = 2&lt;br /&gt;
        g (x:xs) = primes !! x&lt;br /&gt;
&lt;br /&gt;
-- La propieda es&lt;br /&gt;
propCodificacion :: Int -&amp;gt; Bool&lt;br /&gt;
propCodificacion n = decodificacion (codificacion m) == m&lt;br /&gt;
  where m = 2 + abs n&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    λ&amp;gt; quickCheck propCodificacion&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función&lt;br /&gt;
--    raicesApol :: (Num a, Eq a) =&amp;gt; [(a,Int)] -&amp;gt; Polinomio a&lt;br /&gt;
-- tal que (raicesApol xs) es el polinomio p tal que el xs s la lista de&lt;br /&gt;
-- los pares (x,m), donde x representa una raíz de p y m su&lt;br /&gt;
-- multiplicidad. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; raicesApol [(3,2)]&lt;br /&gt;
--    x^2 + -6*x + 9&lt;br /&gt;
--    λ&amp;gt; raicesApol [(2,3)]&lt;br /&gt;
--    x^3 + -6*x^2 + 12*x + -8&lt;br /&gt;
--    λ&amp;gt; raicesApol [(1,2),(2,1)]&lt;br /&gt;
--    x^3 + -4*x^2 + 5*x + -2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
raicesApol :: (Num a, Eq a) =&amp;gt; [(a,Int)] -&amp;gt; Polinomio a&lt;br /&gt;
raicesApol xs = foldr multPol polUnidad ps&lt;br /&gt;
  where ps = [potencia (consPol 1 1 (consPol 0 (-x) polCero)) m | (x,m) &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
-- (potencia p n) es a n-ésima potencia del polinomio p. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; p = consPol 3 2 (consPol 0 10 polCero)&lt;br /&gt;
--    λ&amp;gt; p&lt;br /&gt;
--    2*x^3 + 10&lt;br /&gt;
--    λ&amp;gt; potencia p 2&lt;br /&gt;
--    4*x^6 + 40*x^3 + 100&lt;br /&gt;
--    λ&amp;gt; potencia p 3&lt;br /&gt;
--    8*x^9 + 120*x^6 + 600*x^3 + 1000&lt;br /&gt;
potencia :: (Num a, Eq a) =&amp;gt; Polinomio a -&amp;gt; Int -&amp;gt; Polinomio a&lt;br /&gt;
potencia p 0 = polUnidad&lt;br /&gt;
potencia p n = multPol p (potencia p (n-1))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. El término&lt;br /&gt;
--    maximum (sum [3, y, product [2, z], 7]&lt;br /&gt;
-- se puede representar por&lt;br /&gt;
--    T &amp;quot;M&amp;quot; [T &amp;quot;S&amp;quot; [N 3, V &amp;#039;y&amp;#039;, T &amp;quot;P&amp;quot; [N 2, V &amp;#039;z&amp;#039;]], N 7&lt;br /&gt;
-- donde maximum se representa por &amp;quot;M&amp;quot;, sum por &amp;quot;S&amp;quot; y product por &amp;quot;P&amp;quot;.&lt;br /&gt;
-- Además, el valor del término anterior cuando y se interpreta por 5 y&lt;br /&gt;
-- z por 2 es 12.&lt;br /&gt;
--&lt;br /&gt;
-- En general, los términos aritméticos como los anteriores se pueden&lt;br /&gt;
-- definir por &lt;br /&gt;
--    data Termino = V Char&lt;br /&gt;
--                 | N Int&lt;br /&gt;
--                 | T String [Termino]&lt;br /&gt;
--      deriving Show&lt;br /&gt;
-- las interpretaciones de las variables son listas de pares, caracteres&lt;br /&gt;
-- y enteros&lt;br /&gt;
--    type InterpretacionVariables = [(Char, Int)]&lt;br /&gt;
-- las interpretaciones de las operaciones son listad de pares, cadenas&lt;br /&gt;
-- y funciones de listas de enteros en enteros&lt;br /&gt;
--    type InterpretacionOperaciones = [(String, ([Int] -&amp;gt; Int))]&lt;br /&gt;
-- y las interpretaciones son pares formados por interpretaciones de&lt;br /&gt;
-- variables y de operaciones&lt;br /&gt;
--    type Interpretacion = (InterpretacionVariables, InterpretacionOperaciones)&lt;br /&gt;
-- Por ejemplo, &lt;br /&gt;
--    ejInt1, ejInt2 :: Interpretacion&lt;br /&gt;
--    ejInt1 = ([(&amp;#039;x&amp;#039;,3),(&amp;#039;y&amp;#039;,5),(&amp;#039;z&amp;#039;,2)],&lt;br /&gt;
--              [(&amp;quot;S&amp;quot;, sum), (&amp;quot;P&amp;quot;, product), (&amp;quot;M&amp;quot;, maximum)])&lt;br /&gt;
--    ejInt2 = ([(&amp;#039;x&amp;#039;,1),(&amp;#039;y&amp;#039;,2),(&amp;#039;z&amp;#039;,3)],&lt;br /&gt;
--              [(&amp;quot;S&amp;quot;, sum), (&amp;quot;P&amp;quot;, product), (&amp;quot;M&amp;quot;, minimum)])&lt;br /&gt;
-- donde ejInt1 es la interpretación usada anteriormente.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valor :: Termino -&amp;gt; Interpretacion -&amp;gt; Int&lt;br /&gt;
-- tal que (valor t i) es el valor del término t en la interpretación&lt;br /&gt;
-- i. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; valor (T &amp;quot;M&amp;quot; [T &amp;quot;S&amp;quot; [N 3, V &amp;#039;y&amp;#039;, T &amp;quot;P&amp;quot; [N 2, V &amp;#039;z&amp;#039;]], N 7]) ejInt1&lt;br /&gt;
--    12&lt;br /&gt;
--    λ&amp;gt; valor (T &amp;quot;M&amp;quot; [T &amp;quot;S&amp;quot; [N 3, V &amp;#039;y&amp;#039;, T &amp;quot;P&amp;quot; [N 2, V &amp;#039;z&amp;#039;]], N 7]) ejInt2&lt;br /&gt;
--    7&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Termino = V Char&lt;br /&gt;
             | N Int&lt;br /&gt;
             | T String [Termino]&lt;br /&gt;
  deriving Show&lt;br /&gt;
&lt;br /&gt;
type InterpretacionVariables = [(Char, Int)]&lt;br /&gt;
&lt;br /&gt;
type InterpretacionOperaciones = [(String, ([Int] -&amp;gt; Int))]&lt;br /&gt;
&lt;br /&gt;
type Interpretacion = (InterpretacionVariables, InterpretacionOperaciones)&lt;br /&gt;
&lt;br /&gt;
ejInt1, ejInt2 :: Interpretacion&lt;br /&gt;
ejInt1 = ([(&amp;#039;x&amp;#039;,3),(&amp;#039;y&amp;#039;,5),(&amp;#039;z&amp;#039;,2)],&lt;br /&gt;
          [(&amp;quot;S&amp;quot;, sum), (&amp;quot;P&amp;quot;, product), (&amp;quot;M&amp;quot;, maximum)])&lt;br /&gt;
ejInt2 = ([(&amp;#039;x&amp;#039;,1),(&amp;#039;y&amp;#039;,2),(&amp;#039;z&amp;#039;,3)],&lt;br /&gt;
          [(&amp;quot;S&amp;quot;, sum), (&amp;quot;P&amp;quot;, product), (&amp;quot;M&amp;quot;, minimum)])&lt;br /&gt;
               &lt;br /&gt;
--    λ&amp;gt; valor (T &amp;quot;M&amp;quot; [T &amp;quot;S&amp;quot; [N 3, V &amp;#039;y&amp;#039;, T &amp;quot;P&amp;quot; [N 2, V &amp;#039;z&amp;#039;]], N 7]) ejInt1&lt;br /&gt;
--    12&lt;br /&gt;
--    λ&amp;gt; valor (T &amp;quot;M&amp;quot; [T &amp;quot;S&amp;quot; [N 3, V &amp;#039;y&amp;#039;, T &amp;quot;P&amp;quot; [N 2, V &amp;#039;z&amp;#039;]], N 7]) ejInt2&lt;br /&gt;
--    7&lt;br /&gt;
valor :: Termino -&amp;gt; Interpretacion -&amp;gt; Int&lt;br /&gt;
valor (V x) i    = busca x (fst i)&lt;br /&gt;
valor (N n) _    = n&lt;br /&gt;
valor (T o ts) i = (busca o (snd i)) [valor t i | t &amp;lt;- ts]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Auxiliar:&lt;br /&gt;
busca :: Eq a1 =&amp;gt; a1 -&amp;gt; [(a1, a2)] -&amp;gt; a2&lt;br /&gt;
busca z ps = head [v | (u,v) &amp;lt;- ps, z == u]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. Decimos que un número natural es creciente si sus&lt;br /&gt;
-- dígitos son distintos de cero y están ordenados de forma creciente;&lt;br /&gt;
-- es decir, cada uno es menor o igual que su siguiente. Por ejemplo,&lt;br /&gt;
-- 34468 es número creciente pero 34648 no lo es.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    crecientes :: Int -&amp;gt; Integer&lt;br /&gt;
-- tal que (crecientes n) es la cantidad de números crecientes con n&lt;br /&gt;
-- dígitos. Por ejemplo, &lt;br /&gt;
--    crecientes 1    ==  9&lt;br /&gt;
--    crecientes 2    ==  45&lt;br /&gt;
--    crecientes 3    ==  165&lt;br /&gt;
--    crecientes 7    ==  6435&lt;br /&gt;
--    crecientes 15   ==  490314&lt;br /&gt;
--    crecientes 30   ==  48903492&lt;br /&gt;
--    crecientes 100  ==  352025629371&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1ª solución&lt;br /&gt;
-- ===========&lt;br /&gt;
&lt;br /&gt;
crecientes1 :: Int -&amp;gt; Integer&lt;br /&gt;
crecientes1 = genericLength . sucCrecientes&lt;br /&gt;
&lt;br /&gt;
-- (sucCrecientes n) es la lista de las sucesiones crecientes con n&lt;br /&gt;
-- dígitos. Por ejemplo, &lt;br /&gt;
--    λ&amp;gt; sucCrecientes 2&lt;br /&gt;
--    [11,12,13,14,15,16,17,18,19,22,23,24,25,26,27,28,29,33,34,35,36,37,38,&lt;br /&gt;
--     39,44,45,46,47,48,49,55,56,57,58,59,66,67,68,69,77,78,79,88,89,99]&lt;br /&gt;
--    λ&amp;gt; take 10 (sucCrecientes 3)&lt;br /&gt;
--    [111,112,113,114,115,116,117,118,119,122]&lt;br /&gt;
--    λ&amp;gt; take 10 (sucCrecientes 4)&lt;br /&gt;
--    [1111,1112,1113,1114,1115,1116,1117,1118,1119,1122]&lt;br /&gt;
sucCrecientes :: Int -&amp;gt; [Int]&lt;br /&gt;
sucCrecientes n = filter esCreciente [10^(n-1)..10^n-1]&lt;br /&gt;
&lt;br /&gt;
-- (esCreciente n) se verifica si n es creciente. Por ejemplo,&lt;br /&gt;
--    esCreciente 3446 ==  True&lt;br /&gt;
--    esCreciente 3464 ==  False&lt;br /&gt;
esCreciente :: Int -&amp;gt; Bool&lt;br /&gt;
esCreciente n = sort ns == ns&lt;br /&gt;
  where ns = show n&lt;br /&gt;
&lt;br /&gt;
-- 2ª solución&lt;br /&gt;
-- ===========&lt;br /&gt;
&lt;br /&gt;
crecientes2 :: Int -&amp;gt; Integer&lt;br /&gt;
crecientes2 n = sum [crecientesDesde n k | k &amp;lt;- [1..9]]&lt;br /&gt;
&lt;br /&gt;
-- (crecientesDesde n k) es  la cantidad de números crecientes con&lt;br /&gt;
-- n dígitos cuyo primer dígito es k. Por ejemplo, &lt;br /&gt;
--    crecientesDesde 3 9 ==  1&lt;br /&gt;
--    crecientesDesde 3 8 ==  3&lt;br /&gt;
--    crecientesDesde 2 8 ==  2&lt;br /&gt;
--    crecientesDesde 3 8 ==  3&lt;br /&gt;
--    crecientesDesde 3 7 ==  6&lt;br /&gt;
crecientesDesde :: Int -&amp;gt; Int -&amp;gt; Integer&lt;br /&gt;
crecientesDesde 0 _ = 0&lt;br /&gt;
crecientesDesde 1 _ = 1&lt;br /&gt;
crecientesDesde n k = sum [crecientesDesde (n-1) j | j &amp;lt;- [k..9]]&lt;br /&gt;
&lt;br /&gt;
-- 3ª solución&lt;br /&gt;
-- ===========&lt;br /&gt;
&lt;br /&gt;
crecientes3 :: Int -&amp;gt; Integer&lt;br /&gt;
crecientes3 n = sum [p!(n,k) | k &amp;lt;- [1..9]]&lt;br /&gt;
  where p = matrizCrecientes3 n&lt;br /&gt;
&lt;br /&gt;
-- (matrizCrecientes3 n) es la matriz de n filas y 9 columnas p tal que&lt;br /&gt;
-- el valor en la posición (i,j) es cantidad de números crecientes3 con i&lt;br /&gt;
-- dígitos, cuyo primer dígito es j. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; matrizCrecientes3 1&lt;br /&gt;
--    ┌                   ┐&lt;br /&gt;
--    │ 1 1 1 1 1 1 1 1 1 │&lt;br /&gt;
--    └                   ┘&lt;br /&gt;
--    λ&amp;gt; matrizCrecientes3 2&lt;br /&gt;
--    ┌                   ┐&lt;br /&gt;
--    │ 1 1 1 1 1 1 1 1 1 │&lt;br /&gt;
--    │ 9 8 7 6 5 4 3 2 1 │&lt;br /&gt;
--    └                   ┘&lt;br /&gt;
--    λ&amp;gt; matrizCrecientes3 3&lt;br /&gt;
--    ┌                            ┐&lt;br /&gt;
--    │  1  1  1  1  1  1  1  1  1 │&lt;br /&gt;
--    │  9  8  7  6  5  4  3  2  1 │&lt;br /&gt;
--    │ 45 36 28 21 15 10  6  3  1 │&lt;br /&gt;
--    └                            ┘&lt;br /&gt;
--    λ&amp;gt; matrizCrecientes3 4&lt;br /&gt;
--    ┌                                     ┐&lt;br /&gt;
--    │   1   1   1   1   1   1   1   1   1 │&lt;br /&gt;
--    │   9   8   7   6   5   4   3   2   1 │&lt;br /&gt;
--    │  45  36  28  21  15  10   6   3   1 │&lt;br /&gt;
--    │ 165 120  84  56  35  20  10   4   1 │&lt;br /&gt;
--    └                                     ┘&lt;br /&gt;
matrizCrecientes3 :: Int -&amp;gt; Matrix Integer&lt;br /&gt;
matrizCrecientes3 n = p where&lt;br /&gt;
  p = matrix n 9 f&lt;br /&gt;
  f (1,_) = 1&lt;br /&gt;
  f (i,j) = sum [p!(i-1,k) | k &amp;lt;- [j..9]]&lt;br /&gt;
&lt;br /&gt;
-- 4ª solución&lt;br /&gt;
-- ===========&lt;br /&gt;
&lt;br /&gt;
crecientes :: Int -&amp;gt; Integer&lt;br /&gt;
crecientes n = sum [p!(n,k) | k &amp;lt;- [1..9]]&lt;br /&gt;
  where p = matrizCrecientes n&lt;br /&gt;
&lt;br /&gt;
-- (matrizCrecientes n) es la matriz de n filas y 9 columnas p tal que&lt;br /&gt;
-- el valor en la posición (i,j) es cantidad de números crecientes con i&lt;br /&gt;
-- dígitos, cuyo primer dígito es j. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; matrizCrecientes 1&lt;br /&gt;
--    ┌                   ┐&lt;br /&gt;
--    │ 1 1 1 1 1 1 1 1 1 │&lt;br /&gt;
--    └                   ┘&lt;br /&gt;
--    λ&amp;gt; matrizCrecientes 2&lt;br /&gt;
--    ┌                   ┐&lt;br /&gt;
--    │ 1 1 1 1 1 1 1 1 1 │&lt;br /&gt;
--    │ 9 8 7 6 5 4 3 2 1 │&lt;br /&gt;
--    └                   ┘&lt;br /&gt;
--    λ&amp;gt; matrizCrecientes 3&lt;br /&gt;
--    ┌                            ┐&lt;br /&gt;
--    │  1  1  1  1  1  1  1  1  1 │&lt;br /&gt;
--    │  9  8  7  6  5  4  3  2  1 │&lt;br /&gt;
--    │ 45 36 28 21 15 10  6  3  1 │&lt;br /&gt;
--    └                            ┘&lt;br /&gt;
--    λ&amp;gt; matrizCrecientes 4&lt;br /&gt;
--    ┌                                     ┐&lt;br /&gt;
--    │   1   1   1   1   1   1   1   1   1 │&lt;br /&gt;
--    │   9   8   7   6   5   4   3   2   1 │&lt;br /&gt;
--    │  45  36  28  21  15  10   6   3   1 │&lt;br /&gt;
--    │ 165 120  84  56  35  20  10   4   1 │&lt;br /&gt;
--    └                                     ┘&lt;br /&gt;
matrizCrecientes :: Int -&amp;gt; Matrix Integer&lt;br /&gt;
matrizCrecientes n = p where&lt;br /&gt;
  p = matrix n 9 f&lt;br /&gt;
  f (1,j) = 1&lt;br /&gt;
  f (i,9) = 1&lt;br /&gt;
  f (i,j) = p!(i,j+1) + p!(i-1,j)&lt;br /&gt;
&lt;br /&gt;
-- Comparación de eficiencia&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
-- La comparación es&lt;br /&gt;
--    λ&amp;gt; crecientes1 7&lt;br /&gt;
--    6435&lt;br /&gt;
--    (4.97 secs, 12,711,235,024 bytes)&lt;br /&gt;
--    λ&amp;gt; crecientes2 7&lt;br /&gt;
--    6435&lt;br /&gt;
--    (0.04 secs, 5,723,952 bytes)&lt;br /&gt;
--    λ&amp;gt; crecientes3 7&lt;br /&gt;
--    6435&lt;br /&gt;
--    (0.01 secs, 225,704 bytes)&lt;br /&gt;
--    λ&amp;gt; crecientes 7&lt;br /&gt;
--    6435&lt;br /&gt;
--    (0.01 secs, 125,400 bytes)&lt;br /&gt;
--&lt;br /&gt;
--    λ&amp;gt; crecientes2 17&lt;br /&gt;
--    1081575&lt;br /&gt;
--    (2.17 secs, 1,714,280,592 bytes)&lt;br /&gt;
--    λ&amp;gt; crecientes3 17&lt;br /&gt;
--    1081575&lt;br /&gt;
--    (0.01 secs, 429,152 bytes)&lt;br /&gt;
--    λ&amp;gt; crecientes 17&lt;br /&gt;
--    1081575&lt;br /&gt;
--    (0.01 secs, 173,024 bytes)&lt;br /&gt;
--&lt;br /&gt;
--    λ&amp;gt; crecientes3 (10^5)&lt;br /&gt;
--    248105172272950452504148938027057501&lt;br /&gt;
--    (3.51 secs, 2,288,167,424 bytes)&lt;br /&gt;
--    λ&amp;gt; crecientes (10^5)&lt;br /&gt;
--    248105172272950452504148938027057501&lt;br /&gt;
--    (1.02 secs, 441,295,880 bytes)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Calcular la cantidad de números crecientes con 123456&lt;br /&gt;
-- dígitos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    λ&amp;gt; crecientes4 123456&lt;br /&gt;
--    1338763082311070449095794652369476313&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Examen_21/06/21&amp;diff=444</id>
		<title>Examen 21/06/21</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Examen_21/06/21&amp;diff=444"/>
		<updated>2021-11-17T22:17:45Z</updated>

		<summary type="html">&lt;p&gt;Mdelamor: Protegió «Examen 21/06/21» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- Informática (1º del Grado en Matemáticas)&lt;br /&gt;
-- 4º examen de evaluación continua (21 de junio de 2021)       Grupos A, B y C&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
&lt;br /&gt;
-- Nombre:&lt;br /&gt;
--&lt;br /&gt;
-- Apellidos:&lt;br /&gt;
--&lt;br /&gt;
-- UVUS:&lt;br /&gt;
&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
&lt;br /&gt;
import qualified Data.Vector as V&lt;br /&gt;
import qualified Data.Array as A&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
-- Selecciona de estas dos librerías la que hayas utilizado en clase&lt;br /&gt;
import GrafoConMatrizDeAdyacencia&lt;br /&gt;
-- import I1M.Grafo&lt;br /&gt;
&lt;br /&gt;
import Data.List&lt;br /&gt;
&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Ejercicio 1. (2.5 ptos) El complemento de un número positivo N se calcula&lt;br /&gt;
-- por el siguiente rocedimiento:&lt;br /&gt;
--   Si N es mayor que 9, se toma cada dígito por su valor posicional y se&lt;br /&gt;
--   resta del mayor los otros dígitos. Por ejemplo, el complemento de 1448 es&lt;br /&gt;
--   1000 - 400 - 40 - 8 = 552. Cuando N es menor que 10, su complemento es N.&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--   cadena    :: Integer -&amp;gt; [Integer]&lt;br /&gt;
--   conCadena :: Int -&amp;gt; [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + &amp;#039;(cadena n)&amp;#039; es la cadena de primos a partir del número &amp;#039;n&amp;#039; tal que cada&lt;br /&gt;
--   uno es el complemento del anterior. Por ejemplo,&lt;br /&gt;
--      cadena 8         == []&lt;br /&gt;
--      cadena 7         == [7]&lt;br /&gt;
--      cadena 13        == [13,7]&lt;br /&gt;
--      cadena 643       == [643,557,443]&lt;br /&gt;
--      cadena 18127     == [18127,1873,127,73,67,53,47]&lt;br /&gt;
--      cadena 18181213  == [18181213,1818787,181213,18787,1213,787,613,587]&lt;br /&gt;
-- + &amp;#039;(conCadena n)&amp;#039; es la lista de números cuyas cadenas tienen &amp;#039;n&amp;#039;&lt;br /&gt;
--   elementos. Por ejemplo,&lt;br /&gt;
--      take 6 (conCadena 3)                == [23,31,61,67,103,307]&lt;br /&gt;
--      [head (conCadena n) | n &amp;lt;- [4..8]]  == [37,43,157,18127,181873]&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
complemento :: Integer -&amp;gt; Integer&lt;br /&gt;
complemento n =&lt;br /&gt;
  let c = 10^(length (show n)-1)&lt;br /&gt;
  in (div n c)*c - (mod n c)&lt;br /&gt;
&lt;br /&gt;
cadena :: Integer -&amp;gt; [Integer]&lt;br /&gt;
cadena n&lt;br /&gt;
  | n &amp;lt; 10 &amp;amp;&amp;amp; isPrime n = [n]&lt;br /&gt;
  | isPrime n = n : cadena (complemento n)&lt;br /&gt;
  | otherwise = []&lt;br /&gt;
&lt;br /&gt;
conCadena :: Int -&amp;gt; [Integer]&lt;br /&gt;
conCadena n =&lt;br /&gt;
  filter ((==n).length.cadena) primes&lt;br /&gt;
&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Ejercicio 2. (2.5 puntos) Un número es innombrable si es divisible por 7 o&lt;br /&gt;
-- alguno de sus dígitos es un 7. Un juego infantil consiste en contar&lt;br /&gt;
-- saltándose los números innombrables:&lt;br /&gt;
--   1 2 3 4 5 6 ( ) 8 9 10 11 12 13 ( ) 15 16 ( ) 18 ...&lt;br /&gt;
--&lt;br /&gt;
-- La sucesión de Cantor se obtiene llenando los huecos de la sucesión&lt;br /&gt;
-- anterior con la propia sucesión:&lt;br /&gt;
--   1 2 3 4 5 6 (1) 8 9 10 11 12 13 (2) 15 16 (3) 18 19 20 (4) 22 23&lt;br /&gt;
--   24 25 26 (5) (6) 29 30 31 32 33 34 (1) 36 (8) 38 39 40 41  (9) 43&lt;br /&gt;
--   44 45 46 (10) 48 (11) 50 51 52 53 54 55 (12) (13) 58 59 60 61 62&lt;br /&gt;
--   (2) 64 65 66 (15) 68 69 (16) (3) (18) (19) (20) (4) (22) (23) (24)&lt;br /&gt;
--   (25) 80 81 82 83 (26) 85 86 (5) 88 89 90 (6) 92 93 94 95 96 (29)&lt;br /&gt;
--   (30) 99 100&lt;br /&gt;
--&lt;br /&gt;
-- Definir la lista&lt;br /&gt;
--   sucCantor :: [Integer]&lt;br /&gt;
-- cuyo valor es la sucesión de Cantor. Por ejemplo,&lt;br /&gt;
--   take 100 sucCantor  ==&lt;br /&gt;
--     [1,2,3,4,5,6, 1 ,8,9,10,11,12,13, 2 ,15,16, 3 ,18,19,20, 4 ,22,23,&lt;br /&gt;
--      24,25,26, 5,6 ,29,30,31,32,33,34, 1 ,36, 8 ,38,39,40,41, 9 ,43,44,&lt;br /&gt;
--      45,46, 10 ,48, 11 ,50,51,52,53,54,55, 12,13 ,58,59,60,61,62, 2 ,64,&lt;br /&gt;
--      65,66, 15 ,68,69, 16,3,18,19,20,4,22,23,24,25, 80,81,82,83, 26 ,85,&lt;br /&gt;
--      86, 5 ,88,89,90, 6 ,92,93,94,95,96, 29,30 ,99,100]&lt;br /&gt;
--    sucCantor !! (5+10^6)  ==  544480&lt;br /&gt;
--    sucCantor !! (6+10^6)  ==  266086&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
&lt;br /&gt;
sucCantor :: [Integer]&lt;br /&gt;
sucCantor =&lt;br /&gt;
  mezclaCantor [1..] sucCantor&lt;br /&gt;
&lt;br /&gt;
mezclaCantor :: [Integer] -&amp;gt; [Integer] -&amp;gt; [Integer]&lt;br /&gt;
mezclaCantor (x:xs) ys =&lt;br /&gt;
  if x`mod`7 == 0 || elem &amp;#039;7&amp;#039; (show x)&lt;br /&gt;
  then (head ys) : mezclaCantor xs (tail ys)&lt;br /&gt;
  else x : mezclaCantor xs ys&lt;br /&gt;
&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Ejercicio 3. (2.5 ptos) Consideremos grafos en los que cada arista está&lt;br /&gt;
-- etiquetada con un valor que representa un color (en lugar de un peso). Un&lt;br /&gt;
-- camino alternado en este tipo de grafos es un camino que no pasa por dos&lt;br /&gt;
-- aristas consecutivas del mismo color.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   caminoAlternado :: (A.Ix v, Num p, Eq p) =&amp;gt; Grafo v p -&amp;gt; [v] -&amp;gt; Bool&lt;br /&gt;
-- tal que &amp;#039;(caminoAlternado g vs)&amp;#039; comprueba que la secuencia de nodos &amp;#039;vs&amp;#039;&lt;br /&gt;
-- del grafo &amp;#039;g&amp;#039;, forma un camino alternado en el grafo. Por ejemplo,&lt;br /&gt;
--   caminoAlternado grafo [1,2,4,3,5]  ==  True&lt;br /&gt;
--   caminoAlternado grafo [3,1,2,4,6]  ==  False&lt;br /&gt;
-- donde &amp;#039;grafo&amp;#039; es el grafo que se define a continuación (selecciona de las&lt;br /&gt;
-- siguientes definiciones de grafos la que hayas utilizado en clase):&lt;br /&gt;
&lt;br /&gt;
-- grafo :: Grafo Int Int      &lt;br /&gt;
-- grafo = creaGrafo ND (1,6) [(1,2,3),(1,3,1),(1,5,1),(3,5,2),&lt;br /&gt;
--                             (2,4,1),(2,6,2),(3,4,3),(4,6,1)]&lt;br /&gt;
&lt;br /&gt;
-- grafo :: Grafo Int Int&lt;br /&gt;
-- grafo = asignaPesos (creaGrafo ND (1,6) [(1,2),(1,3),(1,5),(3,5),&lt;br /&gt;
--                                          (2,4),(2,6),(3,4),(4,6)])&lt;br /&gt;
--                     [((1,2),3),((1,3),1),((1,5),1),((3,5),2),&lt;br /&gt;
--                      ((2,4),1),((2,6),2),((3,4),3),((4,6),1)]&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
caminoAlternado :: (A.Ix v, Num p, Eq p) =&amp;gt; Grafo v p -&amp;gt; [v] -&amp;gt; Bool&lt;br /&gt;
caminoAlternado g vs =&lt;br /&gt;
  let as = zip vs (tail vs)&lt;br /&gt;
  in (all (aristaEn g) as) &amp;amp;&amp;amp; -- vs es un camino en g&lt;br /&gt;
     (and [peso g a1 /= peso g a2 | (a1,a2) &amp;lt;- zip as (tail as)])&lt;br /&gt;
&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Ejercicio 4. (2.5 ptos) En una rejilla de 2xN cuadros de longitud se pueden&lt;br /&gt;
-- colocar de distintas formas piezas de 2 cuadros de longitud, en horizontal y&lt;br /&gt;
-- vertical, de forma que no quede espacio libre en la rejilla. Por ejemplo,&lt;br /&gt;
-- una rejilla de 2x12 cuadros de longitud se puede rellenar de la siguiente&lt;br /&gt;
-- forma: &lt;br /&gt;
--&lt;br /&gt;
--    ╔═══╦═╦═╦═╦═══╦═══╦═╦═══╗&lt;br /&gt;
--    ╠═══╣ ║ ║ ╠═══╬═══╣ ╠═══╣&lt;br /&gt;
--    ╚═══╩═╩═╩═╩═══╩═══╩═╩═══╝&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   rejillas2N :: Int -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que &amp;#039;(rejillas2N n m)&amp;#039; es el número de formas distintas de rellenar una&lt;br /&gt;
-- rejilla de &amp;#039;2xn&amp;#039; cuadros de longitud con piezas de 2 cuadros de longitud de&lt;br /&gt;
-- &amp;#039;m&amp;#039; colores distintos, calculado mediante la técnica de programación&lt;br /&gt;
-- dinámica. Tened en cuenta que no hay ninguna restricción acerca de cómo&lt;br /&gt;
-- colocar las piezas de distintos colores. Por ejemplo, &lt;br /&gt;
--   rejillas2N 2 2   ==  8&lt;br /&gt;
--   rejillas2N 2 3   ==  18&lt;br /&gt;
--   rejillas2N 3 2   ==  24&lt;br /&gt;
--   rejillas2N 3 3   ==  81&lt;br /&gt;
--   rejillas2N 20 5  ==  1043891906738281250&lt;br /&gt;
--   length (show (rejillas2N 100 7))   ==  106&lt;br /&gt;
--   length (show (rejillas2N 1000 9))  ==  1164&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- rejillas2N n m =&lt;br /&gt;
--   m * (rejillas2N (n-1) m) + m^2 * (rejillas2N (n-2) m)&lt;br /&gt;
&lt;br /&gt;
-- Versión recursiva&lt;br /&gt;
&lt;br /&gt;
rejillas2NR :: Int -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
rejillas2NR 0 m = 1&lt;br /&gt;
rejillas2NR 1 m = m&lt;br /&gt;
rejillas2NR n m =&lt;br /&gt;
  m * (rejillas2NR (n-1) m) + m^2 * (rejillas2NR (n-2) m)&lt;br /&gt;
&lt;br /&gt;
-- Versión usando programación dinámica&lt;br /&gt;
    &lt;br /&gt;
rejillas2N :: Int -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
rejillas2N n m =&lt;br /&gt;
  let v = V.generate (n+1) (\ i -&amp;gt; generaRejillas2N v m i)&lt;br /&gt;
  in v V.! n&lt;br /&gt;
&lt;br /&gt;
generaRejillas2N :: V.Vector Integer -&amp;gt; Integer -&amp;gt; Int -&amp;gt; Integer&lt;br /&gt;
generaRejillas2N v m 0 = 1&lt;br /&gt;
generaRejillas2N v m 1 = m&lt;br /&gt;
generaRejillas2N v m i =&lt;br /&gt;
  m * (v V.! (i-1)) + m^2 * (v V.! (i-2))&lt;br /&gt;
&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
</feed>